git父母和祖先之间的逻辑区别是什么

Mel*_*ius 3 git

我知道我可以找到几十个问题有关的区别 HEAD^HEAD~

  • ~ 指定 ancestors
  • ^ 指定 parents

我的问题是关于意义的差异parentsancestors。对我来说,父母和祖先是一样的。

父母与祖先之间的逻辑区别是什么?

Git中的HEAD ^和HEAD〜有什么区别?没有回答我的问题,我的问题是关于这两个术语的逻辑含义。

pad*_*win 5

区别在于垂直和水平的问题。

在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)