我正在为我的git项目开发一个部署脚本,并且我刚刚开始使用标签。我添加了一个名为v2.0
的新标记
git tag -a v2.0 -m "Launching version 2.0"
我已经将这个标记推送到远程存储库
git push --tags
当我尝试执行部署脚本并检查v2.0
标记时,我收到以下消息:
您正处于“分离的头”状态。您可以查看周围,进行实验性更改并提交它们,并且可以通过执行另一次签出来丢弃在此状态下所做的任何提交,而不会影响任何分支。如果您想创建一个新的分支来保留您创建的提交,您可以(现在或以后)通过使用-b和checkout命令来完成此操作。示例: git checkout -b new_branch_name HEAD现在位于
这正常吗?存储库处于不确定状态,因为如果我这样做:
git branch
我得到以下输出:
* (no branch)
master
很抱歉,如果这是显而易见的,但我不能理解它。
发布于 2011-04-07 22:01:55
好吧,首先有几个术语有点过于简单化了。
在git
中,tag
(和许多其他东西一样)就是所谓的treeish。这是一种引用项目历史上某个时间点的方式。树可以是一个标记、一个提交、一个日期说明符、一个序号说明符或许多其他东西。
现在,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
代码。但是,如果您想要在其中进行任何想要跟踪的更改,您将需要一个分支。
你应该花点时间理解整个git的DAG模型。它出人意料地简单,并且使所有的命令都非常清晰。
发布于 2011-04-07 21:56:11
是的,这是正常的。这是因为您签出了一个没有头部的单一提交。特别是它(迟早)不是任何分支的负责人。
但是这种状态通常是没有问题的。你可以从标签中创建一个新的分支,如果这让你觉得更安全的话:)
https://stackoverflow.com/questions/5582208
复制相似问题