Git中的“at” @符号/符号/字符是什么意思?

51

在git中,艾特符号@经常用于以不同的方式指定修订版本。例如:

  1. <ref>@{<date>} 指定参考文献在<date>时的状态。

    示例:git diff master@{yesterday} master

  2. <ref>@{<n>} 指定参考文献在其第n个先前状态。

    示例:git diff master@{1} master

  3. @{-<n>} 指定当前之前的第n个已检出分支。

    示例:git checkout @{-5}

  4. <ref>@{upstream} 指定参考文献的上游分支。

    示例:git diff master@{upstream} master

然而,在git命令中,@也被用于其他方面,例如:
git rebase -i @~4
git log @^^..@

在这些例子中,符号@代表什么意思?


@sehe 那个命令对于 msysgit 用户不起作用,msysgit 没有 man,如果他们想要使用一个命令来查看文档,他们必须使用 git rev-parse --help - user456814
这不是一个命令,而是使用众所周知的“man”命名空间的单词 :) https://www.google.com/search?q=man+git-rev-parse - sehe
2个回答

58

从 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问题:

  1. Git中的HEAD和ORIG_HEAD
  2. 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
在这种情况下,使用@更像是替换masterHEAD恰好指向的分支)而不是HEAD。如果您稍后尝试从生成的捆绑包中获取内容,则必须指定要获取的ref(master),如果您使用了@,则无需执行此操作,如果您明确指定了HEAD

5
您可以使用 @@{1} 作为 HEAD@{1} 的快捷方式。 - Phu Ngo
1
“HEAD”和“@”并不完全可互换,例如,在分支上时,“git push origin @:new-branch”会因为引用模糊而失败,而“git push origin HEAD:new-branch”则可以正常工作。 - Phu Ngo

1
自 Git 1.8.5(2013 年第三季度)以来,@ 表示 HEAD 是正确的,但在 Git 2.30(2021 年第一季度)之前,并非总是有效。有时候 "@" 能够工作(例如,在 refspec 元素中使用 "git push origin @:there"),但 "git push origin @" 无法正常工作,这已经得到了修复。

请查看提交 374fbae, 提交 e7f80ea, 提交 12a30a3 (2020年11月25日),作者为Felipe Contreras (felipec)
(由Junio C Hamano -- gitster --合并于提交 c59b73b,2020年12月14日)

refspec: 将 @ 作为 HEAD 的同义词

签署者:Felipe Contreras

Since commit 9ba89f484e Git learned how to push to a remote branch using the source @, for example:

git push origin @:master  

However, if the right-hand side is missing, the push fails:

git push origin @  

It is obvious what is the desired behavior, and allowing the push makes things more consistent.

Additionally, @:master now has the same semantics as HEAD:master.


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接