How do I get the name of the current branch in Git?
git branch
should show all the local branches of your repo. The starred branch is your current branch.
To retrieve only the name of the branch you are on:
git rev-parse --abbrev-ref HEAD
Version 2.22 adds the --show-current
option to ”print the name of the current branch”. The combination also works for freshly initialized repositories before the first commit:
git branch --show-current
git branch
but I see no *
on my current branch. Yet if checkout to that branch I will say that I am currently on that branch. What is wrong with my git/terminal? –
Vanquish git checkout --orphan foo
then git branch
failed to show branch foo
. Whereas git symbolic-ref HEAD
as suggested another answer worked. –
Intimacy gitbranch="$( git branch | grep \* )"
currentbranch="$([[ "${gitbranch}" == "* (HEAD"* ]] && echo "${gitbranch}" | cut -d ' ' -f5 | cut -d ')' -f1 || echo "${gitbranch}" | cut -d ' ' -f2-)"
–
Caz git checkout $(git branch | grep \* | cut -d ' ' -f2)
fails –
Podium git branch | grep \* | cut -c3-
. This helps with "(no branch)" branch. –
Ishmaelite git branch | awk '{if ($1 == "*") print $2}'
–
Nishanishi git checkout --orphan branch
–
Hemipode git rev-parse --abbrev-ref HEAD
do exactly? I was previously using git describe --contains --all HEAD
but that breaks sometimes and i'm not quite sure why. –
Spoliate git rev-parse --abbrev-ref HEAD
on script, and it became perfect –
Mousterian git branch --show-current
works for me –
Towboat To display only the name of the current branch you're on:
git rev-parse --abbrev-ref HEAD
Reference: Show just the current branch in Git
git branch
shows * (no branch)
, which is also useless... –
Succinct git symbolic-ref --short HEAD
doesn't work in pre-1.8 clients. (RHEL6 is currently on v1.7) –
Cabotage git rev-parse --abbrev-ref HEAD 2>/dev/null
The /dev/null part prevents you from seeing an error if you just created a new repository that has not yet HEAD. –
Necrosis git branch
. I don't need to parse the result to get current branch. –
Grand HEAD
? I'm on Windows, msysgit. –
Filia HEAD
. Using git version 1.8.1.msysgit.1
, W7. –
Transitive git branch
and it showed two branches: <no branch>
(???) and master
. Apparently I was on the former. After switching to master
and making sure I was on a branch rather than no branch, this started working. Later update: and now I remember! I was using a detached head :) Hence the no branch :) –
Transitive git branch | grep \* | awk '{print $2}'
–
Intact git symbolic-ref --short HEAD
seems to be more versatile. git rev-parse --abbrev-ref HEAD
yields HEAD
if the repo is a just-initialized one. –
Disenthrall git name-rev HEAD
works though. –
Valentino git rev-parse --abbrev-ref HEAD | tr -d '\n' | pbcopy
–
Dene HEAD
in the console -- v2.9+ –
Camarillo git branch | grep \*
is far more easier to remember than this –
Evulsion git branch --contains
works for me (but yes, includes the *) –
Snap --
text. shouldn't the --
be removed from the answer? –
Breannabreanne git branch --format='%(refname:short)' --contains | grep -v '^('
but there may still be different branches. Unfortunately, Git does not keep branch information that was present at the time of the commit (before branches diverged). However, if master
is present, I assume that this is the correct one, as it exists since the beginning. This solves almost all the practical cases for me. –
Wingate git branch --show-current
though? I'd think almost everybody is using v2.2+ these days... –
Snap git branch
should show all the local branches of your repo. The starred branch is your current branch.
To retrieve only the name of the branch you are on:
git rev-parse --abbrev-ref HEAD
Version 2.22 adds the --show-current
option to ”print the name of the current branch”. The combination also works for freshly initialized repositories before the first commit:
git branch --show-current
git branch
but I see no *
on my current branch. Yet if checkout to that branch I will say that I am currently on that branch. What is wrong with my git/terminal? –
Vanquish git checkout --orphan foo
then git branch
failed to show branch foo
. Whereas git symbolic-ref HEAD
as suggested another answer worked. –
Intimacy gitbranch="$( git branch | grep \* )"
currentbranch="$([[ "${gitbranch}" == "* (HEAD"* ]] && echo "${gitbranch}" | cut -d ' ' -f5 | cut -d ')' -f1 || echo "${gitbranch}" | cut -d ' ' -f2-)"
–
Caz git checkout $(git branch | grep \* | cut -d ' ' -f2)
fails –
Podium git branch | grep \* | cut -c3-
. This helps with "(no branch)" branch. –
Ishmaelite git branch | awk '{if ($1 == "*") print $2}'
–
Nishanishi git checkout --orphan branch
–
Hemipode git rev-parse --abbrev-ref HEAD
do exactly? I was previously using git describe --contains --all HEAD
but that breaks sometimes and i'm not quite sure why. –
Spoliate git rev-parse --abbrev-ref HEAD
on script, and it became perfect –
Mousterian git branch --show-current
works for me –
Towboat You have also git symbolic-ref HEAD
which displays the full refspec.
To show only the branch name in Git v1.8 and later (thank's to Greg for pointing that out):
git symbolic-ref --short HEAD
On Git v1.7+ you can also do:
git rev-parse --abbrev-ref HEAD
Both should give the same branch name if you're on a branch. If you're on a detached head answers differ.
Note:
On an earlier client, this seems to work:
git symbolic-ref HEAD | sed -e "s/^refs\/heads\///"
– Darien 26. Mar 2014
git rev-parse --abbrev-ref HEAD
shows HEAD
when you’re on detached head. –
Verlie git symbolic-ref HEAD | sed -e "s/^refs\/heads\///"
since it will display a string like HEAD detached at a63917f
when in a detached state, unlike the other answers which show either nothing or HEAD. This is important. –
Jandy git checkout --orphan branch
unlike the accepted answer. –
Hemipode fatal: ref HEAD is not a symbolic ref
. When I cd into the folder, it shows me user@machine:/my/folder ((62d6058...)) >
–
Upwind For my own reference (but it might be useful to others) I made an overview of most (basic command line) techniques mentioned in this thread, each applied to several use cases: HEAD is (pointing at):
- local branch (master)
- remote tracking branch, in sync with local branch (origin/master at same commit as master)
- remote tracking branch, not in sync with a local branch (origin/feature-foo)
- tag (v1.2.3)
- submodule (run inside the submodule directory)
- general detached head (none of the above)
Results:
git branch | sed -n '/\* /s///p'
- local branch:
master
- remote tracking branch (in sync):
(detached from origin/master)
- remote tracking branch (not in sync):
(detached from origin/feature-foo)
- tag:
(detached from v1.2.3)
- submodule:
(HEAD detached at 285f294)
- general detached head:
(detached from 285f294)
- local branch:
git status | head -1
- local branch:
# On branch master
- remote tracking branch (in sync):
# HEAD detached at origin/master
- remote tracking branch (not in sync):
# HEAD detached at origin/feature-foo
- tag:
# HEAD detached at v1.2.3
- submodule:
# HEAD detached at 285f294
- general detached head:
# HEAD detached at 285f294
- local branch:
git describe --all
- local branch:
heads/master
- remote tracking branch (in sync):
heads/master
(note: notremotes/origin/master
) - remote tracking branch (not in sync):
remotes/origin/feature-foo
- tag:
v1.2.3
- submodule:
remotes/origin/HEAD
- general detached head:
v1.0.6-5-g2393761
- local branch:
cat .git/HEAD
:- local branch:
ref: refs/heads/master
- submodule:
cat: .git/HEAD: Not a directory
- all other use cases: SHA of the corresponding commit
- local branch:
git rev-parse --abbrev-ref HEAD
- local branch:
master
- all the other use cases:
HEAD
- local branch:
git symbolic-ref --short HEAD
- local branch:
master
- all the other use cases:
fatal: ref HEAD is not a symbolic ref
- local branch:
(FYI this was done with git version 1.8.3.1)
git describe --all --exact-match 2>/dev/null | sed 's=.*/=='
was the best solution for me (good names for tags and branch heads, no output for random detached heads. –
Wynd git describe
has a serious failing when there are multiple branches referencing the same commit, e.g. right after git checkout -b foo
- it uses one of them arbitrarily (seems like maybe the most recently created one). I will change my strategy to use filtered output from git branch
and only use git describe
if the result is something about a detached head. –
Wynd git branch --no-color
to make sure that the filename is free of annoying terminal escape codes. –
Wynd checkout foo
) and "current commit" are 2 distinct concepts. symbolic-ref
only looks at active branch. describe
only looks at a commit, and chooses heuristically from all branches/tags pointing to it (or near it). DWIM commands like branch
and status
use current branch when defined, but all of them choose heuristically in all "detached HEAD" situations. –
Wellmannered git branch --show-current
to this list? The behavior is that when a local branch is checked out, it prints the branch short name (ex: "master"), and otherwise, it prints nothing, returns success. –
Siderolite git name-rev --name-only HEAD
to your list? Another scenario to call out is a newly git init
-ed repo. –
Commutator As of version 2.22 of git you could just use:
git branch --show-current
As per man page:
Print the name of the current branch. In detached HEAD state, nothing is printed.
main
. –
Are HEAD
, the exit code is 0
AND nothing is printed. With symbolic-ref --short HEAD
you get a nice fat error message :) –
Cocci One more alternative:
git name-rev --name-only HEAD
echo ${$(git symbolic-ref --quiet HEAD)#refs/heads/}
–
Transmigrant git checkout master && git name-rev --name-only HEAD # ac-187
It does not work as expected –
Mask git branch --list
just says * (HEAD detached at 7127db5)
. Doing git rev-parse --abbrev-ref HEAD
just says HEAD
and so on. –
Chino | clip
to put it on the clipboard. –
Tripod git checkout master && git name-rev --name-only HEAD
but # ac-187
is this a tag name. Will you please elaborate on the use of the above-mentioned command by you? Thanks in advance :) –
Cubitiere git name-rev --name-only HEAD | cut -d / -f3
worked great for me in a detached state -- thanks! –
Eileneeilis Well simple enough, I got it in a one liner (bash)
git branch | sed -n '/\* /s///p'
(credit: Limited Atonement)
And while I am there, the one liner to get the remote tracking branch (if any)
git rev-parse --symbolic-full-name --abbrev-ref @{u}
sed -n 's/\* //p'
does the trick. Although I tend toward the paranoid so I would anchor it with sed -n 's/^\* //p'
. –
Warnke write the following command in terminal :
git branch | grep \*
or
git branch --show-current
or on Git 2.22 and above:
git branch --show
You can just type in command line (console) on Linux, in the repository directory:
$ git status
and you will see some text, among which something similar to:
...
On branch master
...
which means you are currently on master
branch. If you are editing any file at that moment and it is located in the same local repository (local directory containing the files that are under Git version control management), you are editing file in this branch.
git status
and get only the first line of output with git status | head -1
which yields something like # On branch master
. I'm sure version differences will needed to be accounted for as well. –
Dentalium git status | grep 'On branch'
, which should have the same effect (should, does not mean it will if your version of Git displays it differently). Or git branch | grep '*'
, which will show the name of the branch with a star at the beginning of it. –
Peafowl <tick>git status | head -1<tick>.gsub('# On branch ', '')
–
Dentalium git status
can take a long time to return a value if there are a lot of files being managed. –
Crump git status
may tank the whole page's generation time. –
Gestate git symbolic-ref -q --short HEAD
I use this in scripts that need the current branch name. It will show you the current short symbolic reference to HEAD, which will be your current branch name.
To get the current branch in git use,
git branch --show-current
git branch | grep -e "^*" | cut -d' ' -f 2
will show only the branch name
git branch
show current branch name only.
While git branch will show you all branches and highlight the current one with an asterisk, it can be too cumbersome when working with lots of branches.
To show only the branch you are currently on, use:
git rev-parse --abbrev-ref HEAD
git branch --contains
sometimes lists more than one branch. –
Doyon Found a command line solution of the same length as Oliver Refalo's, using good ol' awk:
git branch | awk '/^\*/{print $2}'
awk
reads that as "do the stuff in {}
on lines matching the regex". By default it assumes whitespace-delimited fields, so you print the second. If you can assume that only the line with your branch has the *, you can drop the ^. Ah, bash golf!
Sorry this is another command-line answer, but that's what I was looking for when I found this question and many of these answers were helpful. My solution is the following bash shell function:
get_branch () {
git rev-parse --abbrev-ref HEAD | grep -v HEAD || \
git describe --exact-match HEAD 2> /dev/null || \
git rev-parse HEAD
}
This should always give me something both human-readable and directly usable as an argument to git checkout
.
- on a local branch:
feature/HS-0001
- on a tagged commit (detached):
v3.29.5
- on a remote branch (detached, not tagged): SHA1
- on any other detached commit: SHA1
git checkout
. –
Reiner A less noisy version for git status would do the trick
git status -bsuno
It prints out
## branch-name
Why not use git-aware shell prompt, which would tell you name of current branch? git status
also helps.
How git-prompt.sh from contrib/
does it (git version 2.3.0), as defined in __git_ps1
helper function:
First, there is special case if rebase in progress is detected. Git uses unnamed branch (detached HEAD) during the rebase process to make it atomic, and original branch is saved elsewhere.
If the
.git/HEAD
file is a symbolic link (a very rare case, from the ancient history of Git), it usesgit symbolic-ref HEAD 2>/dev/null
Else, it reads
.git/HEAD
file. Next steps depends on its contents:If this file doesn't exist, then there is no current branch. This usually happens if the repository is bare.
If it starts with
'ref: '
prefix, then.git/HEAD
is symref (symbolic reference), and we are on normal branch. Strip this prefix to get full name, and striprefs/heads/
to get short name of the current branch:b="${head#ref: }" # ... b=${b##refs/heads/}
If it doesn't start with
'ref: '
, then it is detached HEAD (anonymous branch), pointing directly to some commit. Usegit describe ...
to write the current commit in human-readable form.
I hope that helps.
git describe --contains --all HEAD
which I don't currently see elsewhere on this page. As I'm sure you know, link-only answers are not recommended on StackOverflow. –
Autonomic git-prompt.sh
(aka __git_ps1
) does it... –
Demount I would try one of the following:
1.> git symbolic-ref --short HEAD
git symbolic-ref --short HEAD
>>> sid-dev
git branch --show-current
>>> sid-dev
3.> git name-rev –name-only HEAD
git name-rev –name-only HEAD
>>> HEAD sid-dev
Notes:
1.> git symbolic-ref --short HEAD displays the short symbolic reference to the current branch’s HEAD. This is the current branch name.
2.> git branch --show-current is also a simple and efficient way to print the current branch name.
3.> git name-rev –name-only HEAD gives the symbolic name for
HEAD
revision of the current branch
4.> In the above examples,
sid-dev
is the name of my branch.
There is various way to check the current branch of Git
but I prefer :
git branch --show
Even git branch
also shows the current branch name along with all existing branch name list.
--show
flag; apparently this works because it's unambiguous abbreviation of --show-current
. E.g. --sho
and --show-cu
also work... –
Wellmannered #!/bin/bash
function git.branch {
br=`git branch | grep "*"`
echo ${br/* /}
}
git.branch
you can use git bash on the working directory command is as follow
git status -b
it will tell you on which branch you are on there are many commands which are useful some of them are
-s
--short Give the output in the short-format.
-b --branch Show the branch and tracking info even in short-format.
--porcelain[=] Give the output in an easy-to-parse format for scripts. This is similar to the short output, but will remain stable across Git versions and regardless of user configuration. See below for details.
The version parameter is used to specify the format version. This is optional and defaults to the original version v1 format.
--long Give the output in the long-format. This is the default.
-v --verbose In addition to the names of files that have been changed, also show the textual changes that are staged to be committed (i.e., like the output of git diff --cached). If -v is specified twice, then also show the changes in the working tree that have not yet been staged (i.e., like the output of git diff).
git status
will also give the branch name along with changes.
e.g.
>git status
On branch master // <-- branch name here
.....
Over time, we might have a really long list of branches.
While some of the other solutions are great, Here is what I do (simplified from Jacob's answer):
git branch | grep \*
Now,
git status
works, but only If there are any local changes
I recommend using any of these two commands.
git branch | grep -e "^*" | cut -d' ' -f 2
OR
git status | sed -n 1p | cut -d' ' -f 3
OR (more verbose)
git status -uno -bs| cut -d'#' -f 3 | cut -d . -f 1| sed -e 's/^[ \t]//1'| sed -n 1p
In Netbeans, ensure that versioning annotations are enabled (View -> Show Versioning Labels). You can then see the branch name next to project name.
What about this?
{ git symbolic-ref HEAD 2> /dev/null || git rev-parse --short HEAD 2> /dev/null } | sed "s#refs/heads/##"
symbolic-ref
part also need --short
to avoid prefixing the branchname with refs/heads/
? –
Recession You can permanently set up your bash output to show your git-branch name. It is very handy when you work with different branches, no need to type $ git status
all the time.
Github repo git-aware-prompt
.
Open your terminal (ctrl-alt-t) and enter the commands
mkdir ~/.bash
cd ~/.bash
git clone git://github.com/jimeh/git-aware-prompt.git
Edit your .bashrc with sudo nano ~/.bashrc
command (for Ubuntu) and add the following to the top:
export GITAWAREPROMPT=~/.bash/git-aware-prompt
source "${GITAWAREPROMPT}/main.sh"
Then paste the code
export PS1="\${debian_chroot:+(\$debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\] \[$txtcyn\]\$git_branch\[$txtred\]\$git_dirty\[$txtrst\]\$ "
at the end of the same file you pasted the installation code into earlier. This will give you the colorized output:
The following shell command tells you the branch that you are currently in.
git branch | grep ^\*
When you don't want to type that long command every time you want to know the branch and you are using Bash, give the command a short alias, for example alias cb
, like so.
alias cb='git branch | grep ^\*'
When you are in branch master and your prompt is $
, you will get * master
as follows.
$ cb
* master
git branch | grep '^\*'
–
Ferrol git branch | grep ^\* | awk '{print $2}'
–
Ferrol I have a simple script called git-cbr
(current branch) which prints out the current branch name.
#!/bin/bash
git branch | grep -e "^*"
I put this script in a custom folder (~/.bin
). The folder is in $PATH
.
So now when I'm in a git repo, I just simply type git cbr
to print out the current branch name.
$ git cbr
* master
This works because the git
command takes its first argument and tries to run a script that goes by the name of git-arg1
. For instance, git branch
tries to run a script called git-branch
, etc.
Returns either branch name or SHA1 when on detached head:
git rev-parse --abbrev-ref HEAD | grep -v ^HEAD$ || git rev-parse HEAD
This is a short version of @dmaestro12's answer and without tag support.
git symbolic-ref --quiet --short HEAD || git rev-parse --short HEAD
–
Gausman A simple hack could be
git branch|grep "*"
Output:
* <current branch>
EDIT:
Another way to know current branch
git status|head -1
On branch <current branch name>
if you run in Jenkins, you can use GIT_BRANCH variable as appears here: https://wiki.jenkins-ci.org/display/JENKINS/Git+Plugin
The git plugin sets several environment variables you can use in your scripts:
GIT_COMMIT
- SHA of the currentGIT_BRANCH
- Name of the branch currently being used, e.g. "master" or "origin/foo"GIT_PREVIOUS_COMMIT
- SHA of the previous built commit from the same branch (the current SHA on first build in branch)GIT_URL
- Repository remote URLGIT_URL_N
- Repository remote URLs when there are more than 1 remotes, e.g. GIT_URL_1, GIT_URL_2GIT_AUTHOR_EMAIL
- Committer/Author EmailGIT_COMMITTER_EMAIL
- Committer/Author Email
If you really want the last branch/tag checked out in detached HEAD state as well.
git reflog HEAD | grep 'checkout:' | head -1 | rev | cut -d' ' -f1 | rev
Update This is nicer if you have and aren't scared of awk.
git reflog HEAD | grep 'checkout:' | head -1 | awk '{print $NF}'
rev | cut -d' ' -f1| rev
can be simplified with awk '{print $NF}'
–
Farmstead checkout: moving from ba7571b7fc5b8f31b8d0625821269afaa655577e to f68be8cf7bea917a5a0562b619e50368de0068a9
it is still a useful trick that might help to disambiguate some cases. –
Wynd git reflog | awk '$3=="checkout:" {print $NF; exit}'
–
Wheal I know this is late but on a linux/mac ,from the terminal you can use the following.
git status | sed -n 1p
Explanation:
git status -> gets the working tree status
sed -n 1p -> gets the first line from the status body
Response to the above command will look as follows:
"On branch your_branch_name"
head -1
would the usual way –
Vermicelli Use git branch --contains HEAD | tail -1
it also works for "detached HEAD" state.
Add it to PS1
using Mac :
PS1='\W@\u >`[ -d .git ] && git branch | grep ^*|cut -d" " -f2`> $ '
Before running the command above :
After running that command :
Dont worry, if it is not GIT repository , it will not display error because of [-d .git]
which checks if .git
folder exists or not.
I wanted a single line that I could parse in a Windows CMD shell (most of the answers here use unix commands). Most of the answers also had problems with sparse checkouts and detached heads.
git branch
gives a list of branches that are available in the working copy, with an * in front of the checked out one. This is good for a quick look but not for parsing.
git rev-parse --abbrev-ref HEAD
just showed HEAD as the branch when using it on a detached HEAD checkout. Similarly when using
git symbolic-ref HEAD
I got fatal: ref HEAD is not a symbolic ref when using a detached head that was from a tag.
git describe --contains --all HEAD
seems to work most of the time and was close to what I want, but with some repos just returned a blank line.
git status
works except it lists all differences in the repo which makes it a bit difficult to parse.
I ended up settling on the following;
git status |findstr/n ^^|findstr "^[1]: ^[0]:"
This gives output like the following;
1:HEAD detached at 2.30.20
or
1:On branch master
In case your CI server does not have environment variable with branch name and you have a dockerized build without git
binary inside of container, you can just use:
cat .git/HEAD | awk -F '/' '{print $NF}'
.git/HEAD
will only contain the SHA of the corresponding commit. –
Stuckey cat
is superfluous. Simply doing awk -F '/' '{print $NF}' $PATH/to/.git/HEAD
–
Attenuator feature/foo
, as you will only get foo
. –
Underwrite I've been battling with CircleCI and git tags and this is what I ended up with:
if [[ -n $(git branch --show-current) ]]; then
git branch --show-current
else
git branch -a --contains $(git rev-parse --short HEAD) \
| sed '/HEAD/d' \
| sed 's/remotes\/origin\///g' \
| sed 's/\*//g' | sed 's/ *//g' \
| awk '!_[$0]++'
fi
While it's a bit ugly, it does
- work for regular commits: it just uses git's
--show-current
flag and if that worked we need to look no further; both locally and on the CI container - work for tags: when the head is detached, it will get the remote branch name instead.
Caveats:
- This works fine as long as the tagged commits only appear on one branch. So if you're normally merging to say
dev
and from there viastaging
toproduction
, the original commit fromdev
will appear on all three branches, thereby breaking this code. But as long as you only ever tag the merge/PR commit - This requires to run
git fetch -a
to be run beforehand since the CI will only check out the default branch and the tagged commit so if the correct branch is neither of these it won't work
Some more explanation:
- I wanted to get the branch name, even when a CI build was triggered by a tag. In that case, the CircleCI
pipeline.git.branch
variable is not set nor can I easily get the branch name from git as the head is detached (as pointed out in many of the other questions). This means grepping the current branch (using the*
prefix) doesn't work either as on the CI, the current branch will be the detached head one. - The idea is to get all branches that include this commit (including remote ones); then remove the detached head result, get rid of all bits that aren't the actual branch name and de-duplicate
git branch | grep "*" | sed "s/* //" | awk '{printf $0}' | pbcopy
To directly copy the result to the pasteboard. Thanks to @olivier-refalo for the start…
grep | sed | awk
can usually be easily refactored to just one Awk script. (What's the point of printf $0
anyway? To trim the final newline? tr -d '\n'
does that much better.) Also, grep "*"
is technically a syntax error. Anyway, git branch | awk '/\*/ { gsub(/\* /,""); printf $0 } | pbcopy
is a simple refactoring of your script. –
Autonomic git branch | awk '/^\*/ { printf $2 }'
(as already posted above) is much better. –
Autonomic sed
is cheaper than awk
: git branch | sed -ne '/^\* / { s///; p; q }'
–
Induration On Shell, You can do the following
git branch | grep '*'
Just the name of the current branch if on a branch, but if detached then print the current commit id:
git symbolic-ref --short HEAD 2>/dev/null || git rev-parse --short HEAD
The first part will return an error if detached, and the second part will always print the current commit id.
Using earlier ideas; assuming sha1 is 40 characters; and chasing references (yea, should delete the debug print lines :-):
git reflog | awk '
$3 == "checkout:" && (sha == "" || sha == $1 ) {
from=$(NF - 2)
to=$NF
print from, to, length(from) > "/dev/stderr"
if (length(from) != 40) { print from ; exit; }
sha=substr(from, 1, 7)
print sha > "/dev/stderr"
}
'
gives the raw output:
$ git status
HEAD detached at 147049c
[...]
$ ./gime-branch.sh
a47be8d2167641088b66bf8f5c2bf7d3da0c642c HEAD^ 40
a47be8d
master HEAD^ 6
master
Short answer:
git branch --show-current
To put it in a variable in a bash script for example:
@current_branch=$$(git branch --show-current);
Simply, add following lines to your ~/.bash_profile
:
branch_show() {
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
}
export PS1="\u@\h \[\033[32m\]\w\[\033[33m\]\$(branch_show)\[\033[00m\] $ "
In this way, you can have the current branch name in Terminal
Courtesy of Coderwall.com
You can do this with a single grep instruction, using Perl mode and \K
to reset the match buffer, so you get only the branch name.
$ git branch | grep -oP "^\*\s+\K\S+$"
master
git log
This command will display the commits list with the current branch name at the top.
You can also see name of current branch in your .git directory of current project.
type command in terminal: open .git/HEAD output file contains the name of current branch ref: refs/heads/{current_working_branch}
Tried above answers but there is always 'detached HEAD' issue that comes with several commands. This ones works for me so far. It will correctly output the branch name even if the branch name contains /
in the name
git describe --all --exact-match | sed 's/heads\///'
I know this has been answered already, but in the most recent version of Git the command git branch
opens a list of your branches in some kind of prompt that you have to quit out of. Which annoys me to no end!
Here's my fix: Open your bash profile and type this in:
#!/bin/bash
git() {
if [[ $@ == "branch" ]] then
command git branch -a | grep -v 'remotes'
else
command git "$@"
fi
}
Now open Terminal and test it out by typing the following commands in a git repo:
source ~/.zshrc
git branch
And voila! A list of your local branches is printed out in your terminal.
The code you're writing to your bashrc file overwrites the default function for git branch
and replaces it with a much longer command that lists all local branches via the -a
argument. Then we grep
out the extra not needed business and print it out. If you exclude the grep
command you'll still get the annoying prompt. If you're not familiar with writing bash commands checkout this explanation: About .bash_profile, .bashrc, and where should alias be written in?
--all
which always display remotes, and is not the default. Secondly, the pagination prompt is triggered by a long list, so the above grep filter only benefits until the number of local branches is longer than screen height. –
Amadis © 2022 - 2024 — McMap. All rights reserved.
.git/HEAD
, possibly in a parent directory – Sanativegit branch --show-current
is the wrong solution. I have 2.25.1 and it created a branch in my local repo called --show-current instead of showing the current branch – Haynesget status
, the most used command, shows the branch you are currently on. Or do you use a smart gui tool that hides git status? – Blueprintgit symbolic-ref --short HEAD
is the most safe answer. Other answers require caution of exit status and/or printed value with a detachedHEAD
. – Coccigit rev-parse --abbrev-ref HEAD
– Brute