即使" HEAD"对于Git分支的名称来说,它绝对是一个糟糕的选择,它仍然是一个有效的分支名称。如果你碰巧有一个名为" HEAD"的分支,有没有办法如何明确地引用实际的HEAD
符号引用?
分支可以引用为refs/heads/HEAD
,但HEAD
本身呢?
仅使用HEAD
会导致refname 'HEAD' is ambiguous
错误,而<commit>
作为参数传递。{/ p>
答案 0 :(得分:3)
根据gitrevisions,如果HEAD
和refs/heads/HEAD
都存在,则所选修订版本为HEAD
(即,不是名为HEAD
的分支)。< / p>
这实际上是大多数情况的正确答案,但git checkout
更喜欢分支名称到修订版,因此git checkout HEAD
会解析为分支,而不是当前提交。
还有其他命令也选择了分支名称,例如,git branch -f HEAD newrev
或git branch -D HEAD
指的是分支,但这里没有真正的歧义空间:git branch
是显然将在分支上工作。
其他处理程序通常会将分支名称或修订说明符传递给git rev-parse
或git rev-list
,其行为与gitrevisions中记录的相同。
请注意,更现实的分支名称可能会出现类似情况。就在昨天,我创建了一个处理某些以太网项的分支,并将分支命名为e1000
...看起来像是缩写的SHA-1。名为facade
的分支遭受同样的命运。
答案 1 :(得分:2)
好消息是,随着Git 2.16(2018年第一季度),这个问题不再容易出现,因为“git branch
”和“git checkout -b
”现在被禁止创建名称为“HEAD”的分支。
commit 662a4c8见Kaartic Sivaraam (sivaraam
)(2017年11月14日)
请参阅commit a625b09(2017年11月14日)和commit bc1c9c0,commit 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/HEAD
,refs/tags/HEAD
,refs/heads/HEAD
等等,--quiet
会使“refname'HEAD'含糊不清”警告。
无论何时需要 ref ,您都应该能够使用HEAD
来引用当前已检出的“事物”,并使用refs/heads/HEAD
来引用名为{{HEAD
的分支。 1}}。如果你在Git中找到了一个 ref (不是分支)并且HEAD
不起作用的地方,那么你应该把它报告为bug。