Search code examples
mercurialbranch

Mercurial: How to deal with one branch that has two heads


What if one branch has two heads? I came to this situation weeks ago for some reason I didn't merged them back then and just continued developing on one head. Now I want to get rid of the other head. What should I do? Should I just merge them after so many changesets?


Solution

  • So you have this:

    o--o--o--A--B  <- older unnecessary head
           \
            1--2--3--4--5--6  <- newer ‘good’ head
    

    ...and you don't need A and B, absolutely, 100% sure. If you aren't sure, and there are possibly salvageable things in A and B, better merge the heads to combine the changes. As Aaron said, Mercurial is good at it.

    Now you have two options:

    • get rid of the old head, or
    • do a dummy merge of two heads that ignores head B.

    If changesets A and B are present in other repositories you don't control, e.g. if other people pulled A and B into their repositories, or you pushed A and B to a public repository (say, Bitbucket), then you've released A and B into the wild, and can't get rid of them. You should do a dummy merge:

    $ hg up 6
    $ hg --config ui.merge=internal:local merge
    

    This will ignore any changes from A and B when merging.

    If, on the other hand, A and B are private, you can either strip them:

    $ hg strip A
    

    (Rev A and descendants stripped; enable the MQ extension to make strip available.)

    Or, make a new clone of your repository without changesets A and B:

    $ hg clone myrepo myrepo2-clone -r 6
    

    (Only rev 6 and ancestors added to the clone.)