113

I have a repository on github with a main branch (master) and a branch for some experimental work. I made some commits and pushed to the experimental branch and everything was fine.

Now, on a different machine, I try to clone my repository (git clone repository) and then switch to the experimental branch (git checkout branchname) but every time I do this my head gets detached and I can't push my changes. What am I doing wrong? I get the feeling I'm missing a fundamental git concept someplace but reading random git man pages isn't giving me any clues.

I'm new to git so I'm sorry if I'm being an idiot but I can't find anything in the docs that will help me reattach my head.

EDIT

The concept of a tracking branch is what I was missing. Now that I grok that concept everything is clear. Personally, I find the git branch --track syntax to be much more intuitive than git checkout -b branch-name origin/branch-name.

Thanks for the help!

1
  • To switch branch without detaching head, with Git 2.23 (August 2019), use git switch: see my answer below.
    – VonC
    Commented Aug 20, 2019 at 17:07

4 Answers 4

127
# first time: make origin/branchname locally available as localname
git checkout -b localname origin/branchname 

# othertimes 
git checkout localname 

git push origin

For convenience, you may use the same string for localname & branchname
When you checked out origin/branchname you weren't really checking out a branch. origin/branchname is a "remote" name, and you can get a list of them with

branch -a 

If you have colours enabled, local branches will be one colour, and remote another.

You have to first make a remote branch tracked locally in order to be able to switch-to and work on it.

6
  • 11
    Man, why doesn't "git checkout origin/branchname" start tracking the branch automatically if it is not tracked yet? Commented Dec 22, 2010 at 18:02
  • 4
    because you still need a local name for the foreign branch. Commented Dec 23, 2010 at 11:12
  • Here's what I'm doing, and the error message: $ git checkout -b topic/fetch upstream/topic/fetch fatal: git checkout: updating paths is incompatible with switching branches. Did you intend to checkout 'upstream/topic/fetch' which can not be resolved as commit?
    – ulu
    Commented Jan 24, 2012 at 13:27
  • 2
    Thanks for the tip about colors. To enable colors: git config --global --add color.ui true
    – PonyEars
    Commented Sep 25, 2013 at 19:13
  • 1
    Its worth noting that "origin/branchname" can literally be anything that resolves to a SHA1, or a SHA1 in itself =). I regularly use that to create arbitrary branches with arbitrary roots. Commented Jun 19, 2016 at 6:57
19
git clone [email protected]:abc/def.git
cd def

Now create a tracking branch:

git branch --track experimental origin/experimental
git checkout experimental

Then, after working there, simply push to github by

git push
4
  • 3
    git branch -t origin/experimental # don't need to type so much :)
    – Dustin
    Commented Jan 23, 2009 at 0:51
  • The branch I want to track is called topic/fetch. When I'm trying to do $ git branch --track topic/fetch upstream/topic/fetch it says, fatal: Not a valid object name: 'upstream/topic/fetch'.
    – ulu
    Commented Jan 24, 2012 at 13:24
  • 1
    @Dustin, that command creates a local branch 'origin/experimental' that tracks the local master. I'm guessing it's a fairly common mistake.
    – PDug
    Commented Aug 7, 2013 at 21:58
  • 1
    @PDug % git checkout -t origin/experimental Branch experimental set up to track remote branch experimental from origin by rebasing. Switched to a new branch 'experimental'
    – Dustin
    Commented Aug 12, 2013 at 16:56
11

To expand on Kent's reply, after you do your clone the only branch you'll have (remotes don't count) is the one that was active in the repository you cloned from -- master in your case.

So, first you'll want to create a new branch to track the remote experimental branch:

$ git branch experimental origin/experimental

and then check it out:

$ git checkout experimental

However, Kent is correct -- these two commands can be combined

$ git checkout -b experimental origin/experimental
10

With Git 2.23 (August 2019), you would use the git switch command

If you have a remote branch of the same name, it will be automatically tracked:

$ git switch new-topic
Branch 'new-topic' set up to track remote branch 'new-topic' from 'origin'
Switched to a new branch 'new-topic'

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.