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 Answers
Just git branch without options.
From the manpage:
9With no arguments, existing branches are listed and the current branch will be highlighted with an asterisk.
Just the plain command
git branch 0 git branch -a - All branches.
git branch -r - Remote branches only.
git branch - Local branches only.
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.
2If 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.
2Here'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 1 Other way for get a list just local branch is:
git branch -a | grep -v 'remotes' 0 There's a great answer to a post about how to delete local-only branches. In it, the following 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.
1To complement gertvdijk's answer - I'm adding few screenshots in case it helps someone quick.
In my Git Bash shell if I run below command:
git branchThis command (without 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.
When you try to see all branches including the remote branches using -a(stands for all) parameter:
git branch -aThen remote branches which aren't checked out yet are also shown in different (red) color:
0Use:
git show-ref --headsThe answer by gertvdijk is the most concise and elegant, but this may help 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.
PowerShell users can use its Compare-Object cmdlet to do something like this:
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