小编典典

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

all

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

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

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

git push --tags

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

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

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

git branch

我得到这个输出:

* (no branch)
  master

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


阅读 80

收藏
2022-08-05

共1个答案

小编典典

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

git中,a
tag(与许多其他事物一样)是所谓的treeish。这是一种引用项目历史中某一点的方式。Treeish
可以是标签、提交、日期说明符、序数说明符或许多其他东西。

现在 abranch就像一个标签,但可以移动。当您“打开”一个分支并进行提交时,该分支将移动到您所做的新提交,表明它是当前位置。

HEAD是指向被认为是“当前”的分支的指针。通常当你克隆一个存储库时,HEAD会指向master哪个又会指向一个提交。然后,当您执行类似git checkout experimental的操作时,将 to 切换HEADexperimental可能指向不同提交的分支。

现在解释。

当您执行 agit checkout v2.0时,您将切换到 a
未指向的提交branch。现在HEAD是“分离的”并且不指向分支。如果您决定现在提交(如您所愿),则没有可更新的分支指针来跟踪此提交。切换回另一个提交会让你失去你所做的这个新提交。这就是信息告诉你的。

通常,你能做的就是说git checkout -b v2.0-fixes v2.0。这将在 treeish
指向的提交处创建一个新的分支指针v2.0(在本例中为标记),然后将您HEAD的指向指向该位置。现在,如果您进行提交,就可以跟踪它们(使用v2.0-fixes分支)并且您可以像往常一样工作。您所做的一切都没有“错误”,特别是如果您只想查看v2.0代码。但是,如果您想在那里进行任何要跟踪的更改,则需要一个分支。

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

2022-08-05