【问题标题】:Why does git uses 2 different commands to show HEAD?为什么 git 使用 2 个不同的命令来显示 HEAD?
【发布时间】:2017-12-13 03:50:00
【问题描述】:

我注意到有 2 个 HEAD:

  • .git\HEAD
  • .git\refs\remotes\origin\HEAD

当我使用git show-ref HEAD 时,它只给我这个:

ce0762c073b407d794f54f0b5d2a50375fdcb609 refs/remotes/origin/HEAD

当我使用git rev-parse HEAD 时,它给了我 .git\HEAD 的值:

a758e523fe40e799194878bac567b7f4b8eec2b9

为什么 Git 使用 2 个不同的命令来显示 HEAD?有什么强有力的理由吗?

【问题讨论】:

  • 你的意思是git rev-parse HEAD
  • @Schwern 感谢您的评论。是的,我打错了。已更正。

标签: git


【解决方案1】:

git-show-ref 显示存储库中的引用列表及其提交 ID。它可能应该被称为git-show-refs。它优于直接引用.git 目录中的文件。

当您说git show-ref HEAD 时,您并不是在要求HEAD。您要求的是列表中与模式HEAD 匹配的任何引用。 HEAD 本身通常会被过滤掉,所以你会得到refs/remotes/origin/HEAD。您可以将HEAD 包含在--head 中。

$ git show-ref --head HEAD
f37beeea95f3b0e6b064f6d4b5f835a058e0568c HEAD
aa1124b89f38eed793e2b9f2d2b2ba5d80a27a20 refs/remotes/origin/HEAD

所以你不应该使用git show-ref <ref> 来查找参考资料。


git-rev-parse 接受一个修订参数并返回一个提交 ID。它旨在处理您可以引用提交的无数不同方式。比如……

$ git rev-parse --verify master
aa1124b89f38eed793e2b9f2d2b2ba5d80a27a20
$ git rev-parse --verify heads/master
aa1124b89f38eed793e2b9f2d2b2ba5d80a27a20
$ git rev-parse --verify refs/heads/master
aa1124b89f38eed793e2b9f2d2b2ba5d80a27a20

git rev-parse --verify <ref> 是您应该用来查找引用的提交 ID。

【讨论】:

    【解决方案2】:

    .git/HEAD 被 Git 用来保存当前引用。因此,当您使用master 时,它将是ref: refs/heads/master。当您在detached HEAD 上时,它将是一个提交的哈希。

    .git/refs/remotes/origin/HEAD 实际上是一个远程引用,指向远程默认分支。当 master 是默认远程分支时,它将是 ref: refs/remotes/origin/master(如果您的远程是源)。除了master 之外,可能还有一个默认的远程分支,但我注意到它不会正确反映这一点。

    但是

    $ git remote show github
    

    总是会告诉你正确的默认远程分支。

    有关详细信息,请参阅How does origin/HEAD get set? 中的this answer

    git show-ref 向您显示 refs,即本地分支、远程分支、标签、stash refs。

    git show-ref HEAD
    

    Git 使用“HEAD”作为模式

    git show-ref [-q|--quiet] [--verify] [--head] [-d|--dereference]
             [-s|--hash[=<n>]] [--abbrev[=<n>]] [--tags]
             [--heads] [--] [<pattern>…​]
    

    并且只显示匹配的引用。

    git-show-ref doc

    我主要使用git branch-a-r 选项来查看分支,git tag 来查看标签,很少使用git show-ref

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-05
      • 2010-12-30
      • 2020-12-12
      • 2022-10-02
      • 2010-09-26
      • 1970-01-01
      • 1970-01-01
      • 2019-09-05
      相关资源
      最近更新 更多