That's one part of it - the unintuitive and misnamed command an options; mercurial does a bit better and I know a lot of people prefer it for that reason. The other part is a lack of understanding of the underlying model of how git works. It's not that difficult to understand but you do need to understand the model to get yourself out of trouble if you find yourself in a situation you didn't expect.
I find myself in those situations almost every time I step off the beaten path. Given one or more existing commits, revert the changes that the related patches introduce, and record some new commits that record them. This requires your working tree to be clean. LOL RFOLgit-revert - Revert some existing commits
Note: git revert is used to record some new commits to reverse the effect of some earlier commits (often only a faulty one). If you want to throw away all uncommitted changes in your working directory, you should see git-reset(1), particularly the --hard option. If you want to extract specific files as they were in another commit, you should see git-checkout(1), specifically the git checkout <commit> -- <filename> syntax. Take care with these alternatives as both will discard uncommitted changes in your working directory.
If you haven't seen it yet, the Git man page generator is pretty amusing, and excellently lampoons the man pages.