In a nutshell, git commits are a tree, and branches are just pointers to some commits.
git checkout <specified commit> does not move the branch pointer. When you do this, you are in detached head state. You will see this message, which is pretty self-explanatory:
You are in 'detached HEAD' state. You can look around, make
experimental changes and commit them, and you can discard any commits
you make in this state without impacting any branches by performing
another checkout.
If you want to create a new branch to retain commits you create, you
may do so (now or later) by using -b with the checkout command again.
Example:
git checkout -b new_branch_name
Another difference is that git checkout is safer, because it will not reject your changes in the working tree, and you will not lose any commits with it¹.
git reset --hard <specified commit>, on the other hand, will move your current branch to the specified commit and you will lose all the changes in your working tree. Additionally, if you're moving to some older commit, and the newer commits are not in some other branch, you will lose these newer commits too. It is not a safe operation and don't do this unless you really understand what you're doing.
See also these great answers for information about how to undo a git commit.
You might also benefit from using a GUI tool like SourceTree.
¹ - well, unless you're already in detached head state on some dangling commit, but normally you shouldn't worry.