我知道我可以找到许多有关HEAD^
和HEAD~
之间的区别的问题
~
指定ancestors
^
指定parents
我的问题是关于parents
和ancestors
的含义的区别。对我来说,父母与祖先一样。
父母与祖先之间的逻辑区别是什么?
What's the difference between HEAD^ and HEAD~ in Git?没有回答我的问题,我的问题是关于这两个术语的逻辑含义。
答案 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的提交。
“祖先”递归地指提交的父母及其父母。