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

[PATCH 3/8] merge-ort: enable diff-algorithms other than histogram

From
Elijah Newren via GitGitGadget <gitgitgadget@gmail.com>
Date
Mar 31, 2025, 15:51 UTC
Message-ID
<3945c471b0c40b49e9a48feaba6dae2afc96fa6a.1743436280.git.gitgitgadget@gmail.com>
In-Reply-To
<pull.1898.git.1743436279.gitgitgadget@gmail.com>
From: Elijah Newren <newren@gmail.com>

The ort merge strategy has always used the histogram diff algorithm. The recursive merge strategy, in contrast, defaults to the myers diff algorithm, while allowing it to be changed.

Change the ort merge strategy to allow different diff algorithms, by removing the hard coded value in merge_start() and instead just making it a default in init_merge_options(). Technically, this also changes the default diff algorithm for the recursive backend too, but we're going to remove the final callers of the recursive backend in the next two commits.

Signed-off-by: Elijah Newren <newren@gmail.com>
---
 Documentation/merge-strategies.adoc | 29 +++++++++++++++--------------
 merge-ort.c                         |  3 ---
 merge-recursive.c                   |  1 +
 3 files changed, 16 insertions(+), 17 deletions(-)
diff --git a/Documentation/merge-strategies.adoc b/Documentation/merge-strategies.adoc
index 59f5ae36ccb..8c87dd70210 100644
--- a/Documentation/merge-strategies.adoc
+++ b/Documentation/merge-strategies.adoc
@@ -87,6 +87,20 @@ no-renames;;
 	configuration variable.
 	See also linkgit:git-diff[1] `--no-renames`.
 
+histogram;;
+	Deprecated synonym for `diff-algorithm=histogram`.
+
+patience;;
+	Deprecated synonym for `diff-algorithm=patience`.
+
+diff-algorithm=[histogram|minimal|myers|patience];;
+	Use a different diff algorithm while merging, which can help
+	avoid mismerges that occur due to unimportant matching lines
+	(such as braces from distinct functions).  See also
+	linkgit:git-diff[1] `--diff-algorithm`.  Note that `ort`
+	defaults to `diff-algorithm=histogram`, while regular diffs
+	currently default to the `diff.algorithm` config setting.
+
 subtree[=<path>];;
 	This option is a more advanced form of 'subtree' strategy, where
 	the strategy makes a guess on how two trees must be shifted to
@@ -111,20 +125,7 @@ recursive::
 For a path that is a submodule, the same caution as 'ort' applies to this
 strategy.
 +
-The 'recursive' strategy takes the same options as 'ort'.  However,
-there are two additional options that 'ort' ignores (not documented
-above) that are potentially useful with the 'recursive' strategy:
-
-patience;;
-	Deprecated synonym for `diff-algorithm=patience`.
-
-diff-algorithm=[patience|minimal|histogram|myers];;
-	Use a different diff algorithm while merging, which can help
-	avoid mismerges that occur due to unimportant matching lines
-	(such as braces from distinct functions).  See also
-	linkgit:git-diff[1] `--diff-algorithm`.  Note that `ort`
-	specifically uses `diff-algorithm=histogram`, while `recursive`
-	defaults to the `diff.algorithm` config setting.
+The 'recursive' strategy takes the same options as 'ort'.
 
 resolve::
 	This can only resolve two heads (i.e. the current branch
diff --git a/merge-ort.c b/merge-ort.c
index 2b7d86aa4ec..14a7ae4a6bf 100644
--- a/merge-ort.c
+++ b/merge-ort.c
@@ -4957,9 +4957,6 @@ static void merge_start(struct merge_options *opt, struct merge_result *result)
 	}
 	trace2_region_leave("merge", "sanity checks", opt->repo);
 
-	/* Default to histogram diff.  Actually, just hardcode it...for now. */
-	opt->xdl_opts = DIFF_WITH_ALG(opt, HISTOGRAM_DIFF);
-
 	/* Handle attr direction stuff for renormalization */
 	if (opt->renormalize)
 		git_attr_set_direction(GIT_ATTR_CHECKOUT);
