git log的意思--onon --graph输出

时间:2018-05-20 00:39:51

标签: git git-log

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

git graph

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

2 个答案:

答案 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 loggit rev-list)也会显示预先收集的修订集合,因此无论您是使用--graph还是将其显示为平面列表,此顺序都是相同的(实际上,如果未指定,git log默认使用反向时间顺序,使用--graph时使用拓扑顺序。

正因为如此,你不能仅依靠第一行来决定选择哪一个父母。

这也会导致一些较旧的提交出现在新的提交之前,从Git开始时可能会非常混乱,并让你觉得你的工作已经消失(直到你想要执行的工作)搜索,然后检索它埋藏在历史的某个地方。)

答案 1 :(得分:2)

提交可以有多个父级。 ^ 1表示第一个父母。 ^ 2表示第二个父母并继续。只是^默认为^ 1,这是第一个父。

同样〜允许访问祖先的遍历。例如,如果你想要3代~3。如果你想在同一个分支中的第7个最后一次提交在遍历时偏向第一个父级。

任何合并都会有两个父母合并到分支成为第一个父母。从分支合并成为第二个父母。