[PATCH 00/12] Towards a better merge resolution support
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Aug 30, 2008, 00:42 UTC
- Message-ID
- <1220056963-2352-1-git-send-email-gitster@pobox.com>
This consists of two loosely related topics on improving conflicted merge resolution support.
The early part of the series is what you already saw. In addition to recording a conflicted merge in the RCS merge style we have traditionally used, this allows you to optionally use "diff3 -m" style. The difference is that the latter format shows the part from the common ancestor that corresponds to the parts both sides modified to cause the conflict, in addition to the changes done on each side. This can be chosen by setting a configuration variable. Rerere mechanism is updated to understand this new format as well, and conflicts from either formats interoperate well, because rerere mechanism only records and uses the changes made on each side, not what was in the common ancestor.
The last four patches are to "git checkout" that checks things out of the index. When resolving conflicts, sometimes you would screw up the state of the working tree so badly that you would wish to redo the merge from the beginning for one file, without having to redo the whole merge. Some other times, you already know changes made on one side already solves everything the other side attempted to do, and would want to take the change from that side as a whole. New options supported by "git checkout" when checking out from the index for these purposes are:
* git checkout -m -- path
This recreates the merge using information staged in stages 1/2/3; * git checkout --ours -- path
This writes 'our' version (stage #2) out for the path to the working tree;
* git checkout --theirs -- path
This writes 'their' version (stage #3) out for the path to the working tree;
None of these operations mark the path resolved. They are to help you prepare the working tree into a shape suitable as the resolution, and you will still conclude it with "git add path".
Junio C Hamano (12):
xdl_fill_merge_buffer(): separate out a too deeply nested function
xdiff-merge: optionally show conflicts in "diff3 -m" style
xmerge.c: minimum readability fixups
xmerge.c: "diff3 -m" style clips merge reduction level to EAGER or
less
rerere.c: use symbolic constants to keep track of parsing states
rerere: understand "diff3 -m" style conflicts with the original
merge.conflictstyle: choose between "merge" and "diff3 -m" styles
git-merge-recursive: learn to honor merge.conflictstyle
checkout: do not check out unmerged higher stages randomly
checkout: allow ignoring unmerged paths when checking out of the
index
checkout --ours/--theirs
checkout -m: recreate merge when checking out of unmerged indexDocumentation/config.txt | 8 ++ builtin-checkout.c | 206 +++++++++++++++++++++++++++++++++++---- builtin-merge-file.c | 17 +++- builtin-merge-recursive.c | 2 +- ll-merge.c | 16 +++- rerere.c | 29 ++++-- t/t6023-merge-file.sh | 44 +++++++++ t/t7201-co.sh | 133 +++++++++++++++++++++++++ xdiff-interface.c | 20 ++++ xdiff-interface.h | 2 + xdiff/xdiff.h | 6 + xdiff/xmerge.c | 237 +++++++++++++++++++++++++++++++-------------- 12 files changed, 612 insertions(+), 108 deletions(-)