Reputation: 4364
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!
Upvotes: 113
Views: 50716
Reputation: 1329892
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'
Upvotes: 10
Reputation: 57414
# 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.
Upvotes: 127
Reputation: 4736
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
Upvotes: 19
Reputation: 214506
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
Upvotes: 11