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

Re: [PATCH] merge-tree.c: add --merge-base=<commit> option

From
Junio C Hamano <gitster@pobox.com>
Date
Oct 27, 2022, 18:09 UTC
Message-ID
<xmqqczadm93w.fsf@gitster.g>
In-Reply-To
<pull.1397.git.1666872761355.gitgitgadget@gmail.com>
"Kyle Zhao via GitGitGadget" <gitgitgadget@gmail.com> writes:
Show 11 quoted lines
> diff --git a/Documentation/git-merge-tree.txt b/Documentation/git-merge-tree.txt
> index d6c356740ef..e762209b76d 100644
> --- a/Documentation/git-merge-tree.txt
> +++ b/Documentation/git-merge-tree.txt
> @@ -64,6 +64,10 @@ OPTIONS
>  	share no common history.  This flag can be given to override that
>  	check and make the merge proceed anyway.
>  
> +--merge-base=<commit>::
> +	Instead of finding the merge-bases for <branch1> and <branch2>,
> +	specify a merge-base for the merge.

I like adding and exposing this feature to allow the end-user specify which commit to use as the base (instead of allowing the tool compute it from the two branches), but I wonder if a new option is even needed.

In the original "trivial merge" mode, the command takes three trees without having to have this new option. In the new "write-tree" mode, currently it is incapable of taking the base, but it does not have to stay that way. Wouldn't it be sufficient to update the UI to

    git merge-tree [--write-tree] [<options>] [<base-commit>] <branch1> <branch2>
    git merge-tree [--trivial-merge] <base-commit> <branch1> <branch2>

IOW, when you want to supply the base, you'd be explicit and ask for the new "write-tree" mode, i.e.

    $ git merge-tree --write-tree $(git merge-base branch^ branch) HEAD branch 

would be how you would use merge-tree to cherry-pick the commit at the tip of the branch on top of the current commit.

Show 5 quoted lines
> @@ -402,6 +403,7 @@ struct merge_tree_options {
>  	int allow_unrelated_histories;
>  	int show_messages;
>  	int name_only;
> +	char* merge_base;

Style. We write in C, not in C++, and our asterisks stick to variables and members of structs, not types.

Show 10 quoted lines
> -	/*
> -	 * Get the merge bases, in reverse order; see comment above
> -	 * merge_incore_recursive in merge-ort.h
> -	 */
> -	merge_bases = get_merge_bases(parent1, parent2);
> +	if (o->merge_base) {
> +		struct commit *c = lookup_commit_reference_by_name(o->merge_base);
> +		if (!c)
> +			die(_("could not lookup commit %s"), o->merge_base);
> +		commit_list_insert(c, &merge_bases);

Curious. The original code unconditionally assigned merge_bases, so there wasn't a good reason to initialize the variable before this point, but this new code assumes that merge_bases to be initialized to NULL.

Luckily, it is initialized in the original code, even though it wasn't necessary at all. So this new code can work correctly. Good.

Show 7 quoted lines
> +	} else {
> +		/*
> +		 * Get the merge bases, in reverse order; see comment above
> +		 * merge_incore_recursive in merge-ort.h
> +		 */
> +		merge_bases = get_merge_bases(parent1, parent2);
> +	}
Yes, this feature was very much lacking and is a welcome addition.

I also have to wonder how this should interact with a topic that is in-flight to feed multiple merge-tree requests from the standard input to have a single process perform multiple (not necessarily related) merges. Elijah knows much better, but my gut feeling is that it shouldn't be hard to allow feeding an extra commit on the same line to be used as the base.

Thanks.
Previous: Kyle Zhao via GitGitGadgetNext: Elijah Newren
Message 2 of 43 in “merge-tree.c: add --merge-base=<commit> option”
  1. merge-tree.c: add --merge-base=<commit> optionKyle Zhao via GitGitGadget, Oct 27, 2022
  2. Junio C HamanoOct 27, 2022
  3. Elijah NewrenOct 28, 2022
  4. Junio C HamanoOct 28, 2022
  5. Elijah NewrenOct 29, 2022
  6. kylezhao (赵柯宇)Oct 28, 2022
  7. Elijah NewrenOct 28, 2022
  8. kylezhao (赵柯宇)Oct 28, 2022
  9. merge-tree.c: add --merge-base=<commit> optionKyle Zhao via GitGitGadget, Oct 28, 2022
  10. Elijah NewrenOct 29, 2022
  11. merge-tree.c: add --merge-base=<commit> optionKyle Zhao via GitGitGadget, Oct 29, 2022
  12. Elijah NewrenNov 1, 2022
  13. 0/2 merge-tree: allow specifying a base commit when --write-tree is passedKyle Zhao via GitGitGadget, Nov 1, 2022
  14. 2/2 merge-tree.c: support --merge-base in conjunction with --stdinKyle Zhao via GitGitGadget, Nov 1, 2022
  15. Elijah NewrenNov 3, 2022
  16. kylezhao (赵柯宇)Nov 3, 2022
  17. 1/2 merge-tree.c: add --merge-base=<commit> optionKyle Zhao via GitGitGadget, Nov 1, 2022
  18. Taylor BlauNov 1, 2022
  19. 0/2 merge-tree: allow specifying a base commit when --write-tree is passedKyle Zhao via GitGitGadget, Nov 3, 2022
  20. 1/2 merge-tree.c: add --merge-base=<commit> optionKyle Zhao via GitGitGadget, Nov 3, 2022
  21. Ævar Arnfjörð BjarmasonNov 3, 2022
  22. kylezhao (赵柯宇)Nov 3, 2022
  23. 2/2 merge-tree.c: allow specifying the merge-base when --stdin is passedKyle Zhao via GitGitGadget, Nov 3, 2022
  24. 0/2 merge-tree: allow specifying a base commit when --write-tree is passedKyle Zhao via GitGitGadget, Nov 3, 2022
  25. 1/2 merge-tree.c: add --merge-base=<commit> optionKyle Zhao via GitGitGadget, Nov 3, 2022
  26. 2/2 merge-tree.c: allow specifying the merge-base when --stdin is passedKyle Zhao via GitGitGadget, Nov 3, 2022
  27. Elijah NewrenNov 11, 2022
  28. 0/2 merge-tree: allow specifying a base commit when --write-tree is passedKyle Zhao via GitGitGadget, Nov 11, 2022
  29. 1/2 merge-tree.c: add --merge-base=<commit> optionKyle Zhao via GitGitGadget, Nov 11, 2022
  30. Junio C HamanoNov 22, 2022
  31. kylezhao (赵柯宇)Nov 22, 2022
  32. Junio C HamanoNov 22, 2022
  33. Junio C HamanoNov 22, 2022
  34. kylezhao (赵柯宇)Nov 22, 2022
  35. 2/2 merge-tree.c: allow specifying the merge-base when --stdin is passedKyle Zhao via GitGitGadget, Nov 11, 2022
  36. Elijah NewrenNov 12, 2022
  37. Taylor BlauNov 13, 2022
  38. Taylor BlauNov 13, 2022
  39. 0/3 merge-tree: allow specifying a base commit when --write-tree is passedKyle Zhao via GitGitGadget, Nov 24, 2022
  40. 1/3 merge-tree.c: add --merge-base=<commit> optionKyle Zhao via GitGitGadget, Nov 24, 2022
  41. 2/3 merge-tree.c: allow specifying the merge-base when --stdin is passedKyle Zhao via GitGitGadget, Nov 24, 2022
  42. 3/3 docs: fix description of the `--merge-base` optionKyle Zhao via GitGitGadget, Nov 24, 2022
  43. Junio C HamanoNov 25, 2022

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.