8468

Somebody pushed a branch called test with git push origin test to a shared repository. I can see the branch with git branch -r. How do I check out the remote test branch? I've tried:

  • git checkout test, which does nothing
  • git checkout origin/test gives * (no branch)
John Smith
  • 7,243
  • 6
  • 49
  • 61
Juri Glass
  • 88,173
  • 8
  • 33
  • 46
  • 57
    I think this thread is unhelpful. Nothing seems to work, the original question seems to have been lost in many of the answers. I have read every word, tried everything below, and have no idea how to do what the OP wants to do. – Tony Ennis Aug 26 '14 at 00:16
  • 54
    I feel like I'm taking crazy pills. I'm trying to checkout a branch from an `upstream`, not just `origin`, and every recommended answer doesn't do anything remotely helpful (pun-intended). **EDIT** - excuse me, the multitude of suggestions contained in the top 2 answers were useless; 3rd one (`git branch test origin/test`) is what works. Glad the top 2 have 20x the number of votes... – dwanderson Mar 09 '17 at 16:35
  • Maybe useful to someone else: When I used the Atom editor UI to fetch and pull changes, it pulled changes on the "main" branch but **did not** create a local reference to the second remote branch. Using `git fetch` on the command line created that reference, then I was able to checkout the branch as per several answers. – Scott Leis Nov 15 '21 at 05:19
  • From the first answer, if there is a single remote, the following works : git fetch, followed by git switch test – theRiley Jan 23 '22 at 01:32
  • This question needs renaming, it is poorly aligned with the content and google-bombs other questions on SO that better handle the topic (e.g. every answer here failed for me - but they're all answering different interpretations of the question, so that's no surprise). For future readers: don't do anything in this SO question/answers! Close this tab and re-search SO, find a different question on same topic. – Adam Mar 14 '22 at 15:28
  • 10
    `git fetch` then `git switch` – onmyway133 Apr 25 '22 at 11:34
  • At least in modern (2022) git context, `git fetch origin test` would be a necessary command before `git checkout origin/test`. – Craig Hicks May 06 '22 at 19:19
  • For me that helped: https://stackoverflow.com/a/25941875/38940 – Tom Smykowski May 18 '22 at 07:15
  • 4
    This answer should be archived. It's not useful to show people answers this old. Stackoverflow should have an updated answer button. – NickJ May 31 '22 at 02:46
  • What I did today: I have another branch test created from another machine, where I pushed to a remote branch. For some reason I can't access that machine anymore and I tried "git checkout test" from another machine. It didn't work and said "error: pathspec 'test' did not match any file(s) known to git". Then I ran "git pull", then "git checkout test" again, and I was able to switch to that branch now: "Branch 'test' set up to track remote branch 'test' from 'origin'." – Xipan Xiao Aug 29 '22 at 21:12
  • In my case, I was just spelling the remote branch name WRONG, if none of the methods here worked for you, check you spelling... – ospider Mar 20 '23 at 02:29

43 Answers43

11438

The answer has been split depending on whether there is one remote repository configured or multiple. The reason for this is that for the single remote case, some of the commands can be simplified as there is less ambiguity.

Updated for Git 2.23: For older versions, see the section at the end.

With One Remote

In both cases, start by fetching from the remote repository to make sure you have all the latest changes downloaded.

$ git fetch

This will fetch all of the remote branches for you. You can see the branches available for checkout with:

$ git branch -v -a

...
remotes/origin/test

