Going through the levels I find myself wishing I could explicitly use HEAD any place I could use a branch name. It seems like it just adds to the variety of subtly different ways of moving pointers around.
git branch -f master c0 <- named branch points to c0
git reset c0 <- checked out branch points to c0
git checkout c0 <- HEAD points to c0
I'm still not sure if these commands have other side effects, or if I'm abusing the model in some way. But I feel a disconnect between the git model as explained to me (commits and branches), my interpretation of the model (file changes and pointers), the results I want (change pointer target), and the git commands (branch, reset, checkout).