> If Mercurial throws the old version away unconditionally, that would suck very much indeed.
Which is why it isn't done.
In core Mercurial, the old revisions are stored in a backup bundle in a separate backup directory. Note that bundles can transparently be used as read-only repositories, so you can view their logs as though they were still part of the parent repo, diff against them, pull from them, etc.
With the evolve extension, those revisions will simply be marked as obsolete, with obsolescence markers showing which revisions were replaced by which. The commits will be hidden, but are still part of the repository. If you ever want to get rid of the old revisions, you'd have to use (say) `hg strip -r 'exctinct()'`, which would store them as bundles as described above, or clone the repository and delete the old repository.
Plus, there are public, draft, and secret changesets. Public changesets are immutable and cannot be changed without user override.
Bazaar rebase will simply hide the old revisions; you can recover them with `bzr heads --all`. To permanently delete the revisions, you have to clone the repository and delete the old version (and all backups). And, of course, there's rarely a reason to use rebase in Bazaar.
> Hence: you either have a system that makes it much easier than Git to lose data, or you need garbage collection.
As I described above, neither. In every case, you need to go through several steps each requiring the user to affirmatively express their desire to delete data.
And as disk space is really cheap these days, hardly anyone ever actually deletes the data in practice, as there's no point to it.
> I don't know what Mercurial does, but somehow, the fact that this dilemma isn't obvious to you -- somebody who clearly seems to know a lot about Mercurial -- doesn't instill a lot of confidence in it.
I think your dilemma is largely an imaginary one, fretting over a resource (disk space) that is too plentiful to require micromanagement.
Keep in mind that most of the data in your repository will come from other people; there's only so much source code or text that a single person can write in a day. If you're generating massively large binary assets, a DVCS is probably the wrong tool, anyway, because of scaling concerns. This inherently limits the amount of "wasted" data that you can have in a repository to a percentage of the repository size.