git - git log --oneline --graph 输出的含义
问题描述
我正在学习相关的提交参考,并试图理解git log --oneline --graph
课程中提供的以下输出。
在课程中,它说给定 HEAD 指向9ec05ca
提交, HEAD^^^ (意思是曾祖父母提交)是0c5975a
提交。但在我看来4c9749e
,如果每个 SHA 都是其下一个 SHA 的直系后代,那么它应该是曾祖父母。任何澄清表示赞赏。
解决方案
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 时可能会非常混乱,并给您一种您的工作已经消失的印象(直到您想到执行搜索,然后将其检索到掩埋历史上的某个地方)。