Search code examples
mergemercurialdvcsmerge-conflict-resolution

Mercurial show diff against 2 parents or base during merge


Our teem recently faced with merge that removes one leaf of merge and we "lost" changes (as if you perform hg merge --tool internal:local).

This happen because we don't experienced with hg merge command.

hg diff shown only one difference, but not other.

BASE --- HEAD1 --- MERGE
   \---- HEAD2 --/

Suppose in HEAD1 I merge HEAD2 but has not yet commit changes.

HEAD2 diff against MERGE I see by hg diff. It is -r BASE:HEAD2 patch.

How can I see diff between current local merge state with HEAD1 as if we merge from HEAD2

How can I see diff between current local merge state with BASE?


Solution

  • Thanks @Vince for suggestion. I reread hg help diff and hg help revset and get that I want.

    Assume that you at MERGE before commit and perform merge from HEAD1.

    To compare diff against HEAD1 use one of:

    hg diff
    hg diff -r .
    hg diff -r HEAD1
    

    Check:

     hg log -r .
    

    To compare diff against HEAD1 use one of:

    hg diff -r HEAD2
    

    If you have only 2 heads in current branch last expression can be written without HEAD2 name:

    hg diff -r 'branch(.) & head() - .'
    

    Check:

    hg log -r 'branch(.) & head() - .'
    

    To compare against BASE:

    hg log -r 'ancestor(HEAD1, HEAD2)'
    

    If you have only 2 heads in current branch last expression can be written without HEAD1/HEAD2 names::

    hg diff -r 'ancestor(branch(.) & head())'
    

    Check:

    hg log -r 'ancestor(branch(.) & head())'
    

    I wander if there are any shortcut for second parent of current merge. For first - just dot sign...

    UPDATE Hm... p1() and p2() are awesome! I rewrote my examples in way that they have no concrete names HEAD1/HEAD2:

    hg diff -r 'p1()'
    hg diff -r 'p2()'
    hg diff -r 'ancestor(p1(), p2())'