我注意到有两个HEAD:
当我使用git show-ref HEAD
时,它只给我这个:
ce0762c073b407d794f54f0b5d2a50375fdcb609 refs/remotes/origin/HEAD
当我使用git rev-parse HEAD
时,它给了我.git \ HEAD的值:
a758e523fe40e799194878bac567b7f4b8eec2b9
为什么Git使用2个不同的命令来显示HEAD?任何有力的理由?
答案 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/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 answer的How 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
。