Here is the third round. Previous ones are: http://thread.gmane.org/gmane.comp.version-control.git/197538 http://thread.gmane.org/gmane.comp.version-control.git/197637 "git am -3" is useful when you have to accept a patch submission to a tree that has slightly been modified, but when you are reordeing your own work, you would be picking some parts of a later commits to earlier codebase without wanting to make commits out of individual steps. Teach "git apply" a similar "-3"way merge fallback option with this series, and you can now apply your patches without having to reduce context. As it will leave the conflicted halves in the index and let you manually resolve conflicts in the working tree, "--3way" implies "--index", and cannot be used with "--cached". Note that this does not call merge-recursive like "am -3" does, and does not implement renames (i.e. a patch wants to modify path A, your codebase has the corresponding contents at path B---"git am -3" will end up modifying path B, but the round of this series does not). It should be more or less straightforward to enhance it, though. Instead of aborting with "preimage A does not exist in the index nor the working tree", after finding the necessary blob that the patch author had at path A, you run the similarity algorithm with the blob in your tree to find path B, update the "struct patch" to rewrite it to apply to path B, and let the existing code take care of the rest. Given that I started this early last month, even discounting the fact that I was looking at it only in the background, the whole thing would have been a bit too big for a student inexperienced to the code base to swallow. I would say that it would be a good bite-sized GSoC project next summer to build on this series and make it replace the "am -3" implementation (that means the above "apply a patch to A to path B" needs to be added), which lets us kill the ugly "--build-fake-ancestor" hack. Junio C Hamano (19): apply: fix an incomplete comment in check_patch() apply: a bit more comments on PATH_TO_BE_DELETED apply: clear_image() clears things a bit more apply: refactor read_file_or_gitlink() apply: factor out checkout_target() helper function apply: split load_preimage() helper function out apply: refactor "previous patch" logic apply: further split load_preimage() apply: move check_to_create_blob() closer to its sole caller apply: move "already exists" logic to check_to_create() apply: accept -3/--3way command line option apply: fall back on three-way merge apply: plug the three-way merge logic in apply: move verify_index_match() higher apply: --3way with add/add conflict apply: register conflicted stages to the index apply: allow rerere() upon --3way results apply: document --3way option apply --3way: tests Documentation/git-apply.txt | 11 +- builtin/apply.c | 550 ++++++++++++++++++++++++++++++++++---------- t/t4108-apply-threeway.sh | 157 +++++++++++++ t/t4117-apply-reject.sh | 8 + 4 files changed, 608 insertions(+), 118 deletions(-) create mode 100755 t/t4108-apply-threeway.sh -- 1.7.11.rc3.30.g3bdace2 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html