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...
manually you can look content of . git/HEAD file. If it has a hash, you're detached. if there is a ref like ref: refs/heads/master you're not.
The --decorate flag makes git log display all of the references (e.g., branches, tags, etc) that point to each commit. This lets you know that the top commit is also checked out (denoted by HEAD ) and that it is also the tip of the main branch.
You can find your missing commit using the git reflog command. The reflog keeps track of the historical positions of a branch head, and you can use it to find things that the branch head was pointing at previously.
This detached head state occurs when a specific commit is checked out instead of a branch. You cannot commit to a commit—only to a branch.
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) ...
[Edit: since Git 2.4, well, see VonC's answer. The text below is for versions of Git before 2.4.]
Unfortunately, no. I keep wishing git log
's --decorate
used my HEAD=
syntax. If it did, you would get:
4d860e9 (HEAD, master) Remove trailing whitespace
9a2ef02 Correct typo in header
f0badb5 Add to-do section to README
when you you're in detached-HEAD state, but you would get this instead:
4d860e9 (HEAD=master) Remove trailing whitespace
9a2ef02 Correct typo in header
f0badb5 Add to-do section to README
otherwise.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With