Git does hide the old commits as well. What git doesn't do is track which commits are replaced by which. So sharing mutable history and seeing how a commit evolved over time requires more heuristic than necessary.
Yes, unreachable commits in Git are GC'd eventually, but you can disable it.
In Mercurial, hidden changesets are kept locally indefinitely, but they are not exchanged; only their obsolescence makers are. So you always know the meta-history of a changeset, but not necessarily their original content.
With Mercurial's evolve, the hidden commits are always there. When you push/clone, etc they get sent around.