How do I check out a remote Git branch?
Somebody pushed a branch called
git push origin test to a shared repository. I can see the branch with
git branch -r.
Now I'm trying to check out the remote
git checkout testwhich does nothing
git checkout origin/testgives
* (no branch). Which is confusing. How can I be on "no branch"?
How do I check out a remote Git branch?
With One Remote
Jakub's answer actually improves on this. With Git versions ≥ 1.6.6, with only one remote, you can just do:
git fetch git checkout test
As user masukomi points out in a comment,
git checkout test will NOT work in modern git if you have multiple remotes. In this case use
git checkout -b test <name of remote>/test
or the shorthand
git checkout -t <name of remote>/test
With >1 Remotes
Before you can start working locally on a remote branch, you need to fetch it as called out in answers below.
To fetch a branch, you simply need to:
git fetch origin
This will fetch all of the remote branches for you. You can see the branches available for checkout with:
git branch -v -a
With the remote branches in hand, you now need to check out the branch you are interested in, giving you a local working copy:
git checkout -b test origin/test
Read more... Read less...
Sidenote: With modern Git (>= 1.6.6), you are able to use just
git checkout test
(note that it is 'test' not 'origin/test') to perform magical DWIM-mery and create local branch 'test' for you, for which upstream would be remote-tracking branch 'origin/test'.
* (no branch) in
git branch output means that you are on unnamed branch, in so called "detached HEAD" state (HEAD points directly to commit, and is not symbolic reference to some local branch). If you made some commits on this unnamed branch, you can always create local branch off current commit:
git checkout -b test HEAD
** EDIT (by editor not author) **
I found a comment buried below which seems to modernize this answer:
git checkout <non-branch>, for example
git checkout origin/testresults in detached HEAD / unnamed branch, while
git checkout testor
git checkout -b test origin/testresults in local branch
test(with remote-tracking branch
origin/testas upstream) – Jakub Narębski Jan 9 '14 at 8:17
git checkout origin/test
In this case, you probably want to create a local
test branch which is tracking the remote
$ git branch test origin/test
In earlier versions of
git, you needed an explicit
--track option, but that is the default now when you are branching off a remote branch.
Accepted answer not working for you?
While the first and selected answer is technically correct, there's the possibility you have not yet retrieved all objects and refs from the remote repository. If that is the case, you'll receive the following error:
$ git checkout -b remote_branch origin/remote_branch
fatal: git checkout: updating paths is incompatible with switching branches.
Did you intend to checkout 'origin/remote_branch' which can not be resolved as commit?
If you receive this message, you must first do a
git fetch origin where
origin is the name of the remote repository prior to running
git checkout remote_branch. Here's a full example with responses:
$ git fetch origin remote: Counting objects: 140, done. remote: Compressing objects: 100% (30/30), done. remote: Total 69 (delta 36), reused 66 (delta 33) Unpacking objects: 100% (69/69), done. From https://github.com/githubuser/repo-name e6ef1e0..5029161 develop -> origin/develop * [new branch] demo -> origin/demo d80f8d7..359eab0 master -> origin/master $ git checkout demo Branch demo set up to track remote branch demo from origin. Switched to a new branch 'demo'
As you can see, running
git fetch origin retrieved any remote branches we were not yet setup to track on our local machine. From there, since we now have a ref to the remote branch, we can simply run
git checkout remote_branch and we'll gain the benefits of remote tracking.
I tried the above solution, but it didn't work. Try this, it works:
git fetch origin 'remote_branch':'local_branch_name'
This will fetch the remote branch and create a new local branch (if not exists already) with name
local_branch_name and track the remote one in it.
$ git checkout -t remote_name/remote_branch
To add a new remote, you will need to do the following first:
$ git remote add remote_name location_of_remote $ git fetch remote_name
The first tells Git the remote exists, the second gets the commits.