gitbranchgit-branch

How do I fetch all Git branches?


I cloned a Git repository containing many branches. However, git branch only shows one:

$ git branch
* master

How would I pull all the branches locally so when I do git branch, it shows the following?

$ git branch
* master
* staging
* etc...

Solution

  • TL;DR answer

    git branch -r \
      | grep -v '\->' \
      | sed "s,\x1B\[[0-9;]*[a-zA-Z],,g" \
      | while read remote; do \
          git branch --track "${remote#origin/}" "$remote"; \
        done
    git fetch --all
    git pull --all
    

    (grep -v matches the inverse of given string; sed removes control sequences: \x1B matches esc)

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

    Complete 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:

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

    2. 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 '\->' | sed "s,\x1B\[[0-9;]*[a-zA-Z],,g" | while read remote; do git branch --track "${remote#origin/}" "$remote"; done
    

    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.