git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v3 00/19] "git apply --3way"

From
Junio C Hamano <gitster@pobox.com>
Date
Jun 13, 2012, 19:32 UTC
Message-ID
<1339615980-19727-1-git-send-email-gitster@pobox.com>
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
Next: Junio C Hamano
Message 1 of 20 in “"git apply --3way"”
  1. 00/19 "git apply --3way"Junio C Hamano, Jun 13, 2012
  2. 01/19 apply: fix an incomplete comment in check_patch()Junio C Hamano, Jun 13, 2012
  3. 02/19 apply: a bit more comments on PATH_TO_BE_DELETEDJunio C Hamano, Jun 13, 2012
  4. 03/19 apply: clear_image() clears things a bit moreJunio C Hamano, Jun 13, 2012
  5. 04/19 apply: refactor read_file_or_gitlink()Junio C Hamano, Jun 13, 2012
  6. 05/19 apply: factor out checkout_target() helper functionJunio C Hamano, Jun 13, 2012
  7. 06/19 apply: split load_preimage() helper function outJunio C Hamano, Jun 13, 2012
  8. 07/19 apply: refactor "previous patch" logicJunio C Hamano, Jun 13, 2012
  9. 08/19 apply: further split load_preimage()Junio C Hamano, Jun 13, 2012
  10. 09/19 apply: move check_to_create_blob() closer to its sole callerJunio C Hamano, Jun 13, 2012
  11. 10/19 apply: move "already exists" logic to check_to_create()Junio C Hamano, Jun 13, 2012
  12. 11/19 apply: accept -3/--3way command line optionJunio C Hamano, Jun 13, 2012
  13. 12/19 apply: fall back on three-way mergeJunio C Hamano, Jun 13, 2012
  14. 13/19 apply: plug the three-way merge logic inJunio C Hamano, Jun 13, 2012
  15. 14/19 apply: move verify_index_match() higherJunio C Hamano, Jun 13, 2012
  16. 15/19 apply: --3way with add/add conflictJunio C Hamano, Jun 13, 2012
  17. 16/19 apply: register conflicted stages to the indexJunio C Hamano, Jun 13, 2012
  18. 17/19 apply: allow rerere() upon --3way resultsJunio C Hamano, Jun 13, 2012
  19. 18/19 apply: document --3way optionJunio C Hamano, Jun 13, 2012
  20. 19/19 apply --3way: testsJunio C Hamano, Jun 13, 2012

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.