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

[PATCH 2/2] Display 'theirs' branch name when possible in merge.

From
Shawn O. Pearce <spearce@spearce.org>
Date
Dec 23, 2006, 08:44 UTC
Message-ID
<20061223084447.GB10203@spearce.org>
In-Reply-To
<6115ec06459724c7c37c355805462cb61715e9c5.1166863413.git.spearce@spearce.org>

Displaying the SHA1 of 'their' branch (the branch being merged into the current branch) is not nearly as friendly as just displaying the name of that branch, especially if that branch is already local to this repository.

git-merge now sets the environment variable 'GITHEAD_%(sha1)=%(name)' for each argument it gets passed, making the actual input name that resolved to the commit '%(sha1)' easily available to the invoked merge strategy.

git-merge-recursive makes use of these environment variables when they are available by using '%(name)' whenever it outputs the commit identification rather than '%(sha1)'. This is most obvious in the conflict hunks created by xdl_merge:

  $ git mege sideb~1
  <<<<<<< HEAD:INSTALL
     Good!
  =======
     Oops.
  >>>>>>> sideb~1:INSTALL
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
---
 git-merge.sh      |    2 ++
 merge-recursive.c |   17 ++++++++++++++++-
 2 files changed, 18 insertions(+), 1 deletions(-)
diff --git a/git-merge.sh b/git-merge.sh
index a17aa2c..5c2d03b 100755
--- a/git-merge.sh
+++ b/git-merge.sh
@@ -266,6 +266,8 @@ do
 	remotehead=$(git-rev-parse --verify "$remote"^0 2>/dev/null) ||
 	    die "$remote - not something we can merge"
 	remoteheads="${remoteheads}$remotehead "
+	eval GITHEAD_$remotehead='"$remote"'
+	export GITHEAD_$remotehead
 done
 set x $remoteheads ; shift
 
diff --git a/merge-recursive.c b/merge-recursive.c
index abebb95..a96821c 100644
--- a/merge-recursive.c
+++ b/merge-recursive.c
@@ -1263,6 +1263,18 @@ static struct commit *get_ref(const char *ref)
 	return (struct commit *)object;
 }
 
+static char* better_branch_name(const char *branch)
+{
+	static char githead_env[8 + 40 + 1];
+	char* name;
+
+	if (strlen(branch) != 40)
+		return branch;
+	sprintf(githead_env, "GITHEAD_%s", branch);
+	name = getenv(githead_env);
+	return name ? name : branch;
+}
+
 int main(int argc, char *argv[])
 {
 	static const char *bases[2];
@@ -1293,11 +1305,14 @@ int main(int argc, char *argv[])
 
 	branch1 = argv[++i];
 	branch2 = argv[++i];
-	printf("Merging %s with %s\n", branch1, branch2);
 
 	h1 = get_ref(branch1);
 	h2 = get_ref(branch2);
 
+	branch1 = better_branch_name(branch1);
+	branch2 = better_branch_name(branch2);
+	printf("Merging %s with %s\n", branch1, branch2);
+
 	if (bases_count == 1) {
 		struct commit *ancestor = get_ref(bases[0]);
 		clean = merge(h1, h2, branch1, branch2, 0, ancestor, &result);
-- 
1.4.4.3.g87d8
Next: Jakub Narebski
Message 1 of 2 in “Display 'theirs' branch name when possible in merge.”
  1. 2/2 Display 'theirs' branch name when possible in merge.Shawn O. Pearce, Dec 23, 2006
  2. Jakub NarebskiDec 23, 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.