当git reflog失败时手动提取reflog

时间:2015-05-20 02:23:06

标签: git

我的.git repo的HEAD提交对象因机器崩溃而丢失:

$ git rev-parse HEAD
1f411c372caab4767638df0b47be5e2f576cb582

$ git reflog 
error: object file .git/objects/1f/411c372caab4767638df0b47be5e2f576cb582 is empty
fatal: loose object 1f411c372caab4767638df0b47be5e2f576cb582 (stored in .git/objects/1f/411c372caab4767638df0b47be5e2f576cb582) is corrupt

事实证明只有少数文件被破坏,但由于HEAD提交是其中之一,我无法找到前一次提交的哈希。

然而,我对reflog的理解是它保留了HEAD所有更改的历史记录,即使它们无法访问,所以我希望在.git中有一个位置,我可以在其中找到以前的哈希值,并且我&#39 ;惊讶的reflog失败了。

有没有办法手动转储reflog并可能很容易恢复?

如果我只放弃最后一次提交(或者甚至是最后几次提交),我真的不在乎,因为我的工作目录没问题。但是,自从我推到服务器以来,我不想失去所有过去4天。

如果我能找到合适的SHA,我只需使用

即可恢复
git checkout -B recovery

继续我的快乐方式。

谢谢!

P.S。是的,我可以将我的工作目录视为过去4天工作的简单压制,但如果可能的话,我更愿意捕获历史记录。

更新。仅供参考:我如何使用答案实际恢复:

tail .git/logs/HEAD
8030ad73461b75e3ce575d5896a9511f6036e45d 1f411c372caab4767638df0b47be5e2f576cb582 REDACTED 1432014000 -0700 commit: REDACTED

git branch -f recovery 8030ad73461b75e3ce575d5896a9511f6036e45d
echo "ref: refs/heads/recovery" > .git/HEAD

1 个答案:

答案 0 :(得分:1)

查看文件.git/logs/HEAD的底部,该文件会跟踪HEAD的所有更改。

(并在.git/logs/refs/heads/中的文件中跟踪分支更改。)