Search code examples
mercurialrevert

Mercurial undo a series of commits


I have a mercurial repo with the following history (most recent commit at the top) on a feature branch:

mergeDefaultA
|
mergeDefaultB
|
C
|
mergeDefaultD

mergeDefaultXXXX are merge commits that came as the result of merging the default branch into the feature branch.

What has happened is commit C is screwed, but this was not noticed until after I had pushed mergeDefaultA to Bitbucket. What I want is the following picture:

exactlyWhatIsInMergeDefaultD
| 
mergeDefaultA
|
mergeDefaultB
|
C
|
mergeDefaultD

Where exactlyWhatIsInMergeDefaultD is literally exactly what was the state of the code in mergeDefaultD. However, everything I'm reading seems to indicate either you can't undo a series of commits like this (only a single commit back) and even then many of the options aren't available once you've pushed "into the wild".

How do I achieve this?

If this was git, I'd do:

git revert mergeDefaultD

How do I do the same in Mercurial?


Solution

  • Here's what I think you want:

    hg revert -r GOOD_REVISION_NUMBER --all
    hg commit -A -m "reverting back to revision GOOD_REVISION_NUMBER"
    

    Once that is committed, as soon as someone pulls from you (or you push to them) they will get the most recent revision containing only the good stuff. If they ever do want to go back to the bad stuff, you could always update to that revision:

    hg update -r BAD_REVISION_NUMBER