There may be a subtle but important misunderstanding in these answers. I think I should add my answer to clarify it.
What is HEAD?
HEAD is you
HEAD is a symbolic reference pointing to any location in your commit history. No matter where you go or what you do, it follows you like a shadow. If you make a commit, HEAD moves. If you check out something, HEAD moves. No matter what you do, if you move to a new place in the commit history, HEAD follows you. To resolve a common misunderstanding: you cannot detach yourself from HEAD. This is not a detached HEAD state. If you find yourself thinking: 'Oh no, I'm in a detached HEAD state! I lost my HEAD!' Remember, this is your HEAD. HEAD is you. You are not detached from HEAD; you and HEAD have detached from other things.
What does HEAD point to?
HEAD can point to a commit, yes, but usually not. Let me say it again. Usually HEAD does not point to a commit. It points to a branch reference. It attaches to the branch; when you perform certain operations (e.g., commit or reset), the attached branch moves with HEAD. You can see what it points to by looking under the hood.
Usually you get something like:
Sometimes you get:
a3c485d9688e3c6bc14b06ca1529f0e78edd3f86
HEAD is what happens when it directly points to a commit. This is called a detached HEAD, because HEAD points to something other than a branch reference. If you make a commit in this state, master is no longer attached to HEAD and will not move with you. Where the commit is doesn't matter. You can be on the same commit as the master branch, but if HEAD points to that commit instead of the branch, it is detached, and new commits will not be associated with the branch reference.
If you try this exercise, you can visualize it graphically. Run these commands from your Git repository. You'll get slightly different output, but the key parts will be there. When you need to directly inspect a commit, use any abbreviated hash from the first output (here, a3c485d).
git checkout master
git log --pretty=format:"%h: %d" -1
# a3c485d: (HEAD -> master)
git checkout a3c485d -q # (-q is for dramatic effect)
git log --pretty=format:"%h: %d" -1
# a3c485d: (HEAD, master)
Okay, so the output has a slight difference. Directly checking a commit (instead of a branch) gives us a comma instead of an arrow. Do you think we're in a detached HEAD state? HEAD still points to the specific revision associated with the branch name. We're still on the master branch, aren't we?
Now try:
git status
# HEAD detached at a3c485d
No. We're in a 'detached HEAD' state.
(HEAD -> branch) You can see that it's the same as (HEAD, branch) when using git log -1.
In summary
HEAD is you. It points to whatever you're looking at, no matter where you are. Usually, it's not a commit, but a branch. If HEAD does point to a commit (or tag), even if it points to the same commit (or tag) as the branch, you (and HEAD) are detached from that branch. Since you're not attached to the branch, when you make a new commit, the branch won't follow you. HEAD, however, will.