Branches in Git are really nothing more than pointers into the
Git object database from within the .git/refs/
subdirectory, and
as we already discussed, the HEAD
branch is nothing but a symlink
to one of these object pointers.
You can at any time create a new branch by just picking an
arbitrary point in the project history, and just writing the
SHA-1 name of that object into a file under .git/refs/heads/
. You
can use any filename you want (and indeed, subdirectories), but
the convention is that the "normal" branch is called master
.
That's just a convention, though, and nothing enforces it.
To show that as an example, let's go back to the git-tutorial
repository we used earlier, and create a branch in it. You do
that by simply just saying that you want to check out a new
branch:
$ git switch -c mybranch
will create a new branch based at the current HEAD
position, and
switch to it.
Note
If you make the decision to start your new branch at some
other point in the history than the current HEAD
, you can do
so by just telling git switch what the base of the checkout
would be. In other words, if you have an earlier tag or
branch, you'd just do
$ git switch -c mybranch earlier-commit
and it would create the new branch mybranch
at the earlier
commit, and check out the state at that time.
You can always just jump back to your original master
branch by
doing
$ git switch master
(or any other branch-name, for that matter) and if you forget
which branch you happen to be on, a simple
$ cat .git/HEAD
will tell you where it's pointing. To get the list of branches
you have, you can say
$ git branch
which used to be nothing more than a simple script around ls
.git/refs/heads
. There will be an asterisk in front of the branch
you are currently on.
Sometimes you may wish to create a new branch without actually
checking it out and switching to it. If so, just use the command
$ git branch <branchname> [startingpoint]
which will simply create the branch, but will not do anything
further. You can then later — once you decide that you want to
actually develop on that branch — switch to that branch with a
regular git switch with the branchname as the argument.