我知道我可以找到几十个问题有关的区别 HEAD^和HEAD~
~ 指定 ancestors^ 指定 parents我的问题是关于意义的差异parents和ancestors。对我来说,父母和祖先是一样的。
父母与祖先之间的逻辑区别是什么?
Git中的HEAD ^和HEAD〜有什么区别?没有回答我的问题,我的问题是关于这两个术语的逻辑含义。
区别在于垂直和水平的问题。
在Git中,提交是链接列表的一种,每个提交都引用一个父提交或多个父提交。
访问父项或祖父母项的操作~如下:
~ 是提交的直接父项,~2(或~~)是祖父母这是垂直的一面,如果您查看日志,则使用~会使您深入了解提交。
现在,当您合并两个分支时,它将进行合并提交。根据定义,合并提交是将两个或多个分支合并在一起。因此,合并提交将有两个或更多的父母。
从合并提交中,如果要访问不同的父级,则可以使用^(实际上看起来像是两个分支的合并)。
因此,请考虑日志的这一部分:
* 39a2f899 (HEAD)
|\
| * e2e7d241 (BRANCH)
| * caf13dc1
| * 609a9715
|/
* 663e09ff
Run Code Online (Sandbox Code Playgroud)
如果要访问的父提交BRANCH,则可以执行BRANCH~或e2e7d241~,而这将给与caf13dc1。现在,如果您要访问的父项HEAD并执行HEAD~,它将给您663e09ff(分支开始前的提交)。
但是,如果您想访问合并分支的提交链,那就是^游戏中要出现的地方HEAD^2,说“ HEAD的第二父级”(而不是父级的父级)。
可以当然将它们组合起来,在同图中,HEAD^2~是父(~第二亲本的)(^2HEAD),这是caf13dc1
顺便说一下,每个提交至少有1个父对象,因此commit^始终与相同commit~。另一方面,如果提交具有单亲(不是合并提交),commit^2将返回错误。
总结起来,您可以使用来访问合并的不同父项,^而您可以使用来访问提交的几代~。
可以用一个更复杂的合并(一次合并的4个分支)说明如下:
----------> use ^ to go through the parents of the merge
|
| *-----. 6af2936d
| |\ \ \ \
| | | | | * 20d6fb23 BRANCH1
| | | | * | e589d446 BRANCH2
| | | | * | ec6088bd
| | | | |/
| | | * | 38dcecfa BRANCH3
| | | |/
| | * | 698c3daa BRANCH4
| | |/
| |/
| * 2d97958e
| |\
| | * 8989f1d3
| | * d907cb7a
| |/
| * af368002
V
use ~ to go this way (through the ancestors)
Run Code Online (Sandbox Code Playgroud)