Tutorial :git: switch branch without detaching head


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.


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!


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


git clone git@github.com: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  


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  

Note:If u also have question or solution just comment us below or mail us on toontricks1994@gmail.com
Next Post »