Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I revert multiple commits in Mercurial?

I have a bunch of commits, say A, B, C, D, and I want to keep B, C, and D, and make a commit that is (BCD)⁻¹. What's the easiest way to do this, if I have many commits that I want to undo at the same time?

(I seem to recall seeing a stackoverflow question about this that suggested that I hg update to A, and then call hg commit with some arguments, but I can't seem to find that question now.)

like image 348
Jason Gross Avatar asked Jul 23 '12 05:07

Jason Gross


1 Answers

It sounds like you are looking for backout. See:

hg help backout

I don’t think it can back out multiple commits in one go, so you have to back them out individually:

hg backout D
hg backout C
hg backout B

This will create three commits on top of D that are the reverse of D, and C, and B. If you want to combine these commits into one changeset, you can fold them using rebase --collapse or one of a number of other extensions (e.g. the histedit or mq or collapse extensions).

If you don’t want to back out the individual changes but do it all in one go, you could do the following:

hg update A
hg debugsetparents D
hg commit -m "revert B-D"

It’s ugly, but it works. However this does not record renames in reverse. To be honest though, I wouldn’t recommend doing this, if you need to back out so much that individual backout commands are too much trouble to type it makes me wonder if backing out is really what you should want to be doing for that particular case.

Alternatively, you could do as Jim and Rafael suggested, and decide that B, C and D are on a branch, and update back to A and continue committing there (splitting off history at that point). This may be more appropriate.

like image 57
Laurens Holst Avatar answered Oct 12 '22 09:10

Laurens Holst