209

I am using the following command to find out if a local git branch with branch-name exists in my repository. Is this correct? Is there a better way?

Please note that I am doing this inside a script. For this reason I'd like to use plumbing commands if possible.

git show-ref --verify --quiet refs/heads/<branch-name>
# $? == 0 means local branch with <branch-name> exists. 
Michael
  • 5,910
  • 4
  • 52
  • 74
Manoj Govindan
  • 64,355
  • 21
  • 123
  • 132
  • Your command looks like the one I had used. – Paŭlo Ebermann Mar 02 '11 at 15:21
  • 6
    In my ignorance, I'd have gone with `git branch | grep -w `. Ok, it's a porcelain command, but I can't imagine this particular usage to be change significantly in the future as to make this snippet unusable... – UncleZeiv Mar 02 '11 at 16:27
  • @UncleZeiv: You are probably right that the command wouldn't change significantly to make it unusable. I have a bit of an OCD about such things like porcelain versus plumbing, that's all. – Manoj Govindan Mar 02 '11 at 16:37
  • 11
    `git rev-parse --verify ` verifies also other references such as tags and commit hashes, so although it might be more suitable for what you need it will return false positives if you are only interested precisely in branches. – Paul S. Jun 22 '15 at 13:37
  • Very minor thing, but in the **Update** section, it should be `git rev-parse --verify ` (i.e. `branch-name` instead of `branch_name`)? – Gautam Jul 26 '16 at 13:45
  • 2
    Only the git show-ref is working to determine if a LOCAL branch is present. In the update (syntax with git rev-parse), the return code is also 0 if a remote branch matches. – Fabien Bouleau Sep 05 '17 at 11:24
  • An example where plumbing or porcelain/exit-code combo works better than `git branch` is in a sh script: `if git show-ref --verify --quiet refs/heads/main; then DEFAULT_BRANCH=main` – Dereckson Sep 28 '20 at 14:22

16 Answers16

113

When I search for 'git check if branch exists' on a search engine, this page is the first one I see.

I get what I want, but I'd like to provide a updated answer since the original post was from 2011.

git rev-parse --verify <branch_name>

This is essentially the same as the accepted answer, but you don't need type in "refs/heads/"

