我正在学习相对提交引用并尝试理解以下内容git log --oneline --graph
课程中提供的输出。
在课程中它说给定的 HEAD 指向9ec05ca
提交,HEAD^^^(意思是曾祖父母提交)是0c5975a
犯罪。但在我看来4c9749e
如果每个 SHA 都是其下一个 SHA 的直系后代,则应该是曾祖父母。任何澄清表示赞赏。
setia_ 的答案仍然是最合适的,但你的问题是有意义的,因为 git 历史可以从两个不同的角度来考虑:要么你完全将它视为一个(数学)图,其中父级的顺序应该不重要,要么你考虑合并将外部分支集成到公共主干(即您当前的分支,通常是“主分支”)中的操作。这也是作者做出的假设git merge
.
这很重要,不仅因为快速浏览呈指数增长的树变得很痛苦,而且因为拥有包含成品并集成外部提交的分支“主”是许多工作流程遵循的模型。
由于这两种观点都有道理,因此--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
(也是如此git rev-list
)显示预先收集的修订版本的集合,无论您使用的是--graph
或将它们显示为平面列表(实际上,如果没有指定,git log
默认使用逆时间顺序,使用时按拓扑顺序--graph
).
因此,您不能简单地依赖第一行来决定选择哪个父级。
这也可能导致一些较旧的提交出现在新的提交之前,这在开始使用 Git 时可能会非常令人困惑,并给您留下您的工作已经消失的印象(直到有人想到执行搜索,然后将其检索埋藏)历史上的某个地方)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)