签出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一个新的分支,如果这让你感觉更安全:)