How do I list all remote branches in Git 1.7+?
Asked Answered
S

22

884

I've tried git branch -r, but that only lists remote branches that I've tracked locally. How do I find the list of those that I haven't? (It doesn't matter to me whether the command lists all remote branches or only those that are untracked.)

Soccer answered 12/8, 2010 at 20:37 Comment(3)
You mean you've modified the default refspec, so that git fetch and git remote update don't fetch all the remote's branches? Because otherwise you could just fetch then use git branch -r...Bracken
I must have. git branch -r was only showing me remote branches that I had tracked locally. It's working better now.Soccer
git remote show originCastorena
S
1130

For the vast majority[1] of visitors here, the correct and simplest answer to the question "How do I list all remote branches in Git 1.7+?" is:

git branch -r

For a small minority[1] git branch -r does not work. If git branch -r does not work try:

git ls-remote --heads <remote-name>

If git branch -r does not work, then maybe as Cascabel says "you've modified the default refspec, so that git fetch and git remote update don't fetch all the remote's branches".


[1] As of the writing of this footnote 2018-Feb, I looked at the comments and see that the git branch -r works for the vast majority (about 90% or 125 out of 140).

If git branch -r does not work, check git config --get remote.origin.fetch contains a wildcard (*) as per this answer

Salmanazar answered 12/8, 2010 at 21:44 Comment(10)
You can also do git ls-remote [url] so you don't have to clone it first :)Teleutospore
@Stephan: are you sure about this? git branch -ralso did not work for me. It's just listing the branches already tracked locally. But git ls-remote --heads listed all branches available on the remote repository ...Yate
@Stephan: looks like you're right, anyway. The comment by nielsbot below resolved this issue for me: seems this doesn't list all remote branches if I clone from an existing pulled repo and then manually point origin at the git server.Yate
Looks like if your remote is origin you can skip referencing it, as it's the default.Dwelling
If one wants to fetch from the branches listed via git ls-remote (and not listed at git branch -r), one has to execute git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*" before fetching as described at https://mcmap.net/q/54778/-git-fetch-does-not-download-remote-branches.Larrainelarrie
Option -r causes the remote-tracking branches to be listed, and option -a shows both local and remote branches.Ruche
Don't forget to do git fetch --all before to get all the current remote branches.Ordonez
The first part of this answer is wrong. Out of the box without modifying refspec anywhere, git branch -r simply does not list all remote branches in all cases. Moreover, because it cannot reliably get all branches, it really shouldn't be trusted in the other "90%" cases either.Ascariasis
probably a good idea to mention that git fetch should be run first right?Ilianailine
@Yate made a valid point. git branch -r tells you at what remote branches your (or just fetched) local branches point at. it does not tell you if they actually exist or not at origin. Yes, it's a common case that it HAPPENS to be the correct list, but not always (for 5 years at 2 jobs I never hit a mismatch). git ls-remote --heads actually lists only existing remote branches.Buckjump
F
221

remote show shows all the branches on the remote, including those that are not tracked locally and even those that have not yet been fetched.

git remote show <remote-name>

It also tries to show the status of the branches relative to your local repository:

> git remote show origin
* remote origin
  Fetch URL: C:/git/.\remote_repo.git
  Push  URL: C:/git/.\remote_repo.git
  HEAD branch: master
  Remote branches:
    branch_that_is_not_even_fetched new (next fetch will store in remotes/origin)
    branch_that_is_not_tracked      tracked
    branch_that_is_tracked          tracked
    master                          tracked
  Local branches configured for 'git pull':
    branch_that_is_tracked merges with remote branch_that_is_tracked
    master                 merges with remote master
  Local refs configured for 'git push':
    branch_that_is_tracked pushes to branch_that_is_tracked (fast-forwardable)
    master                 pushes to master                 (up to date)
