来自git-rev-parse
的文档:
^,例如HEAD ^,v1.5.1 ^ 0
A suffix ^ to a revision parameter means the first parent of that commit object. ^<n> means the <n>th parent (i.e. <rev>^ is equivalent to <rev>^1). As a special rule, <rev>^0 means the commit itself and is used when <rev> is the object name of a tag object that refers to a commit object.
我知道git提交可以有多个父级,并且这种语法可以用来消除引用哪个父级的歧义,但是什么决定了哪个父级是“第一个父级”还是“第二个父级”?它只是基于在合并提交时检出了哪个提交?
例如,git checkout master; git merge feature
会导致master
成为父1,而git checkout feature; git merge master
会导致feature
成为父1吗?或者还有其他事情发生在这里吗?
答案 0 :(得分:3)
是否仅基于合并提交时检出的提交?
那是对的。您可以使用git show
或git cat-file -p HEAD
来查看提交的父级。
答案 1 :(得分:0)
请注意,提交的父母数量是有限的。
Git 2.24(2019年第四季度)通过修复与所述限制有关的错误来说明这一点。
请参见commit 59fa5f5的commit a678df1,René Scharfe (rscharfe
)(2019年9月15日)。
(由Junio C Hamano -- gitster
--在commit 773521d中合并,2019年10月7日)
sha1-name
:检查“N
”和“foo^N
”中的foo~N
是否溢出拒绝
int
和get_parent()
无法容纳的值,而不能容纳get_nth_ancestor()
。
这比可能返回随机对象要好。如果这个限制太严格了,那么我们可以切换到更大的数据类型,但是我们仍然必须检查溢出。
那是因为:
rev-parse:演示“ foo ^ N”和“ foo〜N”的N溢出
如果数字对于int而言太高,则可能会发生奇怪的事情,因为未定义带符号的溢出。
添加测试以表明这一点;rev-parse
“成功”将100000000000000000000000000000000
解释为等于0,至少在x64上使用GCC 9.2.1和Clang 8.0.1显然是假的。
所以:
什么决定哪个父母是“第一父母”或“第二父母”?
如果输入的数字太重要...您可能会以任何父母作为父母。
除非您使用的是Git 2.24或更高版本。