如何分配git父数字?

时间:2014-03-24 14:59:48

标签: git

来自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吗?或者还有其他事情发生在这里吗?

2 个答案:

答案 0 :(得分:3)

  

是否仅基于合并提交时检出的提交?

那是对的。您可以使用git showgit cat-file -p HEAD来查看提交的父级。

答案 1 :(得分:0)

请注意,提交的父母数量是有限的。

Git 2.24(2019年第四季度)通过修复与所述限制有关的错误来说明这一点。

请参见commit 59fa5f5commit a678df1René Scharfe (rscharfe)(2019年9月15日)。
(由Junio C Hamano -- gitster --commit 773521d中合并,2019年10月7日)

  

sha1-name:检查“ N”和“ foo^N”中的foo~N是否溢出

     

拒绝intget_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或更高版本。