Tutorial :git: switch branch without detaching head



Question:

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!


Solution:1

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


Solution:2

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  


Solution:3

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
Previous
Next Post »