17

I want to know whether I'm in a "HEAD detached" state in a script.

Currently I parse the output of git status but I dislike doing so because I've heard that it's a bad practice to parse Git output that's meant for human - I want a program-friendly interface to tell me whether HEAD is detached. I also don't want to manually look into .git/HEAD or parse git description or git branch.

Any ideas?

iBug
  • 35,554
  • 7
  • 89
  • 134

4 Answers4

19

The easiest command is probably:

$ git symbolic-ref -q HEAD

and check the exit status: 0 means normal; 1 is detached.

From the docs of git-symbolic-ref:

-q, --quiet
   Do not issue an error message if the <name> is not a symbolic ref
   but a detached HEAD; instead exit with non-zero status silently.
rodrigo
  • 94,151
  • 12
  • 143
  • 190
8

Programmatically you need to a wrapper for Git protocol.

For example, by GitPython you're able to find out the repo detached or not repo.head.is_detached

Masoud
  • 1,008
  • 1
  • 9
  • 22
  • I didn't mention what language I'm programming in. It could be Bash where the only interface is the `git` binary. And that's good - Once you know how to do it in Bash you can do it in any language - by calling `git` binary. – iBug Sep 07 '18 at 11:37
  • @iBug `git symbolic-ref HEAD` may help you and just indicate the fatal error by `grep` command. – Masoud Sep 07 '18 at 12:03
2

From git 2.22, you can also use:

git branch --show-current

This prints nothing when not on a branch.

ak2
  • 6,629
  • 31
  • 27
1

Use git branch to find a detached HEAD...

$ git branch -q
* (HEAD detached at c61a6d2)
  master
Mike Pennington
  • 41,899
  • 19
  • 136
  • 174
  • Are you sure this output is ready for consumption (i.e. text parsing)? – iBug Nov 28 '20 at 16:11
  • Sure enough to use it in [my git wrapper](https://github.com/mpenning/git_crazy/blob/63a32ad5a525c2113ab7e0434b8bc8acfdb1c356/gitc.py#L1618). Could git change output? Yes, but vulnerabiity to bit-rot is common to any code you write. If you're worried, write a unit test... – Mike Pennington Nov 28 '20 at 16:15