GIT:当有一个名为HEAD的分支时,如何明确地引用当前的HEAD?

时间:2015-01-22 08:49:37

标签: git branch

即使" HEAD"对于Git分支的名称来说,它绝对是一个糟糕的选择,它仍然是一个有效的分支名称。如果你碰巧有一个名为" HEAD"的分支,有没有办法如何明确地引用实际的HEAD符号引用?

分支可以引用为refs/heads/HEAD,但HEAD本身呢?

仅使用HEAD会导致refname 'HEAD' is ambiguous错误,而<commit>作为参数传递。{/ p>

3 个答案:

答案 0 :(得分:3)

根据gitrevisions,如果HEADrefs/heads/HEAD都存在,则所选修订版本为HEAD(即,不是名为HEAD的分支)。< / p>

这实际上是大多数情况的正确答案,但git checkout更喜欢分支名称到修订版,因此git checkout HEAD会解析为分支,而不是当前提交。

还有其他命令也选择了分支名称,例如,git branch -f HEAD newrevgit branch -D HEAD指的是分支,但这里没有真正的歧义空间:git branch显然将在分支上工作。

其他处理程序通常会将分支名称或修订说明符传递给git rev-parsegit rev-list,其行为与gitrevisions中记录的相同。

请注意,更现实的分支名称可能会出现类似情况。就在昨天,我创建了一个处理某些以太网项的分支,并将分支命名为e1000 ...看起来像是缩写的SHA-1。名为facade的分支遭受同样的命运。

答案 1 :(得分:2)

好消息是,随着Git 2.16(2018年第一季度),这个问题不再容易出现,因为“git branch”和“git checkout -b”现在被禁止创建名称为“HEAD”的分支

commit 662a4c8Kaartic Sivaraam (sivaraam)(2017年11月14日) 请参阅commit a625b09(2017年11月14日)和commit bc1c9c0commit 8280c4c(2017年10月13日)Junio C Hamano (gitster)Junio C Hamano -- gitster --于2017年11月28日commit 1616928合并)

  

branch:正确拒绝refs/heads/{-dash,HEAD}

     

strbuf_check_branch_ref()是许多代码路径的中心位置   查看建议的名称是否适合分支机构的名称   它旨在让我们比一般用于重新命名的check_refname_format()检查更严格,我们已经使用它来拒绝名称以“-”开头的分支。
  该函数获取strbuf和字符串“name”,如果名称不适合作为分支的名称,则返回非零值。
  当名称良好时,它会在返回之前将strbuf中建议名称的分支的完整引用名放置。{/ p>      

然而,事实证明,即使函数返回错误,一个调用者也会查看strbuf中的内容。
  即使函数返回错误,也要使函数填充strbuf   这样,当“-dash”作为名称时,“refs/heads/-dash”会在向strbuf返回错误时放在copy_or_rename_branch()中,这会注意到用户正在尝试用“git branch -m -- -dash dash”恢复到   将“-dash”重命名为“dash”。

     

在此期间,使用相同的机制同时拒绝“HEAD”作为分支名称。

答案 2 :(得分:1)

您可以在需要提交时使用$(git rev-parse --quiet HEAD)(或$(git symbolic-ref HEAD)如果您想知道HEAD“指向”的位置。)

根据git help rev-parse $GIT_DIR/<refname>优先于refs/HEADrefs/tags/HEADrefs/heads/HEAD等等,--quiet会使“refname'HEAD'含糊不清”警告。

无论何时需要 ref ,您都应该能够使用HEAD来引用当前已检出的“事物”,并使用refs/heads/HEAD来引用名为{{HEAD的分支。 1}}。如果你在Git中找到了一个 ref (不是分支)并且HEAD不起作用的地方,那么你应该把它报告为bug。