I'd counter that these messes aren't caused by git; rather they are messes that without git you wouldn't even bother cleaning up.
However, git lets you fix the mess in such a way that you'll have a clean commit history. This is really helpful if you're trying to keep your codebase clean so that `git bisect` will always work nicely, and if you just want to keep your codebase history really grokkable.