This is helpful. I think. If I have a good mental model, then every git commit becomes a child of another commit. A tag is left-sticky, whereas a branch is right-sticky. Meaning that any new commits don't change a tag, but every commit to a branch causes the commit to be inserted behind the head of the branch.
Adding to the confusion, you can have a branch checked out, or you can have the commit that is currently just behind the branch checked out. Either way your source code is the same, but if you commit without a branch, you are affecting no branch at all, not even HEAD.
In this mental model, a branch is essentially a commit with no contents, and no hash, but it has a tag (name).