Foregut answered 26/3, 2013 at 6:12 Comment(8)
Exactly. Not fetched, not tracked locally.Posture
branch_that_is_not_tracked tracked ?Furie
@PiotrDobrogost Yes! branch_that_is_not_tracked is a branch that is not tracked by any local git branch. However, it has been fetched to the local repository (so there is a remote branch). For some strange reason git remote show calls this state tracked, even though there is no local branch that tracks the remote. In this case, the opposite of tracked is new, meaning "not fetched".Foregut
this doesnt work programmatically, too difficult to parseIlianailine
This caught a special case I had where I had pulled a remote branch locally which had then been removed on the remote. Then git branch -r suggests that there is a remote branch still, but git remote show origin shows that refs/remotes/origin/my-now-dead-branch stale (use 'git remote prune' to remove). Much more useful!Kikelia
it works good, but impossible to parse in bash to get just branches listMcdougald
git remote show origin shows stale branches, i.e., branches that do not exist on remote anymore. Doing git remote prune origin deletes the stale branches, and then the output matches what git branch -r shows.Coleville
Also, I had to run git remote update origin for unclear reasons, before git actually properly pulled all remote branches. See https://mcmap.net/q/11973/-fetch-in-git-doesn-39-t-get-all-branchesColeville
L
65

Using git branch -r lists all remote branches and git branch -a lists all branches on local and remote. These lists get outdated though. To keep these lists up-to-date, run

git remote update --prune

which will update your local branch list with all new ones from the remote and remove any that are no longer there. Running this update command without the --prune will retrieve new branches but not delete ones no longer on the remote.

You can speed up this update by specifying a remote, otherwise it will pull updates from all remotes you have added, like so

git remote update --prune origin
Lepanto answered 28/4, 2014 at 18:34 Comment(2)
This fixed my problem - 'git branch -r' now works for me.Gauffer
Note to self: git remote update --prune is equal to git fetch --all --prunePincas
K
57
git branch -a | grep remotes/*
Klockau answered 12/8, 2010 at 20:48 Comment(5)
This is basically equivalent to git branch -r, which the OP said wasn't good enough.Bracken
actually both git branch -a and git branch -r list all remote branches for me, I'm not sure if what the OP said is true. I just setup a test repository and verified this (only had master tracking origin/master but still saw all remote branches with both flags).Klockau
seems this doesn't list all remote branches if I clone from an existing pulled repo and then manually point origin at the git server. The accepted answer handles this case.Bibby
This solution doesn't seem to list remote branches created since I last fetched.Eroticism
The strange thing: For years I've used git fetch followed by git branch -a, which only recently started to fail for me. Perhaps git behaviour was changed?Albinaalbinism
T
30

But

git branch -ar

should do it.

Therewith answered 24/3, 2013 at 11:25 Comment(1)
Passing in both arguments is redundant. -r returns only remote branches. -a returns both local and remote branches. Thus, git branch -a and git branch -ar both yield the same output.Carruth
S
28

Git Branching - Remote Branches

git ls-remote

Git documentation.

Shelia answered 14/8, 2016 at 14:35 Comment(3)
git ls-remote --heads to get more specific resultsKelwin
This is the only command that also lists my branch I accidentally pushed without heads/ in refs/heads/features/my-branch, thanks!Interpret
I like this. If you want to filter then you can use grep like this: git ls-remote | grep "your_filter".Cloud
A
24

You also may do git fetch followed by a git branch -r. Without fetch you will not see the most current branches.

Aracelis answered 4/3, 2014 at 9:22 Comment(1)
git fetch --all to have all current branchesOrdonez
D
16

Just run a git fetch command. It will pull all the remote branches to your local repository, and then do a git branch -a to list all the branches.

Dotty answered 19/8, 2019 at 9:33 Comment(1)
-a, that was simple!Leesen
P
13

The simplest way I found:

git branch -a
Persse answered 4/8, 2017 at 14:42 Comment(0)
M
13

Try this...

git fetch origin
git branch -a
Misconception answered 28/2, 2019 at 9:14 Comment(0)
F
12

TL;TR;

This is the solution of your problem:

git remote update --prune    # To update all remotes
git branch -r                # To display remote branches

or:

git remote update --prune    # To update all remotes
git branch <TAB>             # To display all branches
Fuss answered 28/10, 2017 at 16:21 Comment(0)
C
11

With Git Bash, you can use:

git branch -a
Cryogenics answered 12/12, 2017 at 13:13 Comment(0)
E
9

The best command to run is git remote show [remote]. This will show all branches, remote and local, tracked and untracked.

Here's an example from an open source project:

> git remote show origin
* remote origin
  Fetch URL: https://github.com/OneBusAway/onebusaway-android
  Push  URL: https://github.com/OneBusAway/onebusaway-android
  HEAD branch: master
  Remote branches:
    amazon-rc2                   new (next fetch will store in remotes/origin)
    amazon-rc3                   new (next fetch will store in remotes/origin)
    arrivalStyleBDefault         new (next fetch will store in remotes/origin)
    develop                      tracked
    master                       tracked
    refs/remotes/origin/branding stale (use 'git remote prune' to remove)
  Local branches configured for 'git pull':
    develop merges with remote develop
    master  merges with remote master
  Local refs configured for 'git push':
    develop pushes to develop (local out of date)
    master  pushes to master  (up to date)

If we just want to get the remote branches, we can use grep. The command we'd want to use would be:

grep "\w*\s*(new|tracked)" -E

With this command:

> git remote show origin | grep "\w*\s*(new|tracked)" -E
    amazon-rc2                   new (next fetch will store in remotes/origin)
    amazon-rc3                   new (next fetch will store in remotes/origin)
    arrivalStyleBDefault         new (next fetch will store in remotes/origin)
    develop                      tracked
    master                       tracked

You can also create an alias for this:

git config --global alias.branches "!git remote show origin | grep \w*\s*(new|tracked) -E"

Then you can just run git branches.

Eroticism answered 6/7, 2015 at 14:33 Comment(0)
M
9

Assuming you have the following branches on a remote repository: git branch -a gives you:

*remotes/origin/release/1.5.0
 remotes/origin/release/1.5.1
 remotes/origin/release/1.5.2
 remotes/origin/release/1.5.3
 remotes/origin/release/1.6.0

Based on above result command git branch -rl '*/origin/release/1.5*' gives you this:

 origin/release/1.5.1
 origin/release/1.5.2
 origin/release/1.5.3

