Re: 4-way diff (base,ours,theirs,merged) to review merge results
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Feb 26, 2012, 09:05 UTC
- Message-ID
- <7vd392ezhx.fsf@alter.siamese.dyndns.org>
- In-Reply-To
- <jicafn$gnj$1@dough.gmane.org>
"Neal Kreitzinger" <neal@rsss.com> writes:
> .... What is the > best way to display a 4-way diff of merge-base, "ours", "theirs", and > "merged" after a merge completes so you can review the "merged" results for > correctness?
Ahh, sorry. While everything I wrote in my previous reply is correct with respect to what happens _during_ a merge until you resolve it, I did not realize that you were asking how to view a merge _after_ it is made.
For a two-parent merge $M, "git show --cc $M" runs a three-way diff between $M (merge result), $M^1 (the first parent) and $M^2 (the other parent) and the combined diff it shows is equivalent to:
$ git diff --cc $M $M^1 $M^2
Notice the order of parameters. Unlike a normal "diff A B" to ask the command to explain how the state B is reached from state A, you give the result $M and ask the command to explain how it was reached from other states.
So in a similar way, running
$ git diff --cc $M $M^1 $M^2 $(git merge-base $M^1 $M^2)
should show a combined patch that explains the state at $M relative to the states recorded in its parents and the merge base.
I've never tried it myself, though, as I never needed such an operation.
You can try a trivial example with 4d9e079, which merges 583c389 ec7ff5b and has conflicts in cache.h
$ git show 4d9e079 -- cache.h Output omitted; you can see it is the same as the next one for yourself.
$ git diff --cc 4d9e079 583c389 ec7ff5b -- cache.h diff --cc cache.h index 3a8e125,24732e6..422c5cf
--- a/cache.h +++ b/cache.h @@@ -1177,7 -1176,7 +1177,8 @@@ extern void setup_pager(void) extern const char *pager_program; extern int pager_in_use(void); extern int pager_use_color; +extern int term_columns(void); + extern int decimal_width(int); extern const char *editor_program; extern const char *askpass_program; One side adds term_columns, the other side adds decimal_width. $ git diff --cc 4d9e079 583c389 ec7ff5b \ $(git merge-base 583c389 ec7ff5b) -- cache.h diff --cc cache.h index 3a8e125,24732e6,9bd8c2d..422c5cf --- a/cache.h +++ b/cache.h @@@@ -1177,7 -1176,7 -1176,6 +1177,8 @@@@ extern void setup_pager(void) extern const char *pager_program; extern int pager_in_use(void); extern int pager_use_color; ++extern int term_columns(void); + +extern int decimal_width(int); extern const char *editor_program; extern const char *askpass_program; The third column is a diff between $M and $(git merge-base $M^1 $M^2); the resulting two new lines are indeed shown as additions against the merge base.