git log --oneline --graph 输出的含义

Meaning of git log --oneline --graph output

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

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

Commit 可以有多个 parent。 ^ 1 表示第一个 parent。 ^2 表示第二个 parent 并继续。只是 ^ 默认为 ^1 这是第一个 parent.

同样 ~ 为祖先提供向上遍历的权限。例如,如果您想要 3 代以上 ~3。如果你想在同一个分支中第 7 个最后提交,在遍历时优先 parent。

任何合并都会有两个 parent,合并到分支成为第一个 parent。从分支合并成为第二个 parent.

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

所做的假设

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

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

例如,使用简单的 git log --graph 浏览 Linux 内核主存储库(Git 最初是为此设计的)可能需要一分钟才能显示某些内容,但是 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

所有提交都保留在各自的行上,但后者是 depth-first 搜索。由于 git loggit rev-list 也是如此)显示了 pre-gathered 修订的集合,因此无论您使用 --graph 还是将它们显示为平面列表,此顺序都是相同的(实际上,如果不指定,git log默认使用逆时间顺序,使用--graph时拓扑1)。

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

这也会导致一些旧的提交出现在新的之前,这在以 Git 开头时会非常混乱,并且给你的印象是你的工作已经消失了(直到它出现在一个人的脑海中)执行搜索,然后检索埋藏在历史某处的它。