检出 Git 标记导致“分离的 HEAD 状态”

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

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

我已经把这个标签放到了远程存储库中

git push --tags

当我试图执行部署脚本并检查 v2.0标记时,我得到了以下消息:

你处于“分离头部”状态。您可以环顾四周,进行实验性的更改并提交它们,并且可以放弃任何提交 在此状态下执行,而不会影响任何分支 如果你想创建一个新的分支来保留提交 您可以(现在或以后)通过在签出时使用-b 来创建 示例: git checkout-b new _ Branch _ name HEAD 现在是 在

这正常吗? 仓库处于不确定状态,因为如果我这么做:

git branch

我得到这个输出:

* (no branch)
master

对不起,如果这是显而易见的,但我不能理解它。

129978 次浏览

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

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

好吧,首先有几个术语有点过于简单化了。

git中,tag(像许多其他东西一样)就是所谓的 。这是一种指代该项目历史中某一点的方式。树可以是标记、提交、日期说明符、序数说明符或许多其他东西。

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

您的 HEAD是指向一个被认为是“当前”的分支的指针。通常,当您克隆一个存储库时,HEAD将指向 master,而 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代码。然而,如果您想要对那里进行任何您想要跟踪的修改,那么您将需要一个分支。

您应该花一些时间来理解 git 的整个 DAG 模型。它出人意料的简单,并使所有的命令相当清楚。