我正在为我的 git 项目开发一个部署脚本,我刚刚开始使用标签。我添加了一个名为的新标签v2.0:
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
抱歉,如果这很明显,但我无法弄清楚。
好的,首先有几个术语有点过于简单了。
在git中,a tag(与许多其他事物一样)是所谓的treeish。这是一种引用项目历史中某一点的方式。Treeish 可以是标签、提交、日期说明符、序数说明符或许多其他东西。
git
tag
现在 abranch就像一个标签,但可以移动。当您“打开”一个分支并进行提交时,该分支将移动到您所做的新提交,表明它是当前位置。
branch
您HEAD是指向被认为是“当前”的分支的指针。通常当你克隆一个存储库时,HEAD会指向master哪个又会指向一个提交。然后,当您执行类似git checkout experimental的操作时,将 to 切换HEAD到experimental可能指向不同提交的分支。
HEAD
master
git checkout experimental
experimental
现在解释。
当您执行 agit checkout v2.0时,您将切换到 a 未指向的提交branch。现在HEAD是“分离的”并且不指向分支。如果您决定现在提交(如您所愿),则没有可更新的分支指针来跟踪此提交。切换回另一个提交会让你失去你所做的这个新提交。这就是信息告诉你的。
git checkout v2.0
通常,你能做的就是说git checkout -b v2.0-fixes v2.0。这将在 treeish 指向的提交处创建一个新的分支指针v2.0(在本例中为标记),然后将您HEAD的指向指向该位置。现在,如果您进行提交,就可以跟踪它们(使用v2.0-fixes分支)并且您可以像往常一样工作。您所做的一切都没有“错误”,特别是如果您只想查看v2.0代码。但是,如果您想在那里进行任何要跟踪的更改,则需要一个分支。
git checkout -b v2.0-fixes v2.0
v2.0-fixes
您应该花一些时间了解 git 的整个 DAG 模型。它非常简单,并且使所有命令都非常清晰。