【发布时间】:2014-11-11 22:23:26
【问题描述】:
我之前遇到了一个不寻常的 git 问题,后来我已经解决了,但我仍然很好奇它为什么会发生。
当我不小心删除了我当前正在处理的分支时,出现了问题。通常 git 不会允许这样做,但由于 OSX 不区分大小写,我陷入了一种情况,我认为我有两个分支,一个名为 feature/ONE,另一个名为 feature/one。认为这是两个独立的分支(来自主要是 linux/区分大小写的背景),并且我正在研究功能/一个,我尝试使用 git branch -D 删除功能/一个。
我很快注意到我做了什么,试图从git reflog 找回我丢失的工作,这给了我错误fatal: bad default revision 'HEAD'。我尝试使用git checkout -f develop 恢复正常状态,这很有效。然而,不幸的是,当我在这之后查看git reflog 时,它只有一个条目说明checkout: moving from feature/ONE to develop。日志中没有出现以前的操作。
我已经编写了一些步骤来复制这种场景(大概这仅适用于不区分大小写的文件系统):
mkdir test
cd test
git init
echo 'hi' > file1
git add file1
git commit -m 'test commit 1'
git checkout -b new-branch
echo 'test2' > file2
git add file2
git commit -m 'test commit 2'
git branch -D NEW-branch
git checkout -f master
git reflog
我已经能够通过检查git-fsck 找到我丢失的提交,但我的问题是:
为什么这一系列操作会破坏 reflog?即使分支被删除,reflog 不应该仍然知道 HEAD ref 的历史吗?
【问题讨论】:
-
+1 我希望所有问题都有一个像您一样的可重复示例。
-
我还没有一个令人满意的答案,但请注意
git reflog的输出中缺少的条目仍然存在,在.git/logs/HEAD中。我猜git reflog只打印从.git/logs/HEAD中以0000000000000000000000000000000000000000开始的最后一个条目的条目。 -
有意思,reflog除了简单的显示日志还得有一些逻辑呢……
-
我刚刚进行了一个简单的测试:我用其他一些 SHA 替换了
.git/logs/HEAD中所有(除了第一个)0000000000000000000000000000000000000000的出现。然后git reflog打印.git/logs/HEAD中的所有条目。正如我之前猜测的那样:git reflog仅从以“零 SHA”开始的第一个条目开始打印。我仍然需要对此进行研究,但我认为,每当您处于bad default revision 'HEAD'状态时,相应的 reflog 条目都会以“零 SHA”开头。如果你看到你所在的分支,你肯定会降落在bad default revision 'HEAD'领域...... -
在 linux 上,您似乎可以通过将
git branch -D NEW-branch替换为git update-ref -d refs/heads/new-branch来模拟行为
标签: macos git version-control git-reflog