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

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

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

我把这个标签推送到远程仓库

 git push --tags 

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

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

这是正常的吗? 存储库是在limbo,因为如果我这样做:

 git branch 

我得到这个输出:

 * (no branch) master 

对不起,如果这是显而易见的,但我不明白。

好的,首先几个条款稍微简化了一下。

git ,一个tag (就像很多其他的东西一样)就是所谓的树木 。 这是指在项目历史上的一个点。 树可以是一个标签,提交,date说明符,序数说明符或许多其他的东西。

现在一个branch就像一个标签,但可移动。 当你在一个分支上“进行”并提交时,分支会移到你提交的新提交中,表明它是当前位置。

你的HEAD指向一个被认为是“当前”的分支。 通常当你克隆一个仓库时, HEAD将指向master ,然后指向一个提交。 当你做一些类似git checkout experimental ,你可以将HEAD切换到可能指向不同提交的experimental分支。

现在的解释。

当你做一个git checkout v2.0 ,你正在切换到一个没有被branch指向的提交。 HEAD现在“分离”而不是指向分支。 如果你现在决定做一个提交(就像你可能),没有分支指针要更新来跟踪这个提交。 切换回另一个提交会让你失去你所做的这个新的提交。 这就是信息告诉你的。

通常,你可以做的就是说git checkout -b v2.0-fixes v2.0 。 这将在treeish v2.0指向的提交(在这种情况下是一个标记)创build一个新的分支指针,然后转移你的HEAD指向那个指针。 现在,如果你提交了,可以跟踪它们(使用v2.0-fixes分支),你可以像平常一样工作。 如果你只是想看一下v2.0代码,那么你所做的就没有什么“错误”了。 但是,如果您想在其中进行任何要跟踪的更改,则需要一个分支。

你应该花一些时间来理解GIT的整个DAG模型。 这是令人惊讶的简单,使所有的命令很清楚。

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

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