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

Re: Octopus merge: unique (?) to git, but is it useful?

From
Junio C Hamano <gitster@pobox.com>
Date
Jun 3, 2008, 05:17 UTC
Message-ID
<7vskvv3xmx.fsf@gitster.siamese.dyndns.org>
In-Reply-To
<7v3anv5fy3.fsf@gitster.siamese.dyndns.org>
Junio C Hamano <gitster@pobox.com> writes:
Show 7 quoted lines
> Having said that, I think what is happening is that the final set of
> "other parents" is computed inside git-merge out of MERGE_HEAD and that is
> usually what is recorded in the resulting merge, but if the merge results
> in a conflict with manual resolution, that information is not given to the
> final "git commit".  The resulting commit records the parents out of HEAD
> and MERGE_HEAD.  I do not think this part has changed from scripted
> version of git-commit.
Sorry, my thinko.

The scripted version obviously used commit-tree to omit the duplicated parent. Perhaps we can do something like this.

-- >8 -- commit: drop duplicated parents

The scripted version of git-commit internally used git-commit-tree which omitted duplicated parents given from the command line. This prevented a nonsensical octopus merge from getting created even when you said "git merge A B" while you are already on branch A.

However, when git-commit was rewritten in C, this sanity check was lost. This resurrects it.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 builtin-commit.c |    9 +++++++++
 1 files changed, 9 insertions(+), 0 deletions(-)
diff --git a/builtin-commit.c b/builtin-commit.c
index b294c1f..1d8d208 100644
--- a/builtin-commit.c
+++ b/builtin-commit.c
@@ -883,10 +883,19 @@ static void add_parent(struct strbuf *sb, const unsigned char *sha1)
 {
 	struct object *obj = parse_object(sha1);
 	const char *parent = sha1_to_hex(sha1);
+	const char *cp;
+
 	if (!obj)
 		die("Unable to find commit parent %s", parent);
 	if (obj->type != OBJ_COMMIT)
 		die("Parent %s isn't a proper commit", parent);
+	cp = strstr(sb->buf, parent);
+	if (cp &&
+	    sb->buf + 8 <= cp && !memcmp(cp - 8, "\nparent ", 8) &&
+	    cp[40] == '\n') {
+		error("duplicate parent %s ignored", parent);
+		return;
+	}
 	strbuf_addf(sb, "parent %s\n", parent);
 }
 
Previous: Junio C HamanoNext: Johannes Schindelin
Message 4 of 30 in “Octopus merge: unique (?) to git, but is it useful?”
  1. Jakub NarebskiJun 3, 2008
  2. Linus TorvaldsJun 3, 2008
  3. Junio C HamanoJun 3, 2008
  4. Junio C HamanoJun 3, 2008
  5. Johannes SchindelinJun 3, 2008
  6. Junio C HamanoJun 3, 2008
  7. Johannes SchindelinJun 3, 2008
  8. SZEDER GáborJun 3, 2008
  9. Junio C HamanoJun 3, 2008
  10. SZEDER GáborJun 3, 2008
  11. Junio C HamanoJun 3, 2008
  12. SZEDER GáborJun 3, 2008
  13. Jeff KingJun 4, 2008
  14. Junio C HamanoJun 4, 2008
  15. Linus TorvaldsJun 3, 2008
  16. Miklos VajnaJun 3, 2008
  17. Junio C HamanoJun 4, 2008
  18. Junio C HamanoJun 3, 2008
  19. Jakub NarebskiJun 3, 2008
  20. Junio C HamanoJun 3, 2008
  21. Jakub NarebskiJun 3, 2008
  22. Junio C HamanoJun 3, 2008
  23. Linus TorvaldsJun 3, 2008
  24. Commit annotations (was:: Octopus merge: unique (?) to git, but is it useful?)Jakub Narebski, Jun 3, 2008
  25. Johannes SchindelinJun 3, 2008
  26. Johan HerlandJun 3, 2008
  27. Daniel VilleneuveJun 3, 2008
  28. Matthieu MoyJun 3, 2008
  29. Jakub NarebskiJun 3, 2008
  30. Matthieu MoyJun 3, 2008

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.