What do git checkouts really mean?

git, git-checkout

Solution

As you noted, `HEAD` is a label noting where you are in the commit tree. It moves with you when you move from one commit to another. `git checkout <commit>` is the basic mechanism for moving around in the commit tree, moving your focus (`HEAD`) to the specified commit.

The commit can be specified by any of a number of ways, commit hash, branch name, tag name, the relative syntax (`HEAD^`, `HEAD~1`, etc.) and so on. It is often useful to consider a checkout to be changing branches, and there are some options that work from that perspective, but they all reference commits.

To checkout a commit has some side effects other than moving `HEAD` around.

- The working directory is updated to the state of the checked out commit.

- if a branch name is specified, checkout makes that branch active. The active branch will move along with any new commits that are added.

- with the `-b` option a new branch will be created based on the current commit and then made active.

- with the `--track` option the checked out branch can be made aware of a remote branch

- with the `--orphan` option a new branch is created (like with `-b`) but will not be based on any existing commit.

There are a few more options, which you can read about in the git checkout man-page, all of which revolve around moving from one commit to another -- just varying in what effect that move has in addition to moving `HEAD`.

Problem

What are `checkout`s in git? I know once you do `checkout` to a particular branch, the `HEAD` points to that branch. But what does it really mean? Does it mean I can then work on that branch? If yes, then, without checking out a branch, I am not able to work on it? Also, what does `remote checkout` mean? How is it useful?

Original source