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

时间:2019-04-10 07:29:50

标签: git

我知道我可以找到许多有关HEAD^HEAD~之间的区别的问题

  • ~指定ancestors
  • ^指定parents

我的问题是关于parentsancestors的含义的区别。对我来说,父母与祖先一样。

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

What's the difference between HEAD^ and HEAD~ in Git?没有回答我的问题,我的问题是关于这两个术语的逻辑含义。

2 个答案:

答案 0 :(得分:3)

区别是垂直和水平的问题。

在Git中,提交是链接列表的一种,每个提交都引用一个父提交或一个多个父提交

通过~访问父母或祖父母:

  • ~是提交的直接父项,
  • ~2(或~~)是祖父母
  • 依此类推

这是垂直的一面,如果您查看日志,则使用~会使您不满意提交。

现在,当您合并两个分支时,它将进行合并提交。根据定义,合并提交是将两个或多个分支合并在一起。因此,合并提交将有两个或更多的父母。

在合并提交中,如果要访问不同的父级,请使用^(实际上看起来像是两个分支的合并)。

因此请考虑日志的这一部分:

*   39a2f899 (HEAD)
|\  
| * e2e7d241 (BRANCH)
| * caf13dc1
| * 609a9715
|/  
*   663e09ff

如果要访问BRANCH的父提交,则可以执行BRANCH~e2e7d241~,这将得到caf13dc1。现在,如果您要访问HEAD的父级并执行HEAD~,它将为您提供663e09ff(分支开始之前的提交)。

但是,如果您想访问合并分支的提交链,那就是^出现在游戏中的位置,那么您就可以做HEAD^2,说“ HEAD的第二父级”(不是父母的父母)。

您当然可以将它们组合在一起,在同一张图中,HEAD^2~是HEAD的第二父级(~)的父级(^2),也就是{{1} }

偶然地,每个提交至少有1个父对象,因此caf13dc1始终与commit^相同。另一方面,如果提交只有一个父提交(不是合并提交),则commit~将返回错误。

总而言之,您使用commit^2访问合并的不同父级,并使用^访问生成的提交。

可以通过以下更复杂的合并来说明(一次合并4个分支):

~

答案 1 :(得分:2)

简而言之

“父母”仅指直接父母,即在给定提交的定义中明确说明其SHA-1的提交。

“祖先”递归地指提交的父母及其父母