如何`git log --all`错过了一个提交点?

时间:2017-06-19 20:38:09

标签: git

提交后我被提醒我处于一个独立的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也是一个悬挂的提交?

2 个答案:

答案 0 :(得分:2)

来自Git docs

  

<强> - 所有

     

假设refs/中的所有引用以及HEAD在命令行中列为<commit>

您之前分离的HEAD的提交不是ref(松散地说,它没有名称),因此未列出。

请注意,如果你想回到那个提交,git reflog可能比希望你通过终端考古找到它更方便!

答案 1 :(得分:2)

--all可能会错过提交的原因有多种。这可能听起来很奇怪,但事情是--all并不意味着所有提交

相反,--all表示“所有参考”。因此,您可以获得当前HEAD提交的(简化)历史记录,以及每个分支,每个标记,每个远程跟踪分支,filter-branch创建的每个备份引用,最近的存储,也许还有一些其他的可能性和结局。 (为什么“简化”?我会回过头来看。)

但你的承诺不是那些。你问:“分离的HEAD也是一个悬空提交吗?”答案是: ......但在你的情况下,有点像。

独立头只意味着你目前不在任何分支上。你可能正处于悬空状态。或者您可能正在进行一个或多个refs历史记录中的提交,但是通过签出远程分支引用名称,SHA ID,标记名称等而不是分支名称来实现。

但是当然如果你处于分离头状态并且你进行了新的提交,那么新的提交就会以一个悬空提交开始。

在这种情况下,查找提交的最可靠方法是查看HEAD

的reflog
git reflog

或者,如果您希望输出看起来像git log输出,

git log --reflog

这只能在创建悬挂提交的repo中计算(这可能是唯一一个具有提交的repo),在创建提交后的合理时间内(reflog最终到期),以及假设您没有明确地损坏提交日志(使用强制reflog过期的命令,或者通过弄乱.git/logs目录)。

顺便说一下,当我说历史被“简化”时:有时候git log --all会跳过提交,即使它在参考历史中。这是因为git确定它可以解释每个ref的文件的当前状态而不包括违规提交。有关git的含义的详细说明,请参阅git log文档;如果您想确保看到每个非悬空提交,则必须添加--full-history以及--all