The branches that start with remotes/* can be thought of as read only copies of the remote branches. To work on a branch you need to create a local branch from it. This is done with the Git command switch (since Git 2.23) by giving it the name of the remote branch (minus the remote name):

$ git switch test

In this case Git is guessing (can be disabled with --no-guess) that you are trying to checkout and track the remote branch with the same name.

With Multiple Remotes

In the case where multiple remote repositories exist, the remote repository needs to be explicitly named.

As before, start by fetching the latest remote changes:

$ 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 with -c to create a new local branch:

$ git switch -c test origin/test

For more information about using git switch:

$ man git-switch

Prior to Git 2.23

git switch was added in Git 2.23, prior to this git checkout was used to switch branches.

To checkout out with only a single remote repository:

git checkout test

if there are multiple remote repositories configured then it becomes a bit longer

git checkout -b test <name of remote>/test
codepeaker
  • 420
  • 8
  • 15
hallski
  • 123,625
  • 4
  • 33
  • 21
  • 479
    To expand on this: git doesn't allow you to work on someone else's branches. You can only work on your own. So if you want to add to someone else's branch, you need to create your own "copy" of that branch, which is what the above command does (well, it creates your branch and checks it out, too). – Dan Moulding Nov 23 '09 at 15:24
  • 158
    If it's a new remote branch you may need to `git fetch` before doing this so that git is aware of `origin/test` – Neil Sarkar Nov 04 '11 at 14:38
  • 65
    ...and you would do this with `git fetch origin test` – Andrew Jan 22 '12 at 23:24
  • 23
    Error: "git checkout: updating paths is incompatible with switching branches. Did you intend to checkout `origin/test` which can not be resolved as commit?" – Xeoncross Sep 11 '12 at 20:35
  • 93
    `git checkout test` will NOT work in modern git *if you have multiple remotes which have the same branch name*. It can't know which one to use. – masukomi Sep 16 '14 at 15:34
  • **important note** - making sure you have no changes is obvious, but also make sure that you don't have any untracked files changes. For regular checkouts it didn't bother me, but in this case, it did. `git clean -nfd` to see what would be removed and then `git clean -fd` to remove it. – Daniel Jul 28 '21 at 13:30
  • 2
    `git fetch origin` fetches only a subset of the branches on the remote, not all of them. I have no idea how it chooses the branches it picks or what causes it to ignore a remote branch, but it only fetched about half the branches from my remote. To get the one I needed I had to specify it by name: `git fetch origin my-branch`. And then it wouldn't let me check the branch out. – Throw Away Account Sep 24 '21 at 19:11
  • 3
    Here, in the post-2019 future, this has become as simple as `git switch remoteBranch`. More [on switch vs checkout](https://stackoverflow.com/questions/57265785/whats-the-difference-between-git-switch-and-git-checkout-branch). – Brad Turek Oct 05 '21 at 16:16
  • 2
    Thanks a lot @BradTurek, I have updated the answer to use `git switch` instead of `git checkout`. – hallski Dec 19 '21 at 04:43
  • For me that helped: https://stackoverflow.com/a/25941875/38940 – Tom Smykowski May 18 '22 at 07:14
1513

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

A more modern approach as suggested in the comments:

@Dennis: git checkout <non-branch>, for example git checkout origin/test results in detached HEAD / unnamed branch, while git checkout test or git checkout -b test origin/test results in local branch test (with remote-tracking branch origin/test as upstream) – Jakub Narębski Jan 9 '14 at 8:17

emphasis on git checkout origin/test

Neuron
  • 5,141
  • 5
  • 38
  • 59
Jakub Narębski
  • 309,089
  • 65
  • 217
  • 230
  • 39
    Unsurprising, but this version has been released in the last few years - knowing this syntax can save a lot of time since there's still a lot of old documentation and comment threads floating around that suggest the older method for doing this. – Curtis Apr 16 '12 at 13:24
  • 13
    "modern git"--for the record, (approx) what version are you referring to? Sometimes we have to work on systems running older distros. – Craig McQueen Aug 28 '12 at 02:30
  • 14
    @aidan If you get a response like `error: pathspec 'branch_name' did not match any file(s) known to git.` then you should do a git fetch first. – Dennis Oct 18 '13 at 00:40
  • 6
    Using git version 1.8.3.msysgit.0 and this doesn't work for me - did not match any file(s) known to git - I've done many git fetches – PandaWood Dec 03 '13 at 23:59
  • 14
    @Dennis: `git checkout `, for example `git checkout origin/test` results in detached HEAD / unnamed branch, while `git checkout test` or `git checkout -b test origin/test` results in local branch `test` (with remote-tracking branch `origin/test` as _upstream_) – Jakub Narębski Jan 09 '14 at 08:17
  • `git checkout -b test FETCH_HEAD` worked for me. – KRoy Jun 02 '23 at 16:19
775

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.

To create the local branch and switch to it, use:

$ git checkout -b test origin/test
Mattia Righetti
  • 1,265
  • 1
  • 18
  • 31
ndim
  • 35,870
  • 12
  • 47
  • 57
  • 26
    This will create a local branch without switching to it. – Alex Skrypnyk Oct 16 '13 at 07:20
  • 2
    In your ```bash git checkout -b test/origin/test ``` suggestion above, you made want to precede it with a ```bash git fetch upstream ``` to insure that your local repository knows the remote branch `test` is there. Otherwise, thanks, everything works as advertised. – oldfartdeveloper Apr 20 '22 at 17:14
  • This is what I was actually trying to accomplish. When I used the other commands I wound up in a detached HEAD state which is not what I was looking for. Thanks! – Dominic P Jul 10 '23 at 22:09
565

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.

Community
  • 1
  • 1
Corey Ballou
  • 42,389
  • 8
  • 62
  • 75
392

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.

Sahil kalra
  • 8,344
  • 4
  • 23
  • 29
  • 51
    This worked for me when neither git fetch origin or git remote update created local branches. I'm not sure why. – Godsmith Sep 11 '14 at 08:45
  • 10
    This was the most direct way to accomplish what I needed which was to use a remote branch (not master) to create a new branch. – Roralee Nov 13 '15 at 23:15
  • 10
    this worked for me too, where accepted answers and other high voted didn't. My git version is 2.5.0 – pdepmcp Feb 17 '17 at 12:46
  • 5
    I had a branch of that form: "xx/xx" and This was the solution for me. – User Mar 14 '17 at 08:50
  • 12
    Does anyone have any idea why this works when everything else doesn't? (I'm on git 2.13.0) – Nathan Arthur Jun 19 '17 at 18:43
122

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.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
tacaswell
  • 84,579
  • 22
  • 210
  • 199
122

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.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
matanster
  • 15,072
  • 19
  • 88
  • 167
  • 15
    Looking at it now, they do overlap. Only mine is succinct and tells you what to do rather than tell a story. I assume it can be more useful therefore, especially for nowadays git versions. You can downvote it if you think it is a bad answer. – matanster Feb 21 '16 at 11:34
  • After reading the other answers and getting more and more confused, this is the one that actually worked for me :) – RosieC Jul 25 '23 at 13:22
113

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

Noel Yap
  • 18,822
  • 21
  • 92
  • 144
Alireza
  • 100,211
  • 27
  • 269
  • 172
76

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.

Ondrej
  • 502
  • 1
  • 3
  • 12
Madhan Ayyasamy
  • 15,600
  • 3
  • 19
  • 18
65

I always do:

git fetch origin && git checkout --track origin/branch_name

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
M. Wojcik
  • 2,301
  • 3
  • 23
  • 31
47

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
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
uma
  • 2,932
  • 26
  • 20
  • 4
    FYI, `--track` is no longer needed in newer versions of git, because it's set by default, as explained in [this earlier answer](http://stackoverflow.com/a/1783437/456814). –  Jun 21 '14 at 18:03
  • This comment worked for me, thank you! `git checkout -b local_branch_name origin/branch_name` – Tim Kelly Sep 15 '21 at 23:39
47

I was stuck in a situation seeing error: pathspec 'desired-branch' did not match any file(s) known to git. for all of the suggestions above. I'm on Git version 1.8.3.1.

So this worked for me:

git fetch origin desired-branch
git checkout -b desired-branch FETCH_HEAD

The explanation behind is that I've noticed that when fetching the remote branch, it was fetched to FETCH_HEAD:

git fetch origin desired-branch

From github.com:MYTEAM/my-repo
    * branch            desired-branch -> FETCH_HEAD
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
alisa
  • 1,336
  • 2
  • 15
  • 21
  • I had the same problem when trying to check out the remote branch in a submodule in a worktree. Anyone knows what's the reason for that? – Cezary Drożak Mar 18 '22 at 08:20
  • This is very useful if some of the branches are very big, and you don't necessarily want to download them all. – ninpnin Jan 23 '23 at 11:27
39

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.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Mohideen bin Mohammed
  • 18,813
  • 10
  • 112
  • 118
  • This has never worked for me. I getting an error telling me is not a commit and cannot be created from it. – Jimbo Feb 09 '22 at 17:07
36

I use the following command:

git checkout --track origin/other_remote_branch
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
priyankvex
  • 5,760
  • 5
  • 28
  • 44
  • 15
    This answer would be a lot more useful if you explain why you are using it this way. i.e. why someone should use '--track' and so on... – Matt Friedman Nov 20 '17 at 03:19
31

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

madhead
  • 31,729
  • 16
  • 153
  • 201
sreekumar
  • 2,439
  • 1
  • 21
  • 27
31

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
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Thushan
  • 1,220
  • 14
  • 14
31

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.

Eugene Yarmash
  • 142,882
  • 41
  • 325
  • 378
25

None of these answers worked for me. This worked:

git checkout -b feature/branch remotes/origin/feature/branch
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
brianyang
  • 1,090
  • 13
  • 14
24

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
prusswan
  • 6,853
  • 4
  • 40
  • 61
Kris
  • 19,188
  • 9
  • 91
  • 111
23

There are many alternatives, for example:

  • Alternative 1:

    git fetch && git checkout test
    

    It's the simplest way.

  • Alternative 2:

    git fetch
    git checkout test
    

    It's the same, but in two steps.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Javier C.
  • 7,859
  • 5
  • 41
  • 53
22

git fetch && git checkout your-branch-name

Inder Kumar Rathore
  • 39,458
  • 17
  • 135
  • 184
17

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.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
webdevguy
  • 975
  • 10
  • 17
  • 2
    FYI, `git remote update` **will also fetch all remote branches**. –  Jun 21 '14 at 17:59
17

TL;DR

Using git switch rather than git checkout. More details are on this page.

I think the answer is obsolete. Git split some functions of checkout to switch and restore now.

The following is my summary:

If you want to update something for a remote branch, you should create a local branch to "track" the remote branch. You can update anything you want in local and finally push to remote. If you check out to the remote branch directly after cloning your repository, you may see the "detached HEAD" status and the following message from Git:

Note: switching to 'origin/asd'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by switching back to a branch.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -c with the switch command. Example:

  git switch -c <new-branch-name>

Or undo this operation with:

  git switch -

Turn off this advice by setting config variable advice.detachedHead to false

HEAD is now at d3e1083 Update a

So how can we create a local branch to track a remote branch?

To create a local branch to track a remote branch, you can use git checkout <remote branch name> or git switch <remote branch name>. If you have a file or folder has same name as your remote branch name, git checkout would output some error message, but git switch can work normally!

Example:

  1. See all branches, and we want to create a local branch to track the remote branch remotes/origin/asd, and we also have the file name asd:

    $ git branch -a
    * master
      remotes/origin/HEAD -> origin/master
      remotes/origin/asd
      remotes/origin/ereres
      remotes/origin/master
      remotes/origin/zxc
    $ ls
    a  asd
    
  2. The filename is same as remote branch, and Git should output some error messages if we are using the git checkout command to create a local branch to track a remote branch

    $ git checkout asd
    fatal: 'asd' could be both a local file and a tracking branch.
    Please use -- (and optionally --no-guess) to disambiguate
    
  3. It works if we are using git switch!

    $ git switch ereres
    Branch 'ereres' set up to track remote branch 'ereres' from 'origin'.
    Switched to a new branch 'ereres'
    
    $ git branch -vv
    * ereres 3895036 [origin/ereres] Update a
      master f9e24a9 [origin/master] Merge branch 'master' of
    
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
chilin
  • 420
  • 7
  • 9
  • not work with 2.17.1, no command found for "git switch" . @hallski 's answer works for me! – Siwei Sep 24 '21 at 02:16
  • @Siwei No command since your Git version < 2.23. You can refer to [this link](https://stackoverflow.com/questions/24384951/confused-by-git-checkout/57066202#57066202) to see more details. – chilin Sep 25 '21 at 03:37
  • Re *"the answer is obsolete"*: What answer? The [accepted answer](https://stackoverflow.com/questions/1783405/how-do-i-check-out-a-remote-git-branch/1783426#1783426)? Several answers? Which ones? – Peter Mortensen Sep 06 '22 at 11:27
  • The accepted answer, but the accepted answer already updated for Git 2.23 at Dec 19, 2021. – chilin Sep 07 '22 at 04:02
15

Fetch from the remote and checkout the branch.

git fetch <remote_name> && git checkout <branch_name> 

E.g.:

git fetch origin && git checkout feature/XYZ-1234-Add-alerts

Pranav
  • 952
  • 9
  • 20
14

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.
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
oldman
  • 4,286
  • 2
  • 20
  • 15
14

To get newly created branches

git fetch

To switch into another branch

git checkout BranchName
Community
  • 1
  • 1
Hasib Kamal Chowdhury
  • 2,476
  • 26
  • 28
14

To get all remote branches, use this:

git fetch --all

Then check out to the branch:

git checkout test
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Zahra Badri
  • 1,656
  • 1
  • 17
  • 28
14

git checkout -b "Branch_name" [ B means Create local branch]

git branch --all

git checkout -b "Your Branch name"

git branch

git pull origin "Your Branch name"

successfully checkout from the master branch to dev branch

enter image description here

Keshav Gera
  • 10,807
  • 1
  • 75
  • 53
13

It seems to my that no one suggested the simplest way (or maybe I'm too dumb to think this is "a way"). But anyway, try this:

git pull origin remoteBranchName
git switch remoteBranchName

This worked for me in the same case (a branch created on the remote after my last pull request).

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Cássio Tavares
  • 149
  • 1
  • 3
12

For us, it seems the remote.origin.fetch configuration gave a problem. Therefore, we could not see any other remote branches than master, so git fetch [--all] did not help. Neither git checkout mybranch nor git checkout -b mybranch --track origin/mybranch did work, although it certainly was at remote.

The previous configuration only allowed master to be fetched:

$ git config --list | grep fetch
remote.origin.fetch=+refs/heads/master:refs/remotes/origin/master

Fix it by using * and fetch the new information from origin:

$ git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'

$ git fetch
...
 * [new branch] ...
...

Now we could git checkout the remote branch locally.

I don't have any idea how this configuration ended up in our local repository.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
hzpc-joostk
  • 361
  • 3
  • 7
11

I used that one:

git clean -fxd                         # removes untracked (new added plus ignored files)

git fetch
git checkout {branchname}

git reset --hard origin/{branchname}   # removes staged and working directory changes
Ahmed Nabil
  • 17,392
  • 11
  • 61
  • 88
Andrii Sukhoi
  • 749
  • 5
  • 14
9

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 ;
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
OzzyCzech
  • 9,713
  • 3
  • 50
  • 34
9

For some reason, I couldn't do:

git checkout -b branch-name origin/branch-name

It was throwing the error:

fatal: 'origin/branch-name' is not a commit and a branch 'branch-name' cannot be created from it

I had to do:

git checkout -b branch-name commit-sha
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Valentin Vignal
  • 6,151
  • 2
  • 33
  • 73
  • 6
    Maybe you did not `git fetch` all branches from origin? Note that `git switch` is preferred to `git checkout` nowadays: https://stackoverflow.com/a/57066202/6309 – VonC Sep 09 '21 at 09:07
  • git fetch --all; for branch in `git branch -r --format="%(refname:short)" | sed 's/origin\///'`; do git branch --track "$branch" "origin/$branch" ; done ; – aGreenCoder Feb 23 '22 at 13:36
8

git fetch --all

would fetch all the remote branches to your local

git checkout test

would switch you to the test branch

Prashant Reddy
  • 309
  • 1
  • 3
  • 8
7

If the remote branch name begins with special characters you need to use single quotes around it in the checkout command, or else Git won't know which branch you are talking about.

For example, I tried to checkout a remote branch named #9773, but the command didn't work properly, as shown in the picture below:

Enter image description here

For some reason, I wondered if the sharp symbol (#) could have something to do with it, and then I tried surrounding the branch name with single quotes, like '#9773' rather than just #9773, and fortunately it worked fine.

git checkout -b '#9773' origin/'#9773'
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Ulysses Alves
  • 2,297
  • 3
  • 24
  • 34
  • Please review *[Why not upload images of code/errors when asking a question?](https://meta.stackoverflow.com/questions/285551/)* (e.g., *"Images should only be used to illustrate problems that* ***can't be made clear in any other way,*** *such as to provide screenshots of a user interface."*) and [do the right thing](https://stackoverflow.com/posts/53188417/edit) (it covers answers and program output as well). Thanks in advance. – Peter Mortensen Sep 06 '22 at 10:50
7

Just run these two commands and you should be good to go.

git checkout <branch-name>
git pull <remote> <branch-name>
Craigo
  • 3,384
  • 30
  • 22
Sateesh
  • 842
  • 10
  • 7
7

Working Commands

  1. git fetch origin 'remote_branch':'local_branch_name'

  2. git switch 'local_branch_name'

  3. git pull origin 'remote_branch':'local_branch_name'

The first one is for fetching the branch and creating a local branch from a remote branch.

The second one is for switching to the local branch.

The third is for pulling the latest changes of remote to the local branch.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Rahul Uttarkar
  • 3,367
  • 3
  • 35
  • 40
3

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'
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Mehedi Hasan
  • 359
  • 3
  • 10
3

Use fetch to pull all your remote

   git fetch --all

To list remote branches:

   git branch -r

For list all your branches

   git branch -l
   >>outpots like-
     * develop
       test
       master

To checkout/change a branch

   git checkout master
Nasir Khan
  • 753
  • 1
  • 9
  • 22
2

I tried many answers here but still couldn't checkout to a remote branch, turns out that when I first cloned the repo, I had added --single-branch flag which could be the reason why I was encountering the error when trying to create a new branch from a remote branch, to resolve this problem we can update the repository's configuration to fetch all branches from the remote repository:

git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"
git fetch
git branch -r

and now we can continue with

git checkout -b feature/FS origin/feature/FS
Nidal
  • 1,717
  • 1
  • 27
  • 42
1

You can add a new branch test on local and then use:

git branch --set-upstream-to=origin/test test
Kaaveh Mohamedi
  • 1,399
  • 1
  • 15
  • 36
0

I am not sure. I keep doing this day in and day out. The following command works like gem.

dev being the branch you want to checkout.

git fetch && git checkout dev
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Ashutosh
  • 917
  • 10
  • 19
-4

In your case, you can use this command:

git checkout -b test origin/test

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
dragon99k
  • 11
  • 6