The index is one of the key components in git, but it doesn't really have a name or label in the UI. Say that it was called "index"; then the current "git diff" would be equivalent to "git diff index", and the current "git diff --cached" to "git diff index..HEAD". Less special cases to remember. IMHO, of course.
The same way "git checkout index foo.c" would fetch foo.c from the index (I don't even remember the magic incantation for doing that now). Etc.
Also, I still think that using the index should be optional: "git diff" should default to "git diff HEAD", "git commit" should default to the current "git commit -a", etc.
"git checkout" tries to do too much. It creates and switches to branches, and copies blobs from the repository to the working tree. The first form is reasonably safe, and bails out without --force if you do something stupid, the second does not. At least for me, the only way to learn the difference is the hard way.
The branch-switching should probably be done by "git branch" instead, and the fetching of blobs by "git reset" (which sometimes already does this, but with very confusing options; I never remember the difference between --soft, --mixed, --hard, --mixed and whatever).
That's only a couple of changes that could have been made a long time ago. Now it is definitely too late. Even if the git UI could be made smaller and more logical (with a huge amount of work), it's not worth pissing off pretty much every git user out there...
Obviously, it trips beginners up.
And it encourages committing stuff that may never have coexisted in the working tree - and thus have never been tested together.
I'm talking about fundamental interaction with the version control system, not a pretty gui. git has pretty gui too.
If you want a really nice, consistent UI, check out darcs.