How to fetch all Git branches
How to fetch all Git branches
Question
I cloned a Git repository, which contains about five branches. However, when I do git branch
I only see one of them:
$ git branch
* master
I know that I can do git branch -a
to see all the branches, but how would I pull all the branches locally so when I do git branch
, it shows the following?
$ git branch
* master
* staging
* etc...
Accepted Answer
You can fetch all branches from all remotes like this:
git fetch --all
It's basically a power move.
fetch
updates local copies of remote branches so this is always safe for your local branches BUT:
fetch
will not update local branches (which track remote branches); if you want to update your local branches you still need to pull every branch.fetch
will not create local branches (which track remote branches), you have to do this manually. If you want to list all remote branches:git branch -a
To update local branches which track remote branches:
git pull --all
However, this can be still insufficient. It will work only for your local branches which track remote branches. To track all remote branches execute this oneliner BEFORE git pull --all
:
git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done
TL;DR version
git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done
git fetch --all
git pull --all
(It seems that pull fetches all branches from all remotes, but I always fetch first just to be sure.)
Run the first command only if there are remote branches on the server that aren't tracked by your local branches.
P.S. AFAIK git fetch --all
and git remote update
are equivalent.
Kamil Szot's comment, which folks have found useful.
I had to use:
for remote in `git branch -r`; do git branch --track ${remote#origin/} $remote; done
because your code created local branches named
origin/branchname
and I was getting "refname 'origin/branchname' is ambiguous whenever I referred to it.
Read more… Read less…
To list remote branches:
git branch -r
You can check them out as local branches with:
git checkout -b LocalName origin/remotebranchname
You will need to create local branches tracking remote branches.
Assuming that you've got only one remote called origin
, this snippet will create local branches for all remote tracking ones:
for b in `git branch -r | grep -v -- '->'`; do git branch --track ${b##origin/} $b; done
After that, git fetch --all
will update all local copies of remote branches.
Also, git pull --all
will update your local tracking branches, but depending on your local commits and how the 'merge' configure option is set it might create a merge commit, fast-forward or fail.
If you do:
git fetch origin
then they will be all there locally. If you then perform:
git branch -a
you'll see them listed as remotes/origin/branch-name. Since they are there locally you can do whatever you please with them. For example:
git diff origin/branch-name
or
git merge origin/branch-name
or
git checkout -b some-branch origin/branch-name
$ git remote update
$ git pull --all
This assumes all branches are tracked.
If they aren't you can fire this in Bash:
for remote in `git branch -r `; do git branch --track $remote; done
Then run the command.
The Bash for
loop wasn't working for me, but this did exactly what I wanted. All the branches from my origin mirrored as the same name locally.
git checkout --detach
git fetch origin '+refs/heads/*:refs/heads/*'
See Mike DuPont's comment below. I think I was trying to do this on a Jenkins Server which leaves it in detached head mode.