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

[PATCH 3/11] Use branch names in 'git-rebase -m' conflict hunks.

From
Shawn O. Pearce <spearce@spearce.org>
Date
Dec 28, 2006, 07:34 UTC
Message-ID
<20061228073456.GC17867@spearce.org>
In-Reply-To
<9847899e4ba836980dbfed6d0ea1c82f31f21456.1167290864.git.spearce@spearce.org>

If a three-way merge in git-rebase generates a conflict then we should take advantage of git-merge-recursive's ability to include the branch name of each side of the conflict hunk by setting the GITHEAD_* environment variables.

In the case of rebase there aren't really two clear branches; we have the branch we are rebasing onto, and we have the branch we are currently rebasing. Since most conflicts will be arising between the user's current branch and the branch they are rebasing onto we assume the stuff that isn't in the current commit is the "onto" branch and the stuff in the current commit is the "current" branch.

This assumption may however come up wrong if the user resolves one conflict in such a way that it conflicts again on a future commit also being rebased. In this case the user's prior resolution will appear to be in the "onto" part of the hunk.

Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
---
 git-rebase.sh |   11 ++++++++++-
 1 files changed, 10 insertions(+), 1 deletions(-)
diff --git a/git-rebase.sh b/git-rebase.sh
index 5c7c4a6..828c59c 100755
--- a/git-rebase.sh
+++ b/git-rebase.sh
@@ -81,10 +81,18 @@ continue_merge () {
 call_merge () {
 	cmt="$(cat $dotest/cmt.$1)"
 	echo "$cmt" > "$dotest/current"
-	git-merge-$strategy "$cmt^" -- HEAD "$cmt"
+	hd=$(git-rev-parse --verify HEAD)
+	cmt_name=$(git-symbolic-ref HEAD)
+	msgnum=$(cat $dotest/msgnum)
+	end=$(cat $dotest/end)
+	eval GITHEAD_$cmt='"${cmt_name##refs/heads/}~$(($end - $msgnum))"'
+	eval GITHEAD_$hd='"$(cat $dotest/onto_name)"'
+	export GITHEAD_$cmt GITHEAD_$hd
+	git-merge-$strategy "$cmt^" -- "$hd" "$cmt"
 	rv=$?
 	case "$rv" in
 	0)
+		unset GITHEAD_$cmt GITHEAD_$hd
 		return
 		;;
 	1)
@@ -314,6 +322,7 @@ fi
 
 mkdir -p "$dotest"
 echo "$onto" > "$dotest/onto"
+echo "$onto_name" > "$dotest/onto_name"
 prev_head=`git-rev-parse HEAD^0`
 echo "$prev_head" > "$dotest/prev_head"
 
-- 
1.4.4.3.gd2e4
Previous: Shawn O. PearceNext: Shawn O. Pearce
Message 2 of 17 in “Honor GIT_REFLOG_ACTION in git-rebase.”
  1. 2/11 Honor GIT_REFLOG_ACTION in git-rebase.Shawn O. Pearce, Dec 28, 2006
  2. 3/11 Use branch names in 'git-rebase -m' conflict hunks.Shawn O. Pearce, Dec 28, 2006
  3. 4/11 Ensure `git-pull` fails if `git-merge` fails.Shawn O. Pearce, Dec 28, 2006
  4. 5/11 Honor pull.{twohead,octopus} in git-merge.Shawn O. Pearce, Dec 28, 2006
  5. 6/11 Allow git-merge to select the default strategy.Shawn O. Pearce, Dec 28, 2006
  6. 7/11 Avoid git-fetch in `git-pull .` when possible.Shawn O. Pearce, Dec 28, 2006
  7. Junio C HamanoDec 28, 2006
  8. Shawn PearceDec 28, 2006
  9. Junio C HamanoDec 28, 2006
  10. 8/11 Move better_branch_name above get_ref in merge-recursive.Shawn O. Pearce, Dec 28, 2006
  11. 9/11 Allow merging bare trees in merge-recursive.Shawn O. Pearce, Dec 28, 2006
  12. Junio C HamanoDec 28, 2006
  13. 10/11 Use merge-recursive in git-am -3.Shawn O. Pearce, Dec 28, 2006
  14. 11/11 Improve merge performance by avoiding in-index merges.Shawn O. Pearce, Dec 28, 2006
  15. Junio C HamanoDec 28, 2006
  16. Shawn PearceDec 28, 2006
  17. Johannes SchindelinDec 29, 2006

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.