Git checkout tag导致“当前不在任何分支上”

3

我遇到了一个与标签检查有关的非常奇怪的问题。从develop分支合并最新更改到主分支后,我从主分支创建了一个标签并将其推送到远程。然后,在生产环境中成功拉取标签的代码,但是当我检出标签并运行git status时,我得到了如下信息:

目前没有任何分支

在我的本地计算机上,git status正常显示头指针已经转移到了特定的标签,例如1.0.0。

git branch -v
* (no branch) ca992e2 Example commit message
develop     e945a50 Example commit message
master      ca992e2 Example commit message

有什么技巧吗?
2个回答

8
这是一种“正常”的行为。当你在标签上进行检出时,你的本地仓库的 HEAD 会定位到该标签。你不再处于分支上。如果你不打算做任何更改,这并不重要。
如果你需要进行更改,我看有两个选项:
1. 你想继续在创建标签时所在的分支上工作。那么你应该检出到该分支。 2. 你需要基于你创建的标签执行修复操作,但该修复操作不能在你最初用来创建标签的分支上进行。那么你需要从该标签创建一个新分支。命令如下:
git checkout -b new-branch tag

谢谢您的解释,我明白了,但我仍在努力弄清楚为什么在一台机器上git status显示“当前未在任何分支上”,而在另一台机器上相同的设置显示“HEAD detached at v1.0.0”。是什么导致了git status中的这种差异?除此之外,其他一切都很好,正确的提交已经检出,并且文件中没有任何差异。 - tslid
@tslid:在生产环境和你的本地机器上,git version 命令输出的信息是什么? - LeGEC
好的,就是这样 - 1.7 vs 2.13。这就是困扰我的问题,实际上并没有什么问题,但我在git文档中找不到这个。谢谢! - tslid

2
接受的答案是正确的(我已经点赞了)。详细说明一下最后一部分——一个Git,一个非常古老的1.7版本,只是说你有一个游离的HEAD,但更现代的2.13版本则表示你有一个在v1.0.0处游离的HEAD。在这两个版本之间,git status命令在功能上得到了许多非常有用和重要的提升。不清楚“游离于/从”代码是何时加入的,因为它没有列在发布说明中,但以下是一些有用的项目列表:
  • 1.7.1: git status 学习了关于子模块的知识
  • 1.7.2: git status 可以在 -s -b 输出中包含分支名称
  • 1.7.3.5: git status 学会了引用路径名中的不可打印字符
  • 1.7.6: git status -z 修复了错误(如果在脚本中使用它,这很重要)
  • 1.7.10.13: 更多的 git status --porcelaingit status -z 修复(再次为脚本)
  • 1.7.11.3: git status(以及 git diff 本身)被修复以处理名为 - 的文件
  • 1.8.2: git status 在这些操作期间学会了说出正在二分或重新基于哪个分支
  • 1.8.3: git status 也学会了报告正在 git revert 中间的状态
  • 1.8.4: git status 学会了配置选项 status.branchstatus.short
  • 1.8.5: git status 改进了几个报告:子模块、樱桃挑选以及当前分支(如果有的话)与其上游的状态
  • 2.4.0: git status 学会了 -v -v,并且它的“detached at”/“detached from”已经得到改进,并与 git branch 的相应部分同步
  • 2.5.0: git status 更详细地报告正在进行的交互式重新基础操作
  • 2.6.2: git status 不再报告无用的“HEAD detached at HEAD”
“分离状态”是通过扫描 HEAD 的 reflog 计算出来的,因此它并不完全可靠,这取决于你被困在 reflog 中的内容。但它仍然非常有用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接