When I first started using Git, I found the checkout
command quite confusing. However, as I adapted to Git's model of version control, it started to make sense. Now I am having to teach Git to my coworkers, and I'm trying to explain checkout
simply. I thought I had a simple explanation (from the documentation):
Checkout a branch or paths to the working tree
That seems to unify some of the things you can do with checkout which seem like a diverse set of operations to someone new to Git:
git checkout .
git checkout HEAD .
git checkout HEAD~2
git checkout feature/update-readme README.md
...except for the last one, because that doesn't just update the working directory, it stages the file.
How can I understand why or when checkout out will result in having something staged instead of just copied into the working directory?
git checkout
does in fact always stage all the files checked out. But if you do not specify a path (as in your first three examples), your HEAD will also be set to the commit you checked out and therefore your stage is identical to your HEAD i.e. there are no changes to commit.