How to clone all remote branches in Git? How to clone all remote branches in Git? git git

How to clone all remote branches in Git?


First, clone a remote Git repository and cd into it:

$ git clone git://example.com/myproject$ cd myproject

Next, look at the local branches in your repository:

$ git branch* master

But there are other branches hiding in your repository! You can see these using the -a flag:

$ git branch -a* master  remotes/origin/HEAD  remotes/origin/master  remotes/origin/v1.0-stable  remotes/origin/experimental

If you just want to take a quick peek at an upstream branch, you can check it out directly:

$ git checkout origin/experimental

But if you want to work on that branch, you'll need to create a local tracking branch which is done automatically by:

$ git checkout experimental

and you will see

Branch experimental set up to track remote branch experimental from origin.Switched to a new branch 'experimental'

Here, "new branch" simply means that the branch is taken from the index and created locally for you. As the previous line tells you, the branch is being set up to track the remote branch, which usually means the origin/branch_name branch.

Now, if you look at your local branches, this is what you'll see:

$ git branch* experimental  master

You can actually track more than one remote repository using git remote.

$ git remote add win32 git://example.com/users/joe/myproject-win32-port$ git branch -a* master  remotes/origin/HEAD  remotes/origin/master  remotes/origin/v1.0-stable  remotes/origin/experimental  remotes/win32/master  remotes/win32/new-widgets

At this point, things are getting pretty crazy, so run gitk to see what's going on:

$ gitk --all &


If you have many remote branches that you want to fetch at once, do:

$ git pull --all

Now you can checkout any branch as you need to, without hitting the remote repository.


Note: This will not create working copies of any non-checked out branches, which is what the question was asking. For that, see


This Bash script helped me out:

#!/bin/bashfor branch in $(git branch --all | grep '^\s*remotes' | egrep --invert-match '(:?HEAD|master)$'); do    git branch --track "${branch##*/}" "$branch"done

It will create tracking branches for all remote branches, except master (which you probably got from the original clone command). I think you might still need to do a

git fetch --allgit pull --all

to be sure.

One liner: git branch -a | grep -v HEAD | perl -ne 'chomp($_); s|^\*?\s*||; if (m|(.+)/(.+)| && not $d{$2}) {print qq(git branch --track $2 $1/$2\n)} else {$d{$_}=1}' | csh -xfs
As usual: test in your setup before copying rm -rf universe as we know it

Credits for one-liner go to user cfi