I know that, in Git parlance, "detached HEAD" corresponds to a state in which the symbolic reference HEAD
is not pointing to any branch. I also know that git branch
, for instance, will tell me whether I'm in detached-HEAD state, e.g.
* (detached from 9a2ef02)
master
or not, e.g.
* master
However, I'd like to know if there is a way to make the output of git log --decorate
completely unambiguous as to whether I'm in detached-HEAD state or not.
Say I'm on master
and my history looks as follows:
4d860e9 (HEAD, master) Remove trailing whitespace
9a2ef02 Correct typo in header
f0badb5 Add to-do section to README
If I run
git checkout 9a2ef02
then the output of git log --decorate --oneline
is
9a2ef02 (HEAD) Correct typo in header
f0badb5 Add to-do section to README
Because no branch reference is listed next to HEAD
in this output, I know for sure that I've got a detached HEAD.
However, if I run
git checkout 4d860e9
then HEAD
does not point to master
, but directly to commit 4d860e9
, which master
also points to; I've got a detached HEAD. However, there is no way to tell from the output of git log --decorate --oneline
,
4d860e9 (HEAD, master) Remove trailing whitespace
9a2ef02 Correct typo in header
f0badb5 Add to-do section to README
because it's exactly the same as when I'm on master
.
Is there a way, via some git log
options, to remove that ambiguity? I haven't found a way in the git-log
man page...
With Git 2.4+ (Q2 2015), git log --decorate
will shows the exact branch associated with HEAD (or the lack thereof, for a detached HEAD).
See commit 51ff0f2 by Junio C Hamano (gitster
):
log
: decorateHEAD
with branch nameCurrently, log decorations do not indicate which branch is checked out and whether
HEAD
is detached.When branch
foo
is checked out, change the "HEAD, foo
" part of the decorations to "HEAD -> foo
". This serves to indicate both ref decorations (helped by the spacing) as well as their relationshsip.As a consequence, "
HEAD
" without any "->
" denotes a detachedHEAD
now.
This means the 2.4 release notes now include the following Backward compatibility warning(s):
Output from "
git log --decorate
" (and "%d
" format specifier used in the userformat "--format=<string>
" parameter "git log
" family of command takes) used to list "HEAD
" just like other tips of branch names, separated with a comma in between. E.g.$ git log --decorate -1 master commit bdb0f6788fa5e3cacc4315e9ff318a27b2676ff4 (HEAD, master) ...
This release updates the output slightly when HEAD refers to the tip of a branch whose name is also shown in the output.
The above is shown as:$ git log --decorate -1 master commit bdb0f6788fa5e3cacc4315e9ff318a27b2676ff4 (HEAD -> master) ...