Imagine that you clone a Git repository with many branches. After the clone is successful, if
you run git branch
, you’d see that you only have the main
branch in your local repository.
However, the command git branch --all
will output a list of branches prefixed by remotes/origin/
. Here is the top 5 lines of the output when running this command on the discourse project.
* main
remotes/origin/0-ansible-eggs
remotes/origin/0-app-events-revolution
remotes/origin/0-array-lint
remotes/origin/0-assets-spec
Assuming that you want to switch to the 0-ansible-eggs
branch, you can run the following command:
git checkout 0-ansible-eggs
If you have read my earlier post on Git branches, you’d know that git checkout
can be used to switch to an existing branch, not to an non-existent branch. As already mentioned above, 0-ansible-eggs
does not exist in your local repository.
In this post, I will be exploring the magic that Git performs in making this short command work.
Behind the scenes
Assume that you want to switch to the 0-ansible-eggs
(remotes/origin/0-ansible-eggs
) branch, but
not with the same name. You may want to use a different name for the corresponding local branch,
then the command that you’d use is:
git checkout -b <localBranchName> remotes/origin/0-ansible-eggs
The localBranchName
can be any name, even the same name you hated initially: 0-ansible-eggs
.
So, when you run git checkout 0-ansible-eggs
and Git figures out that the branch 0-ansible-eggs
does not exist (it is not present in local) AND this branch is present in only one remote, then
Git will:
- Automatically create the local branch with the same name
- Set up tracking between the local branch and the remote branch
- Switch to the local branch
In other words, Git expands git checkout 0-ansible-eggs
into git checkout -b 0-ansible-eggs remotes/origin/0-ansible-eggs
.
What did you learn in this post?
You learned how the commonly used git checkout
command works behind the scenes even when the
branch does not exist, in case of branches with the same name in remote.