What does the "at" @ sign/symbol/character mean in Git?
As of Git version 1.8.5, the at-sign @
, without a leading branch/reference name and ordinal {n}
suffix like HEAD@{1}
and master@{1}
, is just a synonym/alias/shortcut for the special Git reference HEAD
:
Instead of typing four capital letters "HEAD", you can say "@" now, e.g. "git log @".
So for these commands
git rebase -i @~4
git log @^^..@
you can simply substitute the first occurrence of @
with HEAD
(or head
if using Windows or OS X)
git rebase -i HEAD~4
git log HEAD^^..HEAD
So what does HEAD
mean? As explained by the official Linux Kernel Git documentation for specifying Git revisions, HEAD
is a special shortcut reference for the commit that you currently have checked-out as your working copy (or in Git terms, your "working tree"):
HEAD names the commit on which you based the changes in the working tree.
You can also read these other Stack Overflow questions on what the special reference HEAD
means:
- HEAD and ORIG_HEAD in Git.
- What is git HEAD, exactly?.
VonC also found interesting information about why @
was chosen as a shortcut for head
in this Stack Overflow answer (the last section at the bottom).
Note that like it often happens with Git, while @
is a convenient shortcut, it isn't always a valid replacement for HEAD
. Example:
$ 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
In this case, using @
is more like a replacement for master
(the branch that HEAD
happened to be pointing to) rather than for HEAD
. If you try to fetch from the resulting bundle later, you'll have to specify the ref you want to fetch (master
) if you used @
, and you won't have to to it if you specified HEAD
explicitly.
While it is true that @
means HEAD
since Git 1.8.5 (Q3 2013), it... does not always work, not before Git 2.30 (Q1 2021),
"@
" sometimes worked (e.g. "git push origin @:there
as a part of a refspec element, but "git push origin @
" did not work, which has been corrected.
See commit 374fbae, commit e7f80ea, commit 12a30a3 (25 Nov 2020) by Felipe Contreras (felipec
).
(Merged by Junio C Hamano -- gitster
-- in commit c59b73b, 14 Dec 2020)
refspec
: make@
a synonym ofHEAD
Signed-off-by: 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 asHEAD:master
.