diff --git a/merge-recursive.c b/merge-recursive.c
index 884ccf99a58..f3df127ad9b 100644
--- a/merge-recursive.c
+++ b/merge-recursive.c
@@ -3981,6 +3981,7 @@ static void init_merge_options(struct merge_options *opt,
 	opt->renormalize = 0;
 
 	opt->conflict_style = -1;
+	opt->xdl_opts = DIFF_WITH_ALG(opt, HISTOGRAM_DIFF);
 
 	merge_recursive_config(opt, ui);
 	merge_verbosity = getenv("GIT_MERGE_VERBOSITY");
-- 
gitgitgadget
Previous: Elijah Newren via GitGitGadgetNext: Elijah Newren via GitGitGadget
Message 4 of 31 in “Debug merge-recursive.[ch]”
  1. 0/8 Debug merge-recursive.[ch]Elijah Newren via GitGitGadget, Mar 31, 2025
  2. 1/8 checkout: replace merge_trees() with merge_ort_nonrecursive()Elijah Newren via GitGitGadget, Mar 31, 2025
  3. 2/8 builtin/merge-recursive: switch to using merge_ort_generic()Elijah Newren via GitGitGadget, Mar 31, 2025
  4. 3/8 merge-ort: enable diff-algorithms other than histogramElijah Newren via GitGitGadget, Mar 31, 2025
  5. 4/8 sequencer: switch non-recursive merges over to ortElijah Newren via GitGitGadget, Mar 31, 2025
  6. 5/8 merge, sequencer: switch recursive merges over to ortElijah Newren via GitGitGadget, Mar 31, 2025
  7. 7/8 tests: remove GIT_TEST_MERGE_ALGORITHM and test_expect_merge_algorithmElijah Newren via GitGitGadget, Mar 31, 2025
  8. Eric SunshineMar 31, 2025
  9. Elijah NewrenMar 31, 2025
  10. 6/8 merge-recursive.[ch]: thoroughly debug theseElijah Newren via GitGitGadget, Mar 31, 2025
  11. 8/8 builtin/{merge,rebase,revert}: remove GIT_TEST_MERGE_ALGORITHMElijah Newren via GitGitGadget, Mar 31, 2025
  12. 0/8 Debug merge-recursive.[ch]Elijah Newren via GitGitGadget, Apr 5, 2025
  13. 1/8 checkout: replace merge_trees() with merge_ort_nonrecursive()Elijah Newren via GitGitGadget, Apr 5, 2025
  14. 2/8 builtin/merge-recursive: switch to using merge_ort_generic()Elijah Newren via GitGitGadget, Apr 5, 2025
  15. 3/8 merge-ort: enable diff-algorithms other than histogramElijah Newren via GitGitGadget, Apr 5, 2025
  16. 4/8 sequencer: switch non-recursive merges over to ortElijah Newren via GitGitGadget, Apr 5, 2025
  17. 5/8 merge, sequencer: switch recursive merges over to ortElijah Newren via GitGitGadget, Apr 5, 2025
  18. 8/8 builtin/{merge,rebase,revert}: remove GIT_TEST_MERGE_ALGORITHMElijah Newren via GitGitGadget, Apr 5, 2025
  19. 7/8 tests: remove GIT_TEST_MERGE_ALGORITHM and test_expect_merge_algorithmElijah Newren via GitGitGadget, Apr 5, 2025
  20. 6/8 merge-recursive.[ch]: thoroughly debug theseElijah Newren via GitGitGadget, Apr 5, 2025
  21. Junio C HamanoApr 7, 2025
  22. Elijah NewrenApr 7, 2025
  23. 0/8 Debug merge-recursive.[ch]Elijah Newren via GitGitGadget, Apr 8, 2025
  24. 1/8 checkout: replace merge_trees() with merge_ort_nonrecursive()Elijah Newren via GitGitGadget, Apr 8, 2025
  25. 2/8 builtin/merge-recursive: switch to using merge_ort_generic()Elijah Newren via GitGitGadget, Apr 8, 2025
  26. 3/8 merge-ort: enable diff-algorithms other than histogramElijah Newren via GitGitGadget, Apr 8, 2025
  27. 4/8 sequencer: switch non-recursive merges over to ortElijah Newren via GitGitGadget, Apr 8, 2025
  28. 5/8 merge, sequencer: switch recursive merges over to ortElijah Newren via GitGitGadget, Apr 8, 2025
  29. 8/8 builtin/{merge,rebase,revert}: remove GIT_TEST_MERGE_ALGORITHMElijah Newren via GitGitGadget, Apr 8, 2025
  30. 7/8 tests: remove GIT_TEST_MERGE_ALGORITHM and test_expect_merge_algorithmElijah Newren via GitGitGadget, Apr 8, 2025
  31. 6/8 merge-recursive.[ch]: thoroughly debug theseElijah Newren via GitGitGadget, Apr 8, 2025

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.