首页 > 解决方案 > 签出一个 git 标签实际上做了另一个

问题描述

这种行为对我来说似乎很奇怪,我有一个 git 标签,可以说是 tag-a,当我通过运行以下命令检查它时:

git checkout tag-a

它检查标签-b

user@server xxx ~/path/git-local-folder ((tag-b))

我猜 tag-a 和 tag-b 之间存在某种关系,但我不知道它是什么以及它的逻辑

标签: gitgit-tag

解决方案


git checkout”命令有几种操作模式,它会根据你给它的参数类型自动选择。现在相关的是:

  • 如果给它一个分支名称,它会将工作树和暂存区域更新为该分支引用的当前提交,并将 HEAD 标记更新为该分支的名称。随后的操作,例如“git commit”然后知道移动那个分支指针。
  • 如果你给它一个提交而不是分支名称的引用,它会以相同的方式更新工作树和暂存区域,但不会将任何分支名称记录为 HEAD。这被称为“分离的 HEAD”,随后的“git commit”不会移动任何分支指针。标签名称属于这一类。

请注意,较新的“git switch”命令强制您明确区分:如果参数不是分支名称,除非您指定--detach选项,否则它将失败。

现在,当您的提示尝试显示当前签出的分支时,最简单的查看位置是在 HEAD 文件中。但是,如果您处于“分离的 HEAD”状态,则无论您如何选择该提交,它都将只包含一个提交哈希。所以显示代码必须选择要显示的东西而不是分支名称。它可以查看是否有任何标签指向当前签出的提交,但如果有多个标签指向它,它不知道你使用了哪一个,只需要猜测。

在您的情况下,“tag-a”和“tag-b”可能引用了相同的提交。因此,一旦您检查了该提交,您正在使用的提示会查找标签并找到“tag-b”,即使您实际输入的是“tag-a”,甚至是提交哈希。


推荐阅读