检查 git 标签实际上做了另一个

Checking out a git tag actually does another

我觉得这种行为很奇怪,我有一个 git 标签,可以说是标签-a,当我通过 运行 以下内容检查它时:

git checkout tag-a

它检查了标签-b

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

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

"git checkout" command 有多种操作模式,它会根据您提供的参数类型自动选择。现在相关的是:

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

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

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

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