检查Git标签导致“分离的HEAD状态”

时间:2011-04-07 13:51:18

标签: git deployment git-tag

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

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

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

git push --tags

当我尝试执行部署脚本并查看v2.0标记时,我收到此消息:

  

你处于'超级HEAD'状态。您可以环顾四周,进行实验性更改并提交它们,您可以放弃任何提交   你在这种状态下通过表演而不影响任何分支   另一个结账。如果要创建新分支以保留提交   你创建,你可以通过结帐使用-b来实现(现在或以后)   命令再次。示例:git checkout -b new_branch_name现在是HEAD   在

这是正常的吗?存储库处于不确定状态,因为如果我这样做:

git branch

我得到了这个输出:

* (no branch)
  master

很抱歉,如果这很明显,但我无法理解。

2 个答案:

答案 0 :(得分:409)

好的,首先几个术语略显过分简化。

git中,tag(与许多其他内容一样)就是所谓的treeish。这是一种指代项目历史中的一个点的方式。 Treeishes可以是标记,提交,日期说明符,序数说明符或许多其他内容。

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

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

现在解释。

执行branch时,您将切换到HEAD未指向的提交。 git checkout -b v2.0-fixes v2.0现在“已分离”,并未指向分支。如果您决定立即进行提交(如您所愿),则没有要更新的分支指针来跟踪此提交。切换回另一个提交将使您失去您所做的新提交。这就是消息告诉你的。

通常,你可以做的是说v2.0。这将在树木HEAD(在本例中为标记)指向的提交处创建一个新的分支指针,然后将您的v2.0-fixes转移到指向该指针。现在,如果您进行提交,则可以跟踪它们(使用v2.0分支),您可以像平常一样工作。如果您只想查看{{1}}代码,那么您所做的事情并没有“错误”。但是,如果您要在那里进行任何想要跟踪的更改,则需要一个分支。

你应该花些时间了解整个GAG的DAG模型。它非常简单,所有命令都非常清晰。

答案 1 :(得分:12)

是的,这很正常。这是因为您签出了一个没有头的提交。特别是(迟早)不是任何分支的负责人。

但该州通常没有问题。您可以从标签创建一个新分支,如果这让您感觉更安全:)