The most obvious of those is the git concept of manually staging commits. That's a core design decision which you interact with on virtually every git operation (and no, DirState does not compare).
Think of it by analogy to python vs ruby. They both do the same thing and are used in the very similar problem spaces, but that does not make them similar technologies nor does it mean proficiency in one is transferable to the other.
1. Both Mercurial and Git use the same history model; both have DAGs and changesets.
2. The dirstate is an internal format, and it's analogous to Git's index. You are right though, that Git allows you to manage it manually is a big difference from Mercurial.
I think Mercurial tends to be more conservative in what it allows; it discourages history editing, and it tries to be similar to Subversion and CVS in terms of UI. Git, on the other hand, provides all the power user features - like commit amendment, rebasing, and index management - up front.
The real difference I thing is the way they manage branches, because this is part of the repository itself, thus changing it through extensions requires everybody that pulls the repository also install this extension. And if you do this then you aren't really using Mercurial or Git, you have instead created your own DVCS.