如何从意外的 git push -f 中恢复?

Xiè*_*léi 13 git file-recovery

我只是跑git push -f错了,因此覆盖了一个远程分支。

原来的:

(remote origin:)
    branch master -> commit aaaaaaa
    branch foo    -> commit bbbbbbb

(local)
    branch master -> commit ccccccc
    branch foo    -> commit ddddddd
Run Code Online (Sandbox Code Playgroud)

之后git push -f

(remote origin:)
    branch master -> commit ccccccc
    branch foo    -> commit ddddddd
Run Code Online (Sandbox Code Playgroud)

在我的本地存储库中,我正在处理master分支,因此我可以将分支恢复master到 commit aaaaaaa,因为我可以aaaaaaagit reflog. 但是,我无法提交,bbbbbbb因为我之前没有拉过git push -f.

git reflog在远程存储库中尝试过,但是在裸存储库中的 reflog 中没有任何用处。

如何将分支foo恢复到bbbbbbb远程存储库中的提交?

(PS我不知道的实际价值bbbbbbb。)

use*_*686 12

尝试这个:

  1. 通过 SSH 连接到远程。

  2. 备份整个远程存储库。

    tar cvzf project-backup.tgz /path/to/project.git
    
    Run Code Online (Sandbox Code Playgroud)
  3. 如果您至少知道 的前几个字符bbbbbbb,请使用git show bbbbbb和/或git log bbbbbb找出完整的提交哈希。(如果您只需要散列,git rev-parse bbbbbb也可以使用,但最好检查一下。)

    如果你不知道该值在所有的运行git fsck,你应该得到“晃来晃去提交”名单。使用git show <hash>和检查每个提交,git log <hash>直到找到正确的提交。

  4. 更新分支引用:

    echo aaaaaaaaaaaaaaa.... > refs/heads/master
    echo bbbbbbbbbbbbbbb.... > refs/heads/foo
    
    Run Code Online (Sandbox Code Playgroud)
  5. 使用git log mastergit log foo确保您恢复了正确的分支。