提交后我被提醒我处于一个独立的HEAD状态。
> git commit -m "Implemented Runrealfast algorithm"
[detached HEAD af46ac9] Implemented Runrealfast algorithm
2 files changed, 18 insertions(+), 1 deletion(-)
我忽略了分离的HEAD并回溯到几个提交点:
> git checkout 87e147e
> git stash -u
> git checkout ed157a3
沿途运行git stash -u
。
最终我尝试找到我之前提交的提交SHA
> git log --all | grep Runrealfast
(no output)
但是git log --all
没有显示它。
幸运的是,我的终端有完整的历史记录。我从终端的消息中识别出相关的SHA并运行:
> git checkout af46ac9
并且有问题的提交显示没有问题。
git log --all
如何错过提交点?是一个独立的HEAD也是一个悬挂的提交?
答案 0 :(得分:2)
来自Git docs:
<强> - 所有强>
假设
refs/
中的所有引用以及HEAD
在命令行中列为<commit>
。
您之前分离的HEAD的提交不是ref(松散地说,它没有名称),因此未列出。
请注意,如果你想回到那个提交,git reflog
可能比希望你通过终端考古找到它更方便!
答案 1 :(得分:2)
--all
可能会错过提交的原因有多种。这可能听起来很奇怪,但事情是--all
并不意味着所有提交。
相反,--all
表示“所有参考”。因此,您可以获得当前HEAD
提交的(简化)历史记录,以及每个分支,每个标记,每个远程跟踪分支,filter-branch
创建的每个备份引用,最近的存储,也许还有一些其他的可能性和结局。 (为什么“简化”?我会回过头来看。)
但你的承诺不是那些。你问:“分离的HEAD也是一个悬空提交吗?”答案是:否 ......但在你的情况下,有点像。
独立头只意味着你目前不在任何分支上。你可能正处于悬空状态。或者您可能正在进行一个或多个refs历史记录中的提交,但是通过签出远程分支引用名称,SHA ID,标记名称等而不是分支名称来实现。
但是当然如果你处于分离头状态并且你进行了新的提交,那么新的提交就会以一个悬空提交开始。
在这种情况下,查找提交的最可靠方法是查看HEAD
git reflog
或者,如果您希望输出看起来像git log
输出,
git log --reflog
这只能在创建悬挂提交的repo中计算(这可能是唯一一个具有提交的repo),在创建提交后的合理时间内(reflog最终到期),以及假设您没有明确地损坏提交日志(使用强制reflog过期的命令,或者通过弄乱.git/logs
目录)。
顺便说一下,当我说历史被“简化”时:有时候git log --all
会跳过提交,即使它在参考历史中是。这是因为git确定它可以解释每个ref的文件的当前状态而不包括违规提交。有关git的含义的详细说明,请参阅git log
文档;如果您想确保看到每个非悬空提交,则必须添加--full-history
以及--all