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

Re: [Internet]Re: [PATCH v7 1/2] merge-tree.c: add --merge-base=<commit> option

From
Junio C Hamano <gitster@pobox.com>
Date
Nov 22, 2022, 05:42 UTC
Message-ID
<xmqqr0xvr1e5.fsf@gitster.g>
In-Reply-To
<xmqqcz9fsjdr.fsf@gitster.g>
Junio C Hamano <gitster@pobox.com> writes:
Show 14 quoted lines
> "kylezhao(赵柯宇)" <kylezhao@tencent.com> writes:
>
>> I went to check the api-parse-option.txt, but I didn't found an
>> elegant solution to stop when the users uses the second
>> "--merge-base".
>
> That's not even a fix, as it does not allow specifying more than one
> merge bases, is it?
>
> Just like how builtin/merge-tree.c::real_merge() is prepared to
> handle parent1 and parent2 that have multiple merge bases and pass
> all of them to the underlying merge machinery, you can accumulate
> multiple strings using OPT_STRING_LIST() and use all of them as
> merge_bases, no?
I am a bit torn on this, though.  

Because it uses lookup_commit_reference_by_name() to obtain base_commit in addition to parent1 and parent2, and then get_commit_tree() on them to get their trees, the real_merge() function in the posted patch is incapable of accepting a single "pretend as if this tree object is the common ancestor tree" and merging the two tree objects. But once that flaw is fixed, using merge_incore_nonrecursive() with an explicitly given "base", we can merge totally trees regardless of how the commits they are found in are related in the history, which is a very logical thing to do. And while operating in that mode, there is no way to accept more than one "base".

So, I would be PERFECTLY HAPPY if this new mode of operation can take only one "base" tree object, if it allows BASE, PARENT1, and PARENT2 to be all tree objects, not necessarily commit objects.

But if we insist that PARENT1 and PARENT2 must be commits, then I would find it very unsatisfying if we only took a single BASE that also must be a commit. If the merge-base has to be a tree or trees, then there is no way to perform recursive merge (because you cannot compute common ancestors across tree objects) , so it is perfectly justifiable to take only a single base (and error out upon seeing a second --merge-base=X option).

But it has to be a commit, then there is no justification to forbid recursive operation, and I do not see a good reason to take only one COMMON thing.

So, it is easy to say "let's take the current patch as a good first step", but it is unclear what the good second step would be.

We could correct the code to allow PARENT1, PARENT2 and BASE to be tree objects, not necessarily commits, when only a single merge-base is specified. That corrects the current flaw that tree objects cannot be used. And then when more than one BASE is given (or no BASE is given---which is the original code), we could correct the code to call merge_incore_recursive() instead.

But the amount of the effort to get there from the current codebase (without your patch) feels more or less the same ballpark as the patch in question, so...

Previous: Junio C HamanoNext: kylezhao (赵柯宇)
Message 33 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.