ChatGPT解决这个技术问题 Extra ChatGPT

Git: How do I list only local branches?

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?


L
LHM

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.


I was hoping to find a way to list local branches that have no corresponding remote branch.
Not completely but answers to my question How do I list local branches that have no remote branch provide some help.
@c00kiemon5ter I love how you found a way to get a bunch of points anyway! So funny.
how is this the right answer to what was asked ("... to list *just the local branches...")???
@gr4viton: In the dialects of English that I'm familiar with, "list only local branches" usually parses as "list only those branches that are local". (To say "list those branches that are only local", I would say "list local-only branches".)
P
Peter Mortensen

Just the plain command

git branch

P
Peter Mortensen

git branch -a - All branches.

git branch -r - Remote branches only.

git branch - Local branches only.


V
Victor Yarema

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.


Exactly what I was looking for git branch tends to list things that are not local branches ... like HEAD.
Thanks for showing the scripting-friendly way to do it!
J
John Marter

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.


Had to modify this to git branch | awk -F ' +' '$2 !~ /detached/ {print $2}' for git version 1.9.1.
cut -c 3- is an easier option
w
wjandrea

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

Nice, also oneliner: comm -23 <(git branch | sed 's|* | |' | sort) <(git branch -r | sed 's|origin/||' | sort )
j
jlsanchezr

Other way for get a list just local branch is:

git branch -a | grep -v 'remotes'

P
Peter Mortensen

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.


Thank you for linking the answer. I needed an algo to list local branches that DO NOT track a remote. This one is the only one that does the job.
P
Peter Mortensen

To 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 branch

This 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.

https://i.stack.imgur.com/dTpXW.png

When you try to see all branches including the remote branches using -a(stands for all) parameter:

git branch -a

Then remote branches which aren't checked out yet are also shown in different (red) color:

https://i.stack.imgur.com/ycNSI.png


P
Peter Mortensen

Use:

git show-ref --heads

The 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.


P
Peter Mortensen

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