签出Git标签会导致“ HEAD状态分离”


166

我正在为git项目开发部署脚本,而我刚刚开始使用标签。我添加了一个名为的新标签v2.0

git tag -a v2.0 -m "Launching version 2.0"

我已将此标签推送到远程存储库

git push --tags

当我尝试执行部署脚本并签出v2.0标签时,收到以下消息:

您处于“分离头”状态。您可以环顾四周,进行实验性更改并将其提交,并且可以放弃在此状态下所做的任何提交,而不会通过执行另一次签帐而影响任何分支。如果要创建新分支以保留创建的提交,则可以(现在或以后)通过再次将-b与checkout命令一起使用来进行。示例:git checkout -b new_branch_name HEAD现在位于

那是正常的吗?该存储库陷入困境,因为如果这样做:

git branch

我得到以下输出:

* (no branch)
  master

抱歉,如果这很明显,但我无法弄清楚。


当您说“执行部署脚本并签出v2.0”时,您的代码是否看起来像“ git checkout v2.0”?我试图修改发布脚本,当我从生产机器上运行“ git checkout v2.0”时,我得到了“错误:pathspec'v2.0'与git已知的任何文件都不匹配。” 即使我已经运行过,也要在生产中执行“ git checkout v2.0”之前,先在本地计算机上运行“ git push origin --tags”。在调用“ git checkout v2.0”之前,我还尝试在生产环境中运行“ git pull --tags”和“ git fetch --tags”,但这也不起作用……我仍然得到错误。有任何想法吗?
约翰·埃克

3
我本打算删除上述评论,但后来想想保留它可能对其他人有帮助。我收到错误消息是因为在运行时,我的标签名称中有一个TYPO,即“ git checkout v2.0”。但是,与错字相关的错误与您在运行“ git checkout v2.0”时遇到的错误完全相同,而在运行“ git fetch --tags”之前没有错字。因此,最终,我的问题通过在运行“ git checkout v2.0”之前运行“ git fetch --tags”而解决,而没有任何错字。!
约翰·埃克

很好,是的,您需要先获取--tags(或从远程提取所有内容的git fetch),以便git可以签出该标签。抱歉,我今天才看到您的评论。
Khriz

Answers:


429

好吧,最初的几个术语有些简单化了。

在中gittag(就像许多其他东西一样)是所谓的树状。这是引用项目历史中某个点的一种方式。树状可以是标签,提交,日期说明符,序数说明符或许多其他东西。

现在a branch就像标签一样,但是可以移动。当您“在”分支上并进行提交时,分支将移至您所做的新提交,指示其当前位置。

HEAD是指向被视为“当前”分支的指针。通常,当您克隆存储库时,HEAD将指向该存储库,而该存储库master又将指向一个提交。然后git checkout experimental,当您执行诸如之类的操作时,您将切换HEAD为指向experimental可能指向其他提交的分支。

现在解释。

当您执行a时git checkout v2.0,您将切换到a并未指向的提交branch。在HEAD现在“沾边”,而不是指向一个分支。如果您决定立即提交(可能),则没有分支指针可更新以跟踪此提交。切换回另一个提交将使您失去所做的新提交。这就是消息告诉您的内容。

通常,您能做的就是说git checkout -b v2.0-fixes v2.0。这将在树状结构v2.0(在这种情况下为标签)所指向的提交处创建一个新的分支指针,然后将您的指针指向该HEAD位置。现在,如果您进行提交,则可以(使用v2.0-fixes分支)跟踪它们,并且可以像平常一样工作。您所做的工作没有什么“错误”,特别是如果您只想看一下v2.0代码。但是,如果您要在此处进行任何更改,则需要一个分支。

您应该花一些时间来了解git的整个DAG模型。它非常简单,并且使所有命令都非常清晰。


好的,谢谢,我不需要对代码进行任何更改,因此我认为还可以。我不需要创建分支。非常感谢!
Khriz

1
第一次查看此答案时我迷路了,但是在阅读了Git分支文档之后:http : //git-scm.com/book/en/Git-Branching-What-a-Branch-是否更清楚了。
标记Stiles

3
很棒的答案,但我可以补充一下:“切换回另一个提交将使您失去所做的这个新提交。” —您仍然可以在中找到该提交git reflog,这是一个很棒的命令!除非发生垃圾回收,否则丢失提交似乎“不可能”。
德米特里·明科夫斯基2013年

垃圾回收操作可能会丢失未引用的提交。
Noufal Ibrahim 2013年

1
网址错误,因为它们更改了页面布局。
jcubic 2014年

12

是的,很正常。这是因为您签出没有头的单个提交。尤其是(早晚)不是任何分支机构的负责人。

但是这种状态通常没有问题。您可以从标记创建一个新分支,如果这样会使您感觉更安全:)


1
好吧,我会保持这种方式……无论如何安全性都过高了;)
Khriz

正如您在Noufals答案中评论的那样(它是更好的答案,我必须说;)):只要您不进行任何更改,就不必担心任何事情。但是,如果您假设可以更改某些内容,则可以简单地创建一个分支,因为它们在git中很便宜,您可以删除它(并在以后重新创建,依此类推)。
KingCrunch
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.