首页 > 解决方案 > git log --oneline --graph 输出的含义

问题描述

我正在学习相关的提交参考,并试图理解git log --oneline --graph课程中提供的以下输出。

git 图

在课程中,它说给定 HEAD 指向9ec05ca提交, HEAD^^^ (意思是曾祖父母提交)是0c5975a提交。但在我看来4c9749e,如果每个 SHA 都是其下一个 SHA 的直系后代,那么它应该是曾祖父母。任何澄清表示赞赏。

标签: gitgit-log

解决方案


setia_ 的答案仍然是最合适的,但是您的问题很有意义,因为可以从两个不同的角度考虑 git 历史:要么您完全将其视为(数学)图,其中父级的顺序应该是不重要的,或者您考虑合并操作作为将外部分支集成到公共主干(即您当前的分支,通常是“主”)中的操作。这也是由 做出的假设git merge

这很重要,不仅因为快速浏览呈指数增长的树会变得很痛苦,而且因为拥有一个包含成品并集成外部提交的分支“master”是许多工作流遵循的模型。

由于这两种观点都是有效的,因此它们--first-parent成为一个经常使用的选项,尽管不是主要命令也不是默认行为。

例如,使用简单浏览 Linux 内核主存储库(Git 最初是为其设计的)git log --graph可能需要一分钟才能显示某些内容,但git log --graph --first-parent会显示主分支并让您观察它主要由合并组成,偶尔直接提交。

必须记住的另一件事是,您可以要求按时间顺序使用--date-order或拓扑顺序显示您的提交--topo-order。让我们假设您有两个不同的分支,并在最终合并它们之前交替地提交一个或另一个。根据顺序,生成的图表将如下所示之一:

Chronological order                     Topological order

*   ec9a124 Merge branch 'B' into A     *   ec9a124 Merge branch 'B' into A
|\                                      |\
* | e5314f2 Ninth                       | * e3e2435 Eighth
| * e3e2435 Eighth                      | * af3bac5 Sixth
* | 308228b Seventh                     | * 3a2f0b9 Fourth
| * af3bac5 Sixth                       | * d901c9f Second
* | ab11578 Fifth                       * | e5314f2 Ninth
| * 3a2f0b9 Fourth                      * | 308228b Seventh
* | 344bd0f Third                       * | ab11578 Fifth
| * d901c9f Second                      * | 344bd0f Third
|/                                      |/
* 0f029bc First                         * 0f029bc First

所有提交都保留在各自的行上,但后者是深度优先搜索。并且由于git log(so does git rev-list) 显示预先收集的修订的集合,因此无论您是使用--graph它们还是将它们显示为平面列表,此顺序都是相同的(实际上,如果未指定,git log默认情况下使用反向时间顺序和拓扑顺序使用时--graph)。

因此,您不能简单地依靠第一行来决定选择哪个父级。

这也可能导致一些较旧的提交出现在新的提交之前,这在开始使用 Git 时可能会非常混乱,并给您一种您的工作已经消失的印象(直到您想到执行搜索,然后将其检索到掩埋历史上的某个地方)。


推荐阅读