40

The at-sign @ is often used in git to specify revisions in different ways. For example,

  1. <ref>@{<date>} specifies the reference at its state on <date>.

    Example: git diff master@{yesterday} master.

  2. <ref>@{<n>} specific the reference at its nth prior state.

    Example: git diff master@{1} master.

  3. @{-<n>} specifies the nth previously checked-out branch before the current one.

    Example: git checkout @{-5}.

  4. <ref>@{upstream} specifies the upstream branch for the reference.

    Example: git diff master@{upstream} master.

However, the @ is being used in other ways in git commands too, like

git rebase -i @~4
git log @^^..@

What does the at-sign @ mean in those examples?

4

2 回答 2

49

从 Git 版本 1.8.5@开始,没有前导分支/引用名称和序号{n}后缀(如HEAD@{1}and )的 at-signmaster@{1}只是特殊 Git 引用的同义词/别名/快捷方式HEAD

您现在可以说“@”,而不是输入四个大写字母“HEAD”,例如“git log @”。

所以对于这些命令

git rebase -i @~4
git log @^^..@

您可以简单地替换第一次出现的@with HEAD(或者head如果使用 Windows 或 OS X)

git rebase -i HEAD~4
git log HEAD^^..HEAD

那么是什么HEAD意思呢?正如用于指定 Git 修订的官方 Linux Kernel 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

在这种情况下, using@更像是替换 for (恰好指向master的分支)而不是 for 。如果您稍后尝试从生成的包中获取,则必须指定要获取的引用 ( ) 如果您使用了 ,并且如果您明确指定则不必这样做。HEADHEADmaster@HEAD

于 2013-07-28T15:58:58.497 回答
1

虽然这确实@意味着HEAD自 Git 1.8.5(2013 年第三季度)以来,它......并不总是有效,而不是在 Git 2.30(2021 年第一季度)之前,

" @" 有时会起作用(例如, "git push origin @:there作为 refspec 元素的一部分,但 " git push origin @"不起作用,已更正。

请参阅Felipe Contreras ( )的commit 374fbaecommit e7f80eacommit 12a30a3(2020 年 11 月 25 日) 。(由Junio C Hamano 合并 -- --提交 c59b73b中,2020 年 12 月 14 日)felipec
gitster

refspec: 做@一个同义词HEAD

签字人:费利佩·孔特雷拉斯

自从commit 9ba89f484e Git 学会了如何使用 source 推送到远程分支@,例如:

git push origin @:master  

但是,如果缺少右侧,则推送失败:

git push origin @  

很明显,期望的行为是什么,并且允许推送使事情更加一致。

此外,@:masternow 具有与HEAD:master.

于 2020-12-19T23:23:06.357 回答