【问题标题】:Checking out a git tag actually does another签出一个 git 标签实际上做了另一个
【发布时间】:2021-12-04 18:32:02
【问题描述】:

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

git checkout tag-a

它检查标签-b

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

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

【问题讨论】:

  • 两个标签都指向同一个提交吗? git status 的输出是什么?
  • 分离的头通常意味着您不是在分支机构工作。您不能直接签出标签,因为它是标签而不是分支。要创建分支,请在签出标签时使用-b 后跟要创建的分支名称。
  • 是的,但你没有说你是如何得到这个结果的。 (之前创建了什么标签,这些标签之间有多少次提交,一个标签的提交是否存在于另一个标签的提交层次结构中?)
  • 您的提示设置代码似乎被分离的 HEAD 状态弄糊涂了,并且打印了一些虚假的东西。你从哪里得到的提示设置代码?
  • @matt 您签出标签的原因与您最初创建标签的原因相同:因为它引用了存储库的一些重要修订,例如产品的发布版本。这是一件非常合理的事情。

标签: git git-tag


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2013-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-27
    • 2015-06-24
    • 2010-11-11
    相关资源
    最近更新 更多