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.)
22 Answers
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
10 Comments
git ls-remote [url] so you don't have to clone it first :)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 ...git fetch --all before to get all the current remote branches.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.git fetch should be run first right?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) 8 Comments
branch_that_is_not_tracked tracked ?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".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!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 2 Comments
git remote update --prune is equal to git fetch --all --prunegit branch -a | grep remotes/* 5 Comments
git branch -r, which the OP said wasn't good enough.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).git fetch followed by git branch -a, which only recently started to fail for me. Perhaps git behaviour was changed?3 Comments
heads/ in refs/heads/features/my-branch, thanks!But
git branch -ar
should do it.
1 Comment
-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.You also may do git fetch followed by a git branch -r. Without fetch you will not see the most current branches.
1 Comment
git fetch --all to have all current branchesJust 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.
1 Comment
-a, that was simple!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>
Comments
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.
Comments
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
Comments
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 Comments
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.
Comments
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.
git fetchandgit remote updatedon't fetch all the remote's branches? Because otherwise you could just fetch then usegit branch -r...git branch -rwas only showing me remote branches that I had tracked locally. It's working better now.git remote show origin