从 Git 版本 1.8.5 开始,符号“@”如果没有前导分支/引用名称和序数后缀如 HEAD@{1}
和 master@{1}
,则只是特殊 Git 引用 HEAD
的同义词/别名/快捷方式:
现在你可以使用符号“@”代替四个大写字母 “HEAD”,例如 “git log @”。
因此,对于这些命令:
git rebase -i @~4
git log @^^..@
你可以简单地将第一个出现的@
替换为HEAD
(如果使用Windows或OS X,则替换为head
)
git rebase -i HEAD~4
git log HEAD^^..HEAD
那么,HEAD
是什么意思呢?正如Git官方文档中关于指定Git修订版本的说明所解释的那样,HEAD
是一个特殊的快捷引用,用于指向您当前检出的提交作为您的工作副本(或在Git术语中,您的“工作树”):
HEAD
命名了您在工作树中基于其进行更改的提交。
您还可以阅读这些关于特殊引用HEAD
的其他Stack Overflow问题:
- Git中的HEAD和ORIG_HEAD。
- Git HEAD到底是什么?。
VonC还在这个Stack Overflow答案(底部的最后一节)中找到了有关为什么选择@作为HEAD
的快捷方式的有趣信息。
请注意,就像通常在Git中发生的情况一样,虽然@
是一个方便的快捷方式,但它并不总是有效地替代HEAD
。例如:
$ git bundle create temp.bundle @
Enumerating objects: 25, done.
Counting objects: 100% (25/25), done.
Compressing objects: 100% (20/20), done.
Total 25 (delta 3), reused 0 (delta 0), pack-reused 0
$ git bundle list-heads temp.bundle
c006e049da432677d1a27f0eba661671e0524710 refs/heads/master
$ git bundle create temp.bundle HEAD
Enumerating objects: 25, done.
Counting objects: 100% (25/25), done.
Compressing objects: 100% (20/20), done.
Total 25 (delta 3), reused 0 (delta 0), pack-reused 0
$ git bundle list-heads temp.bundle
c006e049da432677d1a27f0eba661671e0524710 HEAD
在这种情况下,使用
@
更像是替换
master
(
HEAD
恰好指向的分支)而不是
HEAD
。如果您稍后尝试从生成的捆绑包中获取内容,则必须指定要获取的ref(
master
),如果您使用了
@
,则无需执行此操作,如果您明确指定了
HEAD
。
man
,如果他们想要使用一个命令来查看文档,他们必须使用git rev-parse --help
。 - user456814