Git Branching¶
git checkout -b¶
“Remote Name”
In these examples, the remote is named gl
because I use Gitlab a lot and name my Gitlab remote repos as gl
instead of the default origin
.
We all use git checkout -b new-branch
to create a new branch from time to time.
Generally, we first switch to main
or develop
, update it and then from there create the new branch:
$ git checkout main
$ git fetch main
$ git reset --hard gl/main
$ git checkout -b new-branch
If you now do:
$ git branch -vv | grep new-branch
* my-branch 123aaa9 The commit message here
That includes no tracking branch information.
But we can also use -b
to create a branch from some other branch (instead of from the one we currently are):
$ git fetch gl main
$ git checkout -b other-branch gl/main
$ git branch -vv | grep other-branch
branch 'other-branch' set up to track 'gl/main'.
Switched to a new branch 'other-branch'
$ git branch -vv | grep other-branch
* other-branch bfc8d31 [gl/main] The commit message here
Specially note the bit “branch ‘other-branch’ set up to track ‘gl/main’”.
This is significant.
It means if you now push without specifying which branch to push to, it will send changes to main
(which could be catastrophic).
It can be fixed by setting it a new upstream to a remote branch with the same name as the local branch:
$ git push origin --set-upstream other-branch:other-branch
... some output omitted for brevity ...
* [new branch] other-branch -> other-branch
branch 'other-branch' set up to track 'gl/other-branch'.
As it can be seen, it sets the local other-branch
to track the remote other-branch
.
It is possible to use --no-track
to create a branch from another branch, which is probably a safer approach than mistakenly create a branch that tracks main
and then fix it in a subsequent command, as we did above.
We could do this instead:
$ git checkout -b other-branch --no-track gl/main
Switched to a new branch 'other-branch'
$ git branch -vv | grep other-branch
* other-branch bfc8d31 The commit message here
Note it just says “Switched to a new branch ‘other-branch’” without any mentions to making it track some other branch.