I can find the current git branch name by doing either of these:
git branch | awk '/^\*/ { print $2 }'
git describe --contains --all HEAD
But when in a detached HEAD state, such as in the post build phase in a Jenkins maven build (or in a Travis git fetch), these commands doesn't work.
My current working solution is this:
git show-ref | grep $(git show-ref -s -- HEAD) | sed 's|.*/\(.*\)|\1|' | grep -v HEAD | sort | uniq
It displays any branch name that has the last commit on its HEAD tip. This works fine, but I feel that someone with stronger git-fu might have a prettier solution?
I needed a bit different solution for Jenkins because it does not have local copies of the branches. So the current commit must be matched against the remote branches:
or without network:
It's also worth noting that this might return multiple branch names when you have multiple branch heads at the same commit.
UPDATE:
I just noticed that Jenkins sets
GIT_BRANCH
environment variable which contains a value likeorigin/master
. This can be used to get git branch in Jenksin too:Obviously discarding (no branch). Of course, you may get an arbitrary number of branches which could describe the current HEAD (including of course none depending on how you got onto no-branch) which might have be fast-forward merged into the local branch (one of many good reasons why you should always use
git merge --no-ff
).A more porcelain way:
The refs will be listed in the format
(HEAD, master)
- you'll have to parse it a little bit if you intend to use this in scripts rather than for human consumption.You could also implement it yourself a little more cleanly:
with the benefit of getting the candidate refs on separate lines, with no extra characters.
Here's
git nthlastcheckout
, it gets the exact string you used for your nth last checkout from the reflog:Examples:
git symbolic-ref HEAD
returnsrefs/heads/branchname
if you are on a branch and errors if you aren't.