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

Re: [PATCH v4 2/2] revision: implement `git log --merge` also for rebase/cherry-pick/revert

From
Philippe Blain <levraiphilippeblain@gmail.com>
Date
Feb 13, 2024, 13:27 UTC
Message-ID
<790a3f11-5a8c-42f2-7a35-f2900c0299b4@gmail.com>
In-Reply-To
<c5d60b5b-3181-4bb7-a7f8-eb97474526d7@gmail.com>
Hi Phillip,
Le 2024-02-12 à 06:02, Phillip Wood a écrit :
Show 28 quoted lines
> Hi Philippe
> 
> On 10/02/2024 23:35, Philippe Blain wrote:
>> From: Michael Lohmann <mi.al.lohmann@gmail.com>
>>
>> 'git log' learned in ae3e5e1ef2 (git log -p --merge [[--] paths...],
>> 2006-07-03) to show commits touching conflicted files in the range
>> HEAD...MERGE_HEAD, an addition documented in d249b45547 (Document
>> rev-list's option --merge, 2006-08-04).
>>
>> It can be useful to look at the commit history to understand what lead
>> to merge conflicts also for other mergy operations besides merges, like
>> cherry-pick, revert and rebase.
>>
>> For rebases, an interesting range to look at is HEAD...REBASE_HEAD,
>> since the conflicts are usually caused by how the code changed
>> differently on HEAD since REBASE_HEAD forked from it.
>>
>> For cherry-picks and revert, it is less clear that
>> HEAD...CHERRY_PICK_HEAD and HEAD...REVERT_HEAD are indeed interesting
>> ranges, since these commands are about applying or unapplying a single
>> (or a few, for cherry-pick) commit(s) on top of HEAD. However, conflicts
>> encountered during these operations can indeed be caused by changes
>> introduced in preceding commits on both sides of the history.
> 
> I tend to think that there isn't much difference between rebase and cherry-pick here - they are both cherry-picking commits and it is perfectly possible to rebase a branch onto an unrelated upstream. The important part for me is that we're showing these commits because even though they aren't part of the 3-way merge they are relevant for investigating where any merge conflicts come from.
> 
> For revert I'd argue that the only sane use is reverting an ancestor of HEAD but maybe I'm missing something. In that case REVERT_HEAD...HEAD is the same as REVERT_HEAD..HEAD so it shows the changes since the commit that is being reverted which will be the ones causing the conflict.
Thanks, I can rework the wording from that angle.
Show 29 quoted lines
>> Adjust the code in prepare_show_merge so it constructs the range
>> HEAD...$OTHER for each of OTHER={MERGE_HEAD, CHERRY_PICK_HEAD,
>> REVERT_HEAD or REBASE_HEAD}. Note that we try these pseudorefs in order,
>> so keep REBASE_HEAD last since the three other operations can be
>> performed during a rebase. Note also that in the uncommon case where
>> $OTHER and HEAD do not share a common ancestor, this will show the
>> complete histories of both sides since their root commits, which is the
>> same behaviour as currently happens in that case for HEAD and
>> MERGE_HEAD.
>>
>> Adjust the documentation of this option accordingly.
> 
> Thanks for the comprehensive commit message.
> 
>> diff --git a/Documentation/rev-list-options.txt b/Documentation/rev-list-options.txt
>> index 2bf239ff03..5b4672c346 100644
>> --- a/Documentation/rev-list-options.txt
>> +++ b/Documentation/rev-list-options.txt
>> @@ -341,8 +341,10 @@ See also linkgit:git-reflog[1].
>>   Under `--pretty=reference`, this information will not be shown at all.
>>     --merge::
>> -    After a failed merge, show refs that touch files having a
>> -    conflict and don't exist on all heads to merge.
>> +    Show commits touching conflicted paths in the range `HEAD...$OTHER`,
>> +    where `$OTHER` is the first existing pseudoref in `MERGE_HEAD`,
>> +    `CHERRY_PICK_HEAD`, `REVERT_HEAD` or `REBASE_HEAD`. Only works
>> +    when the index has unmerged entries.
> 
> Do you know what "and don't exist on all heads to merge" in the original is referring to? The new text doesn't mention anything that sounds like that but I don't understand what the original was trying to say.

Yes, it took me a while to understand what that meant. I think it is simply describing the range of commits shown. If we substitute "refs" for "commits" and switch the order of the sentence, it reads:

    After a failed merge, show commits that don't exist on all heads to merge
    and that touch files having a conflict.
So it's just describing (a bit awkwardly) the HEAD...MERGE_HEAD range.
Show 6 quoted lines
> It might be worth adding a sentence explaining when this option is useful.
> 
>     This option can be used to show the commits that are relevant
>     when resolving conflicts from a 3-way merge
> 
> or something like that.
Nice idea, I'll add that.
Show 25 quoted lines
> 
>>   --boundary::
>>       Output excluded boundary commits. Boundary commits are
>> diff --git a/revision.c b/revision.c
>> index aa4c4dc778..36dc2f94f7 100644
>> --- a/revision.c
>> +++ b/revision.c
>> @@ -1961,11 +1961,31 @@ static void add_pending_commit_list(struct rev_info *revs,
>>       }
>>   }
>>   +static const char *lookup_other_head(struct object_id *oid)
>> +{
>> +    int i;
>> +    static const char *const other_head[] = {
>> +        "MERGE_HEAD", "CHERRY_PICK_HEAD", "REVERT_HEAD", "REBASE_HEAD"
>> +    };
>> +
>> +    for (i = 0; i < ARRAY_SIZE(other_head); i++)
>> +        if (!read_ref_full(other_head[i],
>> +                RESOLVE_REF_READING | RESOLVE_REF_NO_RECURSE,
>> +                oid, NULL)) {
>> +            if (is_null_oid(oid))
>> +                die("%s is a symbolic ref???", other_head[i]);
> 
> This would benefit from being translated and I think one '?' would suffice (I'm not sure we even need that - are there other possible causes of a null oid here?)

This bit was suggested by Junio upthread in <xmqqzfxa9usx.fsf@gitster.g>. I'm not sure if the are other causes of null oid, as I don't know well this part of the code. I agree that a single '?' would be enough, but I'm not sure about marking this for translation, I think maybe this situation would be best handled with BUG() ?

Show 6 quoted lines
>> +            return other_head[i];
>> +        }
>> +
>> +    die("--merge without MERGE_HEAD, CHERRY_PICK_HEAD, REVERT_HEAD or REBASE_HEAD?");
> 
> This is not a question and would also benefit from translation. It might be more helpful to say that "--merge" requires one of those pseudorefs.
Yes, I agree. I'll tweak that.
> Thanks for pick this series up and polishing it
> 
> Phillip
> 
Thanks,
Philippe.
Previous: Phillip WoodNext: Phillip Wood
Message 9 of 26 in “Implement `git log --merge` also for rebase/cherry-pick/revert”
  1. 0/2 Implement `git log --merge` also for rebase/cherry-pick/revertPhilippe Blain, Feb 10, 2024
  2. 1/2 revision: ensure MERGE_HEAD is a ref in prepare_show_mergePhilippe Blain, Feb 10, 2024
  3. 2/2 revision: implement `git log --merge` also for rebase/cherry-pick/revertPhilippe Blain, Feb 10, 2024
  4. Johannes SixtFeb 11, 2024
  5. Philippe BlainFeb 11, 2024
  6. Johannes SixtFeb 11, 2024
  7. Junio C HamanoFeb 12, 2024
  8. Phillip WoodFeb 12, 2024
  9. Philippe BlainFeb 13, 2024
  10. Phillip WoodFeb 14, 2024
  11. Jean-Noël AvilaFeb 13, 2024
  12. Philippe BlainFeb 13, 2024
  13. 0/2 Implement `git log --merge` also for rebase/cherry-pick/revertPhilippe Blain, Feb 25, 2024
  14. 1/2 revision: ensure MERGE_HEAD is a ref in prepare_show_mergePhilippe Blain, Feb 25, 2024
  15. Jean-Noël AvilaFeb 26, 2024
  16. Philippe BlainFeb 26, 2024
  17. 2/2 revision: implement `git log --merge` also for rebase/cherry-pick/revertPhilippe Blain, Feb 25, 2024
  18. Junio C HamanoFeb 26, 2024
  19. Philippe BlainFeb 26, 2024
  20. Phillip WoodFeb 27, 2024
  21. Junio C HamanoFeb 27, 2024
  22. 0/2 Implement `git log --merge` also for rebase/cherry-pick/revertPhilippe Blain, Feb 28, 2024
  23. 1/2 revision: ensure MERGE_HEAD is a ref in prepare_show_mergePhilippe Blain, Feb 28, 2024
  24. 2/2 revision: implement `git log --merge` also for rebase/cherry-pick/revertPhilippe Blain, Feb 28, 2024
  25. phillip.wood123@gmail.comFeb 28, 2024
  26. Philippe BlainMar 2, 2024

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.