1002
votes

git branch -a shows both remote and local branches.

git branch -r shows remote branches.

Is there a way to list just the local branches?

11

11 Answers

1533
votes

Just git branch without options.

From the manpage:

With no arguments, existing branches are listed and the current branch will be highlighted with an asterisk.

233
votes

just the plain command

git branch
88
votes

git branch -a - All branches.

git branch -r - Remote branches only.

git branch -l or git branch - Local branches only.

37
votes

One of the most straightforward ways to do it is

git for-each-ref --format='%(refname:short)' refs/heads/

This works perfectly for scripts as well.

35
votes

If the leading asterisk is a problem, I pipe the git branch as follows

git branch | awk -F ' +' '! /\(no branch\)/ {print $2}'

This also eliminates the '(no branch)' line that shows up when you have detached head.

14
votes

Here's how to list local branches that do not have a remote branch in origin with the same name:

git branch | sed 's|* |  |' | sort > local
git branch -r | sed 's|origin/||' | sort > remote
comm -23 local remote
11
votes

Other way for get a list just local branch is:

git branch -a | grep -v 'remotes'
6
votes

There's a great answer to a post about how to delete local only branches. In it, the fellow builds a command to list out the local branches:

git branch -vv | cut -c 3- | awk '$3 !~/\[/ { print $1 }'

The answer has a great explanation about how this command was derived, so I would suggest you go and read that post.

3
votes

To complement @gertvdijk's answer - I'm adding few screenshots in case it helps someone quick.

On my git bash shell

git branch

command without any parameters shows all my local branches. The current branch which is currently checked out is shown in different color (green) along with an asterisk (*) prefix which is really intuitive.

enter image description here

When you try to see all branches including the remote branches using

git branch -a

command then remote branches which aren't checked out yet are shown in red color:

enter image description here

0
votes
git show-ref --heads

The answer by @gertvdijk is the most concise and elegant, but I wanted to leave this here because it helped me grasp the idea that refs/heads/* are equivalent to local branches.

Most of the time the refs/heads/master ref is a file at .git/refs/heads/master that contains a git commit hash that points to the git object that represents the current state of your local master branch, so each file under .git/refs/heads/* represents a local branch.

0
votes

Powershell Users can use its Compare-Object cmdlet to do something like this. Hope the code is self-explanatory.

function match-branch {
    $localBranches = ((git branch -l) -replace "\*", "") -replace " ", ""
    $remoteBranches = (((git branch -r) -replace "\*", "") -replace " ", "") -replace "origin/", ""
    Compare-Object -ReferenceObject $localBranches -DifferenceObject $remoteBranches -IncludeEqual
    | Select-Object @{Label = "branch"; Expression = { $_.InputObject } },
    @{Label = ”both”; Expression = { $_.SideIndicator -eq "==" } },
    @{Label = ”remoteOnly”; Expression = { $_.SideIndicator -eq "=>" } }, 
    @{Label = ”localOnly”; Expression = { $_.SideIndicator -eq "<=" } }
}
  • Example Output
branch        both remoteOnly localOnly
------        ---- ---------- ---------
master        True      False     False
HEAD->master False       True     False
renamed      False       True     False