我正在学习相对提交引用并尝试理解课程中提供的以下git log --oneline --graph
输出。
在课程中它说,给定HEAD指向9ec05ca
提交,HEAD ^^^(意思是曾祖父母提交)是0c5975a
提交。但在我看来4c9749e
应该是伟大的祖父母,如果每个SHA都是它下面的直接后代。任何澄清都表示赞赏。
答案 0 :(得分:3)
setia _的答案仍然是最合适的,但你的问题是有意义的,因为git历史可以从两个不同的角度来考虑:要么你完全把它看作一个(数学)图,其中父母的顺序是应该是非重要的,或者您认为合并操作是将外部分支集成到公共主干(即您当前的分支,通常是#34; 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
所有提交都保留在各自的行中,但后者是深度优先搜索。由于git log
(git rev-list
)也会显示预先收集的修订集合,因此无论您是使用--graph
还是将其显示为平面列表,此顺序都是相同的(实际上,如果未指定,git log
默认使用反向时间顺序,使用--graph
时使用拓扑顺序。
正因为如此,你不能仅依靠第一行来决定选择哪一个父母。
这也会导致一些较旧的提交出现在新的提交之前,从Git开始时可能会非常混乱,并让你觉得你的工作已经消失(直到你想要执行的工作)搜索,然后检索它埋藏在历史的某个地方。)
答案 1 :(得分:2)
提交可以有多个父级。 ^ 1表示第一个父母。 ^ 2表示第二个父母并继续。只是^默认为^ 1,这是第一个父。
同样〜允许访问祖先的遍历。例如,如果你想要3代~3。如果你想在同一个分支中的第7个最后一次提交在遍历时偏向第一个父级。
任何合并都会有两个父母合并到分支成为第一个父母。从分支合并成为第二个父母。