jhuynh
  • 1,321
  • 2
  • 8
  • 4
  • 24
    Just a note: `git rev-parse --verify` only tells you if such an object exists in the repo (i.e. it'll return 0 for any value of `` that translates to an object of any type in the repo). It doesn't tell you if that object is a branch or not. – tavnab Oct 05 '15 at 18:24
  • 11
    This is not a correct answer to the question, which is asking how to know if a branch exists. This will give you a false positive for a tag. You can easily test this yourself. You need refs/heads/ to distinguish from tags which are in refs/tags, and even remotes in refs/remotes. – msouth Jun 30 '16 at 20:08
  • 16
    **git rev-parse --verify gh-pages** gives me: fatal: Needed a single revision – SuperUberDuper Nov 22 '16 at 18:10
  • @SuperUberDuper did you try: git rev-parse --verify **origin/**gh-pages? – RoyalBigMack Dec 23 '18 at 12:11
63

As far as I know, that's the best way to do it in a script. I'm not sure there's much more to add to that, but there might as well be one answer that just says "That command does everything you want" :)

The only thing you might want to be careful of is that branch names can have surprising characters in them, so you may want to quote <branch-name>.

kaligne
  • 2,408
  • 4
  • 29
  • 52
Mark Longair
  • 385,867
  • 66
  • 394
  • 320
  • 1
    good point about quoting ``. FWIW I am using this in a fabric script. I'll remember to quote the variable. – Manoj Govindan Mar 02 '11 at 16:33
  • The correct answer is this implicitly: git show-ref --verify --quiet refs/heads/ will show that HEAD is not a branch correctly. git rev-parse --verify will tell you HEAD is an existing branch. False because HEAD is not a branch. – Paulo Neves Jul 13 '17 at 06:46
38

Almost there.

Just leave out the --verify and --quiet and you get either the hash if the branch exists or nothing if it doesn't.

Assign it to a variable and check for an empty string.

exists=`git show-ref refs/heads/<branch-name>`
if [ -n "$exists" ]; then
    echo 'branch exists!'
fi
Martijn
  • 3,422
  • 2
  • 33
  • 60
22

I recommend git show-ref --quiet refs/heads/$name.

  • --quiet means there is no output, which is good because then you can cleanly check exit status.

  • refs/heads/$name limits to local branches and matches full names (otherwise dev would match develop)

Usage in a script:

if git show-ref --quiet refs/heads/develop; then
    echo develop branch exists
fi
Razzi Abuissa
  • 1,996
  • 2
  • 20
  • 21
  • Yup this is the only one that does it silently. The naming of git commands is a bit wack tbh – smac89 Sep 17 '17 at 05:56
  • Weird that i had to scroll down three answers to get the best solution. I suppose this answer will eventually make it to the top. – ijoseph Jan 31 '21 at 00:05
15

I think you can use git show-branch here.

$ git show-branch --list
  [master] test
* [testbranch] test
$ git show-branch testbranch
[testbranch] test
$ echo $?
0
$ git show-branch nonexistantbranch
fatal: bad sha1 reference nonexistantbranch
$ echo $?
128

So, $? == 0 would indicate that the branch exists and you don't have to dig in to the plumbing of refs/heads/ at all. As long as you don't pass -r to show-branch, it will only operate on local branches.

Mark Drago
  • 1,792
  • 13
  • 9
  • 5
    AFAIK `git show-branch` is a _porcelain_ command. As I've said in my question I'd rather not use porcelain commands in a script if plumbing equivalents are available. See http://www.kernel.org/pub/software/scm/git/docs/ – Manoj Govindan Mar 02 '11 at 13:36
  • 3
    @Manoj: I know about porcelain vs. plumbing, but I had never read that the plumbing was considered to be more stable than the porcelain. Thanks for pointing me to that in the docs. – Mark Drago Mar 02 '11 at 13:42
  • To avoid finding tags by mistake, and to be more specific about whether the branch is local or remote, you can specify `git show-branch refs/heads/[branch]` or `git show-branch refs/remotes/origin/[branch]`. – twasbrillig Mar 16 '18 at 20:42
14

For use in a script:

git show-ref -q --heads <branch-name>

This will exit 0 if and only if <branch-name> exists as a local branch.

Example:

if git show-ref -q --heads <branch-name>; then
   echo 'Branch exists'
fi
Tom Hale
  • 25,410
  • 16
  • 132
  • 172
2

Let's call it git is_localbranch (you need to add alias in .gitconfig).

Usage:

$ git is_localbranch BRANCH

Source:

git branch | grep -w $1 > /dev/null
if [ $? = 0 ]
then
  echo "branch exists"
fi
  • If it's called git-is_localbranch and is available in any directory in the PATH, you don't need to alias it in .gitconfig: git will seek a git- executable, e.g. git foo will seek a git-foo executable. – Dereckson Sep 28 '20 at 14:26
2

On windows batch script it is bit different,

git rev-parse --verify <branch>

if %ERRORLEVEL% == 0  (
    echo "Yes"
) else (
    echo "No"
)
pinkal vansia
  • 9,651
  • 5
  • 46
  • 62
2

Yup, there is one.

git rev-parse [<options>] <args>…​

See https://git-scm.com/docs/git-rev-parse where you can find the set of arguments and the function.

git rev-parse --verify <branch-name>
Benjamin W.
  • 33,075
  • 16
  • 78
  • 86
1

The outcome of review on my 'Suggested Edit' to the 'Update' on initial question was 'It should have been written as a comment or an answer', so I'm posting it here:

The another way proposed will not only verify branches but any reference with such name @jhuynh.

git rev-parse --verify <reference-name>
# $? == 0 means reference with <reference-name> exists.

Issue with an 'Update' on initial quiestion explained:

Lets assume and check that 'master.000' is only a tag, such local branch does not exist, grep returns one entry wchich is a tag. Still rev-parse will return 0 if reference exists, even if such local branch does not exist. This is a false match, exactly as mentioned by @paul-s

$ git show-ref |grep master.000

f0686b8c16401be87e72f9466083d29295b86f4a refs/tags/master.000
$ git rev-parse --verify master.000
f0686b8c16401be87e72f9466083d29295b86f4a
$ echo $?
0
Community
  • 1
  • 1
Pshemy108
  • 185
  • 2
  • 9
1

Neither git show-ref nor git rev-parse works on my case.

$ git --version
git version 2.21.0

$ git show-branch --list
* [master] mybranch commit

$ BRANCH_NAME=mybranch
$ git rev-parse --verify $BRANCH_NAME
fatal: Needed a single revision

$ git show-ref refs/heads/$BRANCH_NAME
<no otput>
$ [ $? == 0 ] && echo "$BRANCH_NAME exists" || echo "$BRANCH_NAME not exists"
mybranch not exists

I ended up with this

$ BRANCH_NAME=mybranch
$ SHOW_ALL=`git show-branch --all | grep -w $BRANCH_NAME`
$ [ $? == 0 ] && echo "$BRANCH_NAME exists" || echo "$BRANCH_NAME not exists"
mybranch exists

You can do also with a script file

#!/bin/sh
BRANCH_NAME=mybranch
if grep -Fqe $BRANCH_NAME << EOF
`git show-branch --all`
EOF
then
   echo "$BRANCH_NAME exists"
else
   echo "$BRANCH_NAME not exists"
fi
William Desportes
  • 728
  • 10
  • 20
Chetabahana
  • 7,806
  • 2
  • 50
  • 70
  • 1
    the problem with grepping for just the branch name is you might have two branches with that name as a subset of the branch name. Even with the -w flag to grep, you could have branches mybranch, v2-mybranch, conrad-mybranch, etc – Jason Harrison Mar 23 '21 at 20:25
1
git show-branch <BRANCH-NAME> &>/dev/null && echo yes || echo no
Vojtech Vitek
  • 19,072
  • 3
  • 27
  • 32
0

This is how I implemented it, looks more stable I think

$branchExists = git ls-remote $gitUrl $gitBranch
if(!([bool]$branchExists))
{
   Write-Host "branch $branchName does not exist"  
} 
else
{
   Write-Host "branch $branchName exists"         
}

If the branch exists the content of the branchExist variable would be something like:

hashcode of branch name         feature/my_branch
Shilan
  • 726
  • 9
  • 17
-1

If you can manage to include grep.

git branch | grep -q <branch>
Daniel Vikström
  • 261
  • 1
  • 2
  • 6
  • 1
    That might give you the wrong answer if you use dots (".") in branch names, like I sometimes do, since the dot is interpreted by `grep` as a metacharacter. – Peter John Acklam Feb 17 '15 at 08:17
  • 1
    You will also get a false positive if you test for a branch whose name is a substring of a real branch. e.g. `abc` will match if there is a branch called `abcdef`. – rjmunro Sep 25 '15 at 14:10
-1

For use in a script, I recommend the following command:

git ls-remote --heads <repo_url> "<branch_name>" | wc -l

Note that <repo_url> can just be a "." to specify the local repo if you are inside its directory structure, the path to a local repo, or the address of a remote repo.

The command returns a 0 if the <branch_name> is not present of 1 if present.

David
  • 15
  • 2
-1
git branch --list $branch_name | grep $branch_name

then check the return value is 0 or 1.

Benjamin W.
  • 33,075
  • 16
  • 78
  • 86
Howell ZHU
  • 27
  • 2
  • Tried this, It will return 0 everytime. You could do git branch -a | grep remotes/origin/Catalog_3.2.3.07 | wc -l – NiharGht Apr 26 '21 at 16:19