Disable backing out merges?

Matt Mackall mpm at selenic.com
Thu Oct 6 16:03:21 CDT 2011

On Thu, 2011-10-06 at 22:51 +0200, Angel Ezquerra wrote:
> On Thu, Oct 6, 2011 at 9:45 PM, Matt Mackall <mpm at selenic.com> wrote:
> > Seems a bunch of people are trying to use backout to deal with broken
> > merges. That doesn't work:
> >
> > - it's not well-defined what the result should be
> > - we can't actually erase the problematic DAG edge
> >
> > So it seems like we should just refuse to do it until we get a lot
> > smarter here.
> Say I have made a merge and pushed it. Later I realize that it is a
> bad merge and I want to get rid of it.
> If it is not possible to back it out. What are the alternatives?

If your problem is that "I did a merge when I shouldn't have" or "I
should never merge branch X and Y and I did it anyway", backout doesn't
really help you with your biggest problem: you've introduced a merge
into the history graph that shouldn't be there. This bogus piece of the
graph will confuse future merges and the only way to truly fix it is to
destructively strip the bad merge from history and all clones. Backout
can't help you at all here, nor can anything else.

On the other hand, if you've incorrectly performed an otherwise
reasonable merge, backout is still completely the wrong tool for the
job. Backout undoes all the changes in a changeset, which is not what's
wanted with a valid merge.

So backout on a merge is ALWAYS the wrong thing.

> I could redo the merge, but then wouldn't that create a new head when
> I push it? Perhaps I would need to also perform a dummy merge between
> the old, bad merge, and the new, good one? Or maybe I could close the
> merge branch? Would that work?

I don't think that's correct for either use case.

Mathematics is the supreme nostalgia of our time.

More information about the Mercurial-devel mailing list