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

Re: [PATCH 9/9] rerere forget path: forget recorded resolution

From
Junio C Hamano <gitster@pobox.com>
Date
Jan 6, 2010, 21:59 UTC
Message-ID
<7vzl4qopxt.fsf@alter.siamese.dyndns.org>
In-Reply-To
<7vr5q31871.fsf@alter.siamese.dyndns.org>
Junio C Hamano <gitster@pobox.com> writes:
> However, I think you need this fix for "checkout -m" to work as intended,

Here is a cleaner reroll with tests, meant to be applied on v1.6.1-rc1 or later.

-- >8 --
Subject: [PATCH] checkout -m path: fix recreating conflicts

We should tell ll_merge() that the 3-way merge between stages #2 and #3 is an outermost merge, not a virtual-ancestor creation.

Back when this code was originally written, users couldn't write custom merge drivers easily, so the bug didn't matter, but these days it does.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 builtin-checkout.c |    2 +-
 t/t7201-co.sh      |   57 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 58 insertions(+), 1 deletions(-)
diff --git a/builtin-checkout.c b/builtin-checkout.c
index 7f3bd7b..e41e73b 100644
--- a/builtin-checkout.c
+++ b/builtin-checkout.c
@@ -179,7 +179,7 @@ static int checkout_merged(int pos, struct checkout *state)
 	fill_mm(active_cache[pos+2]->sha1, &theirs);
 
 	status = ll_merge(&result_buf, path, &ancestor,
-			  &ours, "ours", &theirs, "theirs", 1);
+			  &ours, "ours", &theirs, "theirs", 0);
 	free(ancestor.ptr);
 	free(ours.ptr);
 	free(theirs.ptr);
diff --git a/t/t7201-co.sh b/t/t7201-co.sh
index 0e21632..3214ad2 100755
--- a/t/t7201-co.sh
+++ b/t/t7201-co.sh
@@ -534,4 +534,61 @@ test_expect_success 'failing checkout -b should not break working tree' '
 
 '
 
+(
+ echo "#!$SHELL_PATH"
+ cat <<\EOF
+O=$1 A=$2 B=$3
+cat "$A" >.tmp
+exec >"$A"
+echo '<<<<<<< filfre-theirs'
+cat "$B"
+echo '||||||| filfre-common'
+cat "$O"
+echo '======='
+cat ".tmp"
+echo '>>>>>>> filfre-ours'
+rm -f .tmp
+exit 1
+EOF
+) >filfre.sh
+chmod +x filfre.sh
+
+test_expect_success 'custom merge driver with checkout -m' '
+	git reset --hard &&
+
+	git config merge.filfre.driver "./filfre.sh %O %A %B" &&
+	git config merge.filfre.name "Feel-free merge driver" &&
+	git config merge.filfre.recursive binary &&
+	echo "arm merge=filfre" >.gitattributes &&
+
+	git checkout -b left &&
+	echo neutral >arm &&
+	git add arm .gitattributes &&
+	test_tick &&
+	git commit -m neutral &&
+	git branch right &&
+
+	echo left >arm &&
+	test_tick &&
+	git commit -a -m left &&
+	git checkout right &&
+
+	echo right >arm &&
+	test_tick &&
+	git commit -a -m right &&
+
+	test_must_fail git merge left &&
+	(
+		for t in filfre-common left right
+		do
+			grep $t arm || exit 1
+		done
+		exit 0
+	) &&
+
+	mv arm expect &&
+	git checkout -m arm &&
+	test_cmp expect arm
+'
+
 test_done
-- 
1.6.6.184.ge163d
Previous: Junio C HamanoNext: Johannes Sixt
Message 15 of 21 in “Undoing conflict resolution”
  1. 0/9 Undoing conflict resolutionJunio C Hamano, Dec 29, 2009
  2. 1/9 builtin-merge.c: use standard active_cache macrosJunio C Hamano, Dec 29, 2009
  3. 2/9 resolve-undo: record resolved conflicts in a new index extension sectionJunio C Hamano, Dec 29, 2009
  4. 3/9 resolve-undo: basic testsJunio C Hamano, Dec 29, 2009
  5. 4/9 resolve-undo: allow plumbing to clear the informationJunio C Hamano, Dec 29, 2009
  6. 5/9 resolve-undo: "checkout -m path" uses resolve-undo informationJunio C Hamano, Dec 29, 2009
  7. 6/9 resolve-undo: teach "update-index --unresolve" to use resolve-undo infoJunio C Hamano, Dec 29, 2009
  8. 7/9 rerere: remove silly 1024-byte line limitJunio C Hamano, Dec 29, 2009
  9. 8/9 rerere: refactor rerere logic to make it independent from I/OJunio C Hamano, Dec 29, 2009
  10. 9/9 rerere forget path: forget recorded resolutionJunio C Hamano, Dec 29, 2009
  11. Johannes SixtJan 5, 2010
  12. Junio C HamanoJan 6, 2010
  13. Johannes SixtJan 6, 2010
  14. Junio C HamanoJan 6, 2010
  15. Junio C HamanoJan 6, 2010
  16. Johannes SixtJan 8, 2010
  17. Junio C HamanoJan 8, 2010
  18. Junio C HamanoJan 11, 2010
  19. Johannes SixtJan 11, 2010
  20. Junio C HamanoJan 11, 2010
  21. Johannes SixtJan 11, 2010

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.