Adam Parkin
Adam Parkin

Reputation: 18660

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?

Upvotes: 1

Views: 1493

Answers (2)

Mathiasdm
Mathiasdm

Reputation: 1831

To expand a bit on Harvtronix' answer (which is fine, by the way):

One simple way is to revert to the old revision number ('GOOD') and commit. Note: reverting means that you set the files to the same content as in revision 'GOOD', you don't go back down the tree to that commit. If you did, you would indeed branch off and have two heads.

hg revert -r GOOD --all
hg commit -m "all is good now"

Another way can be to only throw out revision C (if I read your explanation correctly, it's actually just C that is causing the issue). 'hg backout'will introduce the reverse of C in your working directory, so you can then commit it.

hg backout -r C
hg commit -m "Backed out C"

Finally, one last option is to close the bad branch, update to the last commit that was fine and commit further there:

hg up -r BAD
hg commit --close-branch -m "This head is bad"
hg up -r GOOD
... continue here ...

Upvotes: 1

Harvtronix
Harvtronix

Reputation: 854

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

Upvotes: 4

Related Questions