检查Git标签导致"分离的HEAD状态"

Khr*_*riz 161 git deployment git-tag

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

git tag -a v2.0 -m "Launching version 2.0"
Run Code Online (Sandbox Code Playgroud)

我已将此标记推送到远程存储库

git push --tags
Run Code Online (Sandbox Code Playgroud)

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

你处于"独立的HEAD"状态.您可以环顾四周,进行实验性更改并提交它们,并且您可以放弃在此状态下进行的任何提交,而不会通过执行另一次检出来影响任何分支.如果要创建新分支以保留您创建的提交,可以再次使用-b和checkout命令(现在或以后).示例:git checkout -b new_branch_name HEAD现在位于

这是正常的吗?存储库处于不确定状态,因为如果我这样做:

git branch
Run Code Online (Sandbox Code Playgroud)

我得到这个输出:

* (no branch)
  master
Run Code Online (Sandbox Code Playgroud)

对不起,如果这是显而易见的,但我无法理解.

Nou*_*him 417

好的,首先几个术语略显过分简化.

git,tag(像许多其他的东西)是所谓的树木.这是一种指代项目历史中的一个点的方式.Treeishes可以是标记,提交,日期说明符,序数说明符或许多其他内容.

现在a branch就像一个标签,但是可以移动.当您"在"分支上并进行提交时,分支将移动到您所做的新提交,指示它的当前位置.

HEAD是指向被认为是"当前"的分支的指针.通常在克隆存储库时,HEAD将指向master哪个将指向提交.然后git checkout experimental,当您执行类似操作时,将切换HEAD到指向experimental可能指向不同提交的分支.

现在解释.

执行a时git checkout v2.0,您将切换到a未指向的提交branch.现在HEAD是"分离的"而不指向分支.如果您决定立即进行提交(如您所愿),则没有要更新的分支指针来跟踪此提交.切换回另一个提交将使您失去您所做的新提交.这就是消息告诉你的.

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

你应该花一些时间来理解整个GAG的DAG模型.它非常简单,所有命令都非常清晰.

  • 很棒的答案,但我可以补充说:"切换回另一个提交会让你失去你所做的新提交." - 你仍然可以在`git reflog`中找到提交,这是一个很好的命令!除非垃圾收集发生,否则似乎"不可能"失去提交. (2认同)

Kin*_*nch 12

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

但这个州通常没有问题.你可以从标签创建一个新的分支,如果这让你觉得更安全:)