-r stands for remote

-l list using <pattern>

Mimamsa answered 11/10, 2021 at 17:47 Comment(0)
A
7

The accepted answer works for me. But I found it more useful to have the commits sorted starting with the most recent.

git branch -r --sort=-committerdate

https://git-scm.com/docs/git-branch

Auxiliary answered 25/5, 2020 at 16:34 Comment(0)
C
6

I would use:

git branch -av

This command not only shows you the list of all branches, including remote branches starting with /remote, but it also provides you the * feedback on what you updated and the last commit comments.

Cao answered 24/4, 2019 at 12:39 Comment(0)
S
2

I ended up doing a mess shell pipeline to get what I wanted. I just merged branches from the origin remote:

git branch -r --all --merged \
    | tail -n +2 \
    | grep -P '^  remotes/origin/(?!HEAD)' \
    | perl -p -e 's/^  remotes\/origin\///g;s/master\n//g'
Shantel answered 31/7, 2015 at 18:49 Comment(0)
O
2

If there's a remote branch that you know should be listed, but it isn't getting listed, you might want to verify that your origin is set up properly with this:

git remote show origin

If that's all good, maybe you should run an update:

git remote update

Assuming that runs successfully, you should be able to do what the other answers say:

git branch -r
Overvalue answered 23/7, 2019 at 20:0 Comment(0)
H
1

Using this command,

git log -r --oneline --no-merges --simplify-by-decoration --pretty=format:"%n %Cred CommitID %Creset: %h %n %Cred Remote Branch %Creset :%d %n %Cred Commit Message %Creset: %s %n"

CommitID       : 27385d919
Remote Branch  : (origin/ALPHA)
Commit Message :  New branch created

It lists all remote branches including commit messages and commit IDs that are referred to by remote branches.

Hogg answered 1/3, 2018 at 12:53 Comment(0)
I
0

Make sure that the remote origin you are listing is really the repository that you want and not an older clone.

Insist answered 13/6, 2014 at 9:28 Comment(0)
F
0

Use this command to get all the branches,

git fetch --all

Firry answered 28/11, 2022 at 4:8 Comment(0)
C
0

What about stale branches?

The other answers don't account for stale branches. Stale branches are references to remote branches that don't actually exist on remote anymore.

The top-voted answer does not return stale branches:

git branch -r

However, if you run this, you will get stale branches:

git remote show <remote>

To delete the stale branches, you can do

git remote prune <remote>

What if git is not fetching all remote branches?

Sometimes this happens, where git pull or git fetch does not pull branches from origin.

To fix that, take a look at this question. In particular, you might want to run:

git remote update <remote>

Then when you do git fetch, all remote branches will actually be fetched.

See https://mcmap.net/q/11973/-fetch-in-git-doesn-39-t-get-all-branches

Coleville answered 8/5, 2023 at 15:13 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.