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 log
(git rev-list
也是如此)显示了 pre-gathered 修订的集合,因此无论您使用 --graph
还是将它们显示为平面列表,此顺序都是相同的(实际上,如果不指定,git log
默认使用逆时间顺序,使用--graph
时拓扑1)。
因此,您不能简单地依靠第一行来决定选择哪个 parent。
这也会导致一些旧的提交出现在新的之前,这在以 Git 开头时会非常混乱,并且给你的印象是你的工作已经消失了(直到它出现在一个人的脑海中)执行搜索,然后检索埋藏在历史某处的它。
我正在学习相对提交引用并试图理解课程中提供的以下 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 log
(git rev-list
也是如此)显示了 pre-gathered 修订的集合,因此无论您使用 --graph
还是将它们显示为平面列表,此顺序都是相同的(实际上,如果不指定,git log
默认使用逆时间顺序,使用--graph
时拓扑1)。
因此,您不能简单地依靠第一行来决定选择哪个 parent。
这也会导致一些旧的提交出现在新的之前,这在以 Git 开头时会非常混乱,并且给你的印象是你的工作已经消失了(直到它出现在一个人的脑海中)执行搜索,然后检索埋藏在历史某处的它。