当前位置 : 首页 » 互动问答 » 正文

How do I check out a remote Git branch?

分类 : 互动问答 | 发布时间 : 2009-11-23 22:23:46 | 评论 : 24 | 浏览 : 4082562 | 喜欢 : 5488

Somebody pushed a branch called test with 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 test branch.

I've tried:

  • git checkout test which does nothing

  • git checkout origin/test gives * (no branch). Which is confusing. How can I be on "no branch"?

How do I check out a remote Git branch?

回答(24)

  • 1楼
  • Update

    Jakub's answer actually improves on this. With Git versions ≥ 1.6.6, you can just do:

    git fetch
    git checkout test
    

    (User masukomi points out below that 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).

    Old Answer

    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
    
  • 2楼
  • 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'.


    The * (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
    
  • 3楼
  • In this case, you probably want to create a local test branch which is tracking the remote test branch:

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

  • 4楼
  • 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?

    Solution

    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.

  • 5楼
  • 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.

  • 6楼
  • This will DWIM for a remote not named origin (documentation):

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

  • 7楼
  • Use:

    git checkout -b <BRANCH-NAME> <REMOTE-NAME>/<BRANCH-NAME>
    

    Other answers do not work with modern Git in my benign case. You might need to pull first if the remote branch is new, but I haven't checked that case.

  • 8楼
  • OK, the answer is easy... You basically see the branch, but you don't have a local copy yet!...

    You need to fetch the branch...

    You can simply fetch and then checkout to the branch, use the one line command below to do that:

    git fetch && git checkout test
    

    I also created the image below for you to share the differences, look at how fetch works and also how it's different to pull:

    git fetch

  • 9楼
  • To clone a Git repository, do:

    git clone <either ssh url /http url>
    

    The above command checks out all of the branches, but only the master branch will be initialized. If you want to checkout the other branches, do:

    git checkout -t origin/future_branch (for example)
    

    This command checks out the remote branch, and your local branch name will be same as the remote branch.

    If you want to override your local branch name on checkout:

    git checkout -t -b enhancement origin/future_branch
    

    Now your local branch name is enhancement, but your remote branch name is future_branch.

    Documentation

  • 10楼
  • You can try

    git fetch remote
    git checkout --track -b local_branch_name origin/branch_name
    

    or

    git fetch
    git checkout -b local_branch_name origin/branch_name
    
  • 11楼
  • First, you need to do:

    git fetch # If you don't know about branch name

    git fetch origin branch_name
    

    Second, you can check out remote branch into your local by:

    git checkout -b branch_name origin/branch_name
    

    -b will create new branch in specified name from your selected remote branch.

  • 12楼
  • Commands

    git fetch --all
    git checkout -b <ur_new_local_branch_name> origin/<Remote_Branch_Name>
    

    are equal to

     git fetch --all
    

    and then

     git checkout -b fixes_for_dev origin/development
    

    Both will create a latest fixes_for_dev from development

  • 13楼
  • I use the following command:

    git checkout --track origin/other_remote_branch
    
  • 14楼
  • If the branch is on something other than the origin remote I like to do the following:

    $ git fetch
    $ git checkout -b second/next upstream/next
    

    This will checkout the next branch on the upstream remote in to a local branch called second/next. Which means if you already have a local branch named next it will not conflict.

    $ git branch -a
    * second/next
      remotes/origin/next
      remotes/upstream/next
    
  • 15楼
  • git fetch && git checkout your-branch-name

  • 16楼
  • git branch -r says the object name is invalid, because that branch name isn't in Git's local branch list. Update your local branch list from origin with:

    git remote update
    

    And then try checking out your remote branch again.

    This worked for me.

    I believe git fetch pulls in all remote branches, which is not what the original poster wanted.

  • 17楼
  • none of these answers worked for me. this worked:

    git checkout -b feature/branch remotes/origin/feature/branch

  • 18楼
  • The git remote show <origin name> command will list all branches (including un-tracked branches). Then you can find the remote branch name that you need to fetch.

    Example:

    $ git remote show origin
    

    Use these steps to fetch remote branches:

    git fetch <origin name> <remote branch name>:<local branch name>
    git checkout <local branch name > (local branch name should the name that you given fetching)
    

    Example:

    $ git fetch origin test:test
    $ git checkout test
    
  • 19楼
  • Other guys and gals give the solutions, but maybe I can tell you why.

    git checkout test which does nothing

    Does nothing doesn't equal doesn't work, so I guess when you type 'git checkout test' in your terminal and press enter key, no message appears and no error occurs. Am I right?

    If the answer is 'yes', I can tell you the cause.

    The cause is that there is a file (or folder) named 'test' in your work tree.

    When git checkout xxx parsed,

    1. Git looks on xxx as a branch name at first, but there isn't any branch named test.
    2. Then Git thinks xxx is a path, and fortunately (or unfortunately), there is a file named test. So git checkout xxx means discard any modification in xxx file.
    3. If there isn't file named xxx either, then Git will try to create the xxx according to some rules. One of the rules is create a branch named xxx if remotes/origin/xxx exists.
  • 20楼
  • You can start tracking all remote branches with the following Bash script:

    #!/bin/bash
    git fetch --all
    for branch in `git branch -r --format="%(refname:short)" | sed 's/origin\///'`
      do git branch -f --track "$branch" "origin/$branch"
    done
    

    Here is also a single-line version:

    git fetch --all; for branch in `git branch -r --format="%(refname:short)" | sed 's/origin\///'`; do git branch --track "$branch" "origin/$branch" ; done ;
    
  • 21楼
  • Please follow the command to create an empty folder. Enter that and use this command:

    saifurs-Mini:YO-iOS saifurrahman$ git clone your_project_url
    Cloning into 'iPhoneV1'...
    remote: Counting objects: 34230, done.
    remote: Compressing objects: 100% (24028/24028), done.
    remote: Total 34230 (delta 22212), reused 15340 (delta 9324)
    Receiving objects: 100% (34230/34230), 202.53 MiB | 294.00 KiB/s, done.
    Resolving deltas: 100% (22212/22212), done.
    Checking connectivity... done.
    saifurs-Mini:YO-iOS saifurrahman$ cd iPhoneV1/
    saifurs-Mini:iPhoneV1 saifurrahman$ git checkout 1_4_0_content_discovery
    Branch 1_4_0_content_discovery set up to track remote branch 1_4_0_content_discovery from origin.
    Switched to a new branch '1_4_0_content_discovery'
    
  • 22楼
  • To get newly created branches

    git fetch
    

    To switch into another branch

    git checkout BranchName
    
  • 23楼
  • Fetch origin and checkout the branch.

    git fetch origin && git checkout branch_name 
    
  • 24楼
  • Simply run git checkout with the name of the remote branch. Git will automatically create a local branch that tracks the remote one:

    git fetch
    git checkout test
    

    However, if that branch name is found in more than one remote, this won't work as Git doesn't know which to use. In that case you can use either:

    git checkout --track origin/test
    

    or

    git checkout -b test origin/test
    

    In 2.19, Git learned the checkout.defaultRemote configuration, which specifies a remote to default to when resolving such an ambiguity.

相关阅读:

Why should I use core.autocrlf=true in Git?

Force "git push" to overwrite remote files

Update Git branches from master

Undo a Git merge that hasn't been pushed yet

How can I delete a file from git repo?

Git fetch remote branch

How do you clone a Git repository into a specific folder?

Reset or revert a specific file to a specific revision using Git?

View the change history of a file using Git versioning

Difference between "git add -A" and "git add ."