我正在为我的git项目开发一个部署脚本,我刚开始使用标签。我添加了一个名为v2.0
的新标记:
git tag -a v2.0 -m "Launching version 2.0"
我已将此标记推送到远程存储库
git push --tags
当我尝试执行部署脚本并查看v2.0
标记时,我收到此消息:
你处于'超级HEAD'状态。您可以环顾四周,进行实验性更改并提交它们,您可以放弃任何提交 你在这种状态下通过表演而不影响任何分支 另一个结账。如果要创建新分支以保留提交 你创建,你可以通过结帐使用-b来实现(现在或以后) 命令再次。示例:git checkout -b new_branch_name现在是HEAD 在
这是正常的吗?存储库处于不确定状态,因为如果我这样做:
git branch
我得到了这个输出:
* (no branch)
master
很抱歉,如果这很明显,但我无法理解。
答案 0 :(得分:409)
好的,首先几个术语略显过分简化。
在git
中,tag
(与许多其他内容一样)就是所谓的treeish。这是一种指代项目历史中的一个点的方式。 Treeishes可以是标记,提交,日期说明符,序数说明符或许多其他内容。
现在branch
就像一个标签但可移动。当您“在”分支上并进行提交时,分支将移动到您所做的新提交,指示它的当前位置。
您的HEAD
是指向被视为“当前”的分支的指针。通常,当您克隆存储库时,HEAD
将指向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
分支),您可以像平常一样工作。如果您只想查看{{1}}代码,那么您所做的事情并没有“错误”。但是,如果您要在那里进行任何想要跟踪的更改,则需要一个分支。
你应该花些时间了解整个GAG的DAG模型。它非常简单,所有命令都非常清晰。
答案 1 :(得分:12)
是的,这很正常。这是因为您签出了一个没有头的提交。特别是(迟早)不是任何分支的负责人。
但该州通常没有问题。您可以从标签创建一个新分支,如果这让您感觉更安全:)