In the case that some spam or inappropriate comment makes its way through you interface, you can (sometimes) remove the offending commit XYZ.
| arch | |
| bzr | bzr uncommit && bzr revert |
| darcs | darcs obliterate –last=1 |
| git | git reset –hard HEAD^ |
| hg | hg rollback && hg revert |
| mtn | mtn db kill_rev_locally $(mtn automate get_base_revision_id) |
| arch | |
| bzr [1] | bzr rebase -r <XYZ+1>..-1 –onto before:XYZ . |
| darcs | darcs obliterate –matches ‘name XYZ’ |
| git | git rebase –onto XYZ~1 XYZ |
| hg [2] | |
| mtn [3] |
| [1] | Requires the `bzr-rebase plugin`_. Note, you have to increment XYZ by hand for <XYZ+1>, because bzr does not support after:XYZ. |
| [2] | From Mercurial, The Definitive Guide: “Mercurial also does not provide a way to make a file or changeset completely disappear from history, because there is no way to enforce its disappearance” |
| [3] | See Rebuilding ancestry in the Monotone documentation. |
Note that all of these change the repo history , so only do this on your interface-specific repo before it interacts with any other repo. Otherwise, you’ll have to survive by cherry-picking only the good commits.