为什么git使用2个不同的命令来显示HEAD?

时间:2017-07-09 08:51:26

标签: git

我注意到有两个HEAD:

  • 的.git \ HEAD
  • 的.git \参\遥控\原点\ HEAD

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

ce0762c073b407d794f54f0b5d2a50375fdcb609 refs/remotes/origin/HEAD

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

a758e523fe40e799194878bac567b7f4b8eec2b9

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

2 个答案:

答案 0 :(得分:5)

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。

答案 1 :(得分:2)

Git使用

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

.git/refs/remotes/origin/HEAD实际上是指向远程默认分支的远程引用。当master是默认的远程分支时,它将是ref: refs/remotes/origin/master(如果您的远程是原始的)。可能有master以外的默认远程分支,但我注意到它无法正确反映出来。

但是

$ git remote show github

将始终告诉您正确的默认远程分支。

有关详细信息,请参阅this answerHow does origin/HEAD get set?

git show-ref显示你的引用,它们是本地分支,远程分支,标记,隐藏引用。

使用

git show-ref HEAD

Git正在使用&#34; HEAD&#34;作为模式

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