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

[PATCH 1/3] merge-one-file: use empty blob for add/add base

From
Jeff King <peff@peff.net>
Date
Feb 23, 2016, 06:04 UTC
Message-ID
<20160223060441.GA3205@sigill.intra.peff.net>
In-Reply-To
<20160223060338.GA2912@sigill.intra.peff.net>

When we see an add/add conflict on a file, we generate the conflicted content by doing a 3-way merge with a "virtual" base consisting of the common lines of the two sides. This strategy dates back to cb93c19 (merge-one-file: use common as base, instead of emptiness., 2005-11-09).

Back then, the next step was to call rcs merge to generate the 3-way conflicts. Using the virtual base produced much better results, as rcs merge does not attempt to minimize the hunks. As a result, you'd get a conflict with the entirety of the files on either side.

Since then, though, we've switched to using git-merge-file, which uses xdiff's "zealous" merge. This will find the minimal hunks even with just the simple, empty base.

Let's switch to using that empty base. It's simpler, more efficient, and reduces our dependencies (we no longer need a working diff binary). It's also how the merge-recursive strategy handles this same case.

We can almost get rid of git-sh-setup's create_virtual_base, but we don't here, for two reasons:

  1. The functions in git-sh-setup are part of our public
     interface, so it's possible somebody is depending on
     it. We'd at least need to deprecate it first.
  2. It's also used by mergetool's p4merge driver. It's
     unknown whether its 3-way merge is as capable as git's;
     if not, then it is benefiting from the function.
Signed-off-by: Jeff King <peff@peff.net>
---
 git-merge-one-file.sh | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/git-merge-one-file.sh b/git-merge-one-file.sh
index cdc02af..424b034 100755
--- a/git-merge-one-file.sh
+++ b/git-merge-one-file.sh
@@ -120,8 +120,7 @@ case "${1:-.}${2:-.}${3:-.}" in
 	case "$1" in
 	'')
 		echo "Added $4 in both, but differently."
-		orig=$(git-unpack-file $2)
-		create_virtual_base "$orig" "$src2"
+		orig=$(git-unpack-file e69de29bb2d1d6434b8b29ae775ad8c2e48c5391)
 		;;
 	*)
 		echo "Auto-merging $4"
-- 
2.7.2.645.g4e1306c
Previous: Jeff KingNext: Jeff King
Message 9 of 19 in “What's cooking in git.git (Feb 2016, #05; Wed, 17)”
  1. Junio C HamanoFeb 17, 2016
  2. Jeff KingFeb 17, 2016
  3. Junio C HamanoFeb 18, 2016
  4. whither merge-tree? (was: What's cooking in git.git (Feb 2016, #05; Wed, 17))Jeff King, Feb 22, 2016
  5. Junio C HamanoFeb 22, 2016
  6. Jeff KingFeb 23, 2016
  7. Jeff KingFeb 23, 2016
  8. Jeff KingFeb 23, 2016
  9. 1/3 merge-one-file: use empty blob for add/add baseJeff King, Feb 23, 2016
  10. 2/3 merge-tree: drop generate_common strategyJeff King, Feb 23, 2016
  11. 3/3 xdiff: drop XDL_EMIT_COMMONJeff King, Feb 23, 2016
  12. Junio C HamanoFeb 23, 2016
  13. Jeff KingFeb 23, 2016
  14. Stefan FrühwirthFeb 23, 2016
  15. Dennis KaarsemakerFeb 24, 2016
  16. Jeff KingFeb 24, 2016
  17. Jeff KingFeb 24, 2016
  18. Johannes SchindelinFeb 23, 2016
  19. Duy NguyenFeb 23, 2016

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.