You want to keep a detailed history of your repo, but want to have (and be able to export) an idealized story that contains only āreasonableā versions, right? I can empathize.
Solution 1: Use tags to mark interesting moments in the story, and learn to ignore all the messy bits between them.
Solution 2: Use two branches and merge. Make your development in the default branch and save the parallel release branch. (You can call it clean , but in fact you control releases). Whenever default is in a stable state that you want to check, switch to the release branch and merge the current default state into it - in batches, if you want. If you never associate anything with release , there will never be a merge conflict conflict.
(original branch) --o--o--o--o--o--o--o (default) \ \ \ r ... ... --r--------r (release)
Result: you can upgrade to any version of release and expect a healthy state. You can run hg log -r release and you will see only the selected breakpoints. You can view the full magazine to find out how it all happened. Disadvantages: since the release branch depends on default , you cannot drag it to another repo without bringing default with you. Also hg glog -r release will look weird due to repeated merges.
Solution 3: Use the named branches as above, but use the rebase extension instead of merging. He has the ability to copy, and not just drag and drop changed changes; and it has the --collapse option, which converts a set of changes into one. Whenever you have a set of r1:tip revisions that you want to complete, copy them from default to release as follows:
hg rebase --source r1 --dest release --keep --collapse
This pushes one revision at the beginning of release , which is equivalent to the whole set of changes from r1 to the default chapter. The --keep option makes it a copy, not a destructive rewrite. The advantage is that the release branch looks the way you wanted it: nice and clean, and you can click it without dragging the default branch with it. The downside is that you cannot associate your steps with changes to default , so I would recommend method 2 if you really don't need to hide the intermediate versions. (Also: itās not so easy to deflate history in several batches, since rebase will move / copy all descendants of the āoriginalā version.)
All this requires additional work from you. This is inevitable, since mercurial has no way of knowing which reversals you would like to deflate.