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

[PATCH/RFC] Extended SHA1 -- "rev^#" syntax to mean "all parents"

From
Junio C Hamano <junkio@cox.net>
Date
Apr 29, 2006, 09:45 UTC
Message-ID
<7vaca490ln.fsf@assigned-by-dhcp.cox.net>
In-Reply-To
<7virosalxb.fsf@assigned-by-dhcp.cox.net>

A short-hand "rev^#" is understood to be "all parents of the named commit" with this patch. So you can do

	git show v1.0.0^#
to view the parents of a merge commit,
	gitk ^v1.0.0^# v1.0.4
to view the log between two revs (including the bottom one), and
	git diff --cc v1.1.0 v1.0.0^#
to inspect what got changed from the merge parents of v1.0.0 to v1.1.0.

This might be just my shiny new toy that is not very useful in practice. I needed it to do the multi-tree diff on Len's infamous 12-way Octopus; typing "diff --cc funmerge funmerge^1 funmerge^2 funmerge^3 ..." was too painful.

Signed-off-by: Junio C Hamano <junkio@cox.net>
---
 revision.c |   37 +++++++++++++++++++++++++++++++++++++
 1 files changed, 37 insertions(+), 0 deletions(-)
diff --git a/revision.c b/revision.c
index f2a9f25..194f35b 100644
--- a/revision.c
+++ b/revision.c
@@ -477,6 +477,36 @@ static void handle_all(struct rev_info *
 	for_each_ref(handle_one_ref);
 }
 
+static int add_parents_only(struct rev_info *revs, const char *arg, int flags)
+{
+	unsigned char sha1[20];
+	struct object *it;
+	struct commit *commit;
+	struct commit_list *parents;
+
+	if (*arg == '^') {
+		flags ^= UNINTERESTING;
+		arg++;
+	}
+	if (get_sha1(arg, sha1))
+		return 0;
+	while (1) {
+		it = get_reference(revs, arg, sha1, 0);
+		if (strcmp(it->type, tag_type))
+			break;
+		memcpy(sha1, ((struct tag*)it)->tagged->sha1, 20);
+	}
+	if (strcmp(it->type, commit_type))
+		return 0;
+	commit = (struct commit *)it;
+	for (parents = commit->parents; parents; parents = parents->next) {
+		it = &parents->item->object;
+		it->flags |= flags;
+		add_pending_object(revs, it, arg);
+	}
+	return 1;
+}
+
 void init_revisions(struct rev_info *revs)
 {
 	memset(revs, 0, sizeof(*revs));
@@ -746,6 +776,13 @@ int setup_revisions(int argc, const char
 			}
 			*dotdot = '.';
 		}
+		dotdot = strstr(arg, "^#");
+		if (dotdot && !dotdot[2]) {
+			*dotdot = 0;
+			if (add_parents_only(revs, arg, flags))
+				continue;
+			*dotdot = '^';
+		}
 		local_flags = 0;
 		if (*arg == '^') {
 			local_flags = UNINTERESTING;
-- 
1.3.1.ga0c5
Previous: Junio C HamanoNext: Johannes Schindelin
Message 3 of 5 in “built-in diff.”
  1. built-in diff.Junio C Hamano, Apr 29, 2006
  2. built-in diff: assorted updates.Junio C Hamano, Apr 29, 2006
  3. Extended SHA1 -- "rev^#" syntax to mean "all parents"Junio C Hamano, Apr 29, 2006
  4. Johannes SchindelinApr 29, 2006
  5. Linus TorvaldsApr 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.