From: Phillip Wood <phillip.wood123@gmail.com>
To: Philippe Blain <levraiphilippeblain@gmail.com>, git@vger.kernel.org
Cc: Johannes Sixt <j6t@kdbg.org>, Elijah Newren <newren@gmail.com>,
Michael Lohmann <mial.lohmann@gmail.com>,
Phillip Wood <phillip.wood@dunelm.org.uk>,
Patrick Steinhardt <ps@pks.im>,
Michael Lohmann <mi.al.lohmann@gmail.com>,
Junio C Hamano <gitster@pobox.com>
Subject: Re: [PATCH v4 2/2] revision: implement `git log --merge` also for rebase/cherry-pick/revert
Date: Mon, 12 Feb 2024 11:02:56 +0000 [thread overview]
Message-ID: <c5d60b5b-3181-4bb7-a7f8-eb97474526d7@gmail.com> (raw)
In-Reply-To: <20240210-ml-log-merge-with-cherry-pick-and-other-pseudo-heads-v4-2-3bc9e62808f4@gmail.com>
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.
> 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.
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.
> --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?)
> + 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.
Thanks for pick this series up and polishing it
Phillip
next prev parent reply other threads:[~2024-02-12 11:02 UTC|newest]
Thread overview: 56+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-01-11 23:33 [RFC PATCH] `log --merge` also for rebase/cherry pick/revert Michael Lohmann
2024-01-12 0:15 ` Junio C Hamano
2024-01-12 15:50 ` [PATCH v2 1/2] revision: ensure MERGE_HEAD is a ref in prepare_show_merge Michael Lohmann
2024-01-12 15:50 ` [PATCH v2 2/2] revision: Implement `git log --merge` also for rebase/cherry_pick/revert Michael Lohmann
2024-01-12 20:10 ` [PATCH v2 1/2] revision: ensure MERGE_HEAD is a ref in prepare_show_merge Junio C Hamano
2024-01-15 11:36 ` Patrick Steinhardt
2024-01-15 17:19 ` Junio C Hamano
2024-01-17 8:14 ` [PATCH v3 " Michael Lohmann
2024-01-17 8:14 ` [PATCH v3 2/2] revision: Implement `git log --merge` also for rebase/cherry_pick/revert Michael Lohmann
2024-01-17 9:19 ` Full disclosure Michael Lohmann
2024-01-17 9:58 ` Christian Couder
2024-01-17 17:41 ` Michael Lohmann
2024-01-21 0:41 ` Ruben Safir
2024-01-17 18:33 ` Junio C Hamano
2024-01-24 7:06 ` [PATCH v3 2/2] revision: Implement `git log --merge` also for rebase/cherry_pick/revert Elijah Newren
2024-01-24 17:19 ` Johannes Sixt
2024-01-24 19:46 ` Junio C Hamano
2024-01-24 22:06 ` Johannes Sixt
2024-01-24 22:13 ` Junio C Hamano
2024-02-09 23:54 ` Junio C Hamano
2024-01-24 17:34 ` Junio C Hamano
2024-02-10 23:35 ` [PATCH v4 0/2] Implement `git log --merge` also for rebase/cherry-pick/revert Philippe Blain
2024-02-10 23:35 ` [PATCH v4 1/2] revision: ensure MERGE_HEAD is a ref in prepare_show_merge Philippe Blain
2024-02-10 23:35 ` [PATCH v4 2/2] revision: implement `git log --merge` also for rebase/cherry-pick/revert Philippe Blain
2024-02-11 8:34 ` Johannes Sixt
2024-02-11 16:43 ` Philippe Blain
2024-02-11 17:59 ` Johannes Sixt
2024-02-12 18:27 ` Junio C Hamano
2024-02-12 11:02 ` Phillip Wood [this message]
2024-02-13 13:27 ` Philippe Blain
2024-02-14 11:02 ` Phillip Wood
2024-02-13 8:33 ` Jean-Noël Avila
2024-02-13 13:14 ` Philippe Blain
2024-02-25 21:56 ` [PATCH v5 0/2] Implement " Philippe Blain
2024-02-25 21:56 ` [PATCH v5 1/2] revision: ensure MERGE_HEAD is a ref in prepare_show_merge Philippe Blain
2024-02-26 17:22 ` Jean-Noël Avila
2024-02-26 17:54 ` Philippe Blain
2024-02-25 21:56 ` [PATCH v5 2/2] revision: implement `git log --merge` also for rebase/cherry-pick/revert Philippe Blain
2024-02-26 4:35 ` Junio C Hamano
2024-02-26 17:43 ` Philippe Blain
2024-02-27 14:00 ` [PATCH v5 0/2] Implement " Phillip Wood
2024-02-27 18:30 ` Junio C Hamano
2024-02-28 13:54 ` [PATCH v6 " Philippe Blain
2024-02-28 13:54 ` [PATCH v6 1/2] revision: ensure MERGE_HEAD is a ref in prepare_show_merge Philippe Blain
2024-02-28 13:54 ` [PATCH v6 2/2] revision: implement `git log --merge` also for rebase/cherry-pick/revert Philippe Blain
2024-02-28 14:40 ` [PATCH v6 0/2] Implement " phillip.wood123
2024-03-02 15:35 ` Philippe Blain
2024-01-12 7:35 ` [RFC PATCH] `log --merge` also for rebase/cherry pick/revert Johannes Sixt
2024-01-12 7:59 ` Johannes Sixt
2024-01-12 20:18 ` Junio C Hamano
2024-01-12 11:01 ` phillip.wood123
2024-01-12 15:03 ` Michael Lohmann
2024-01-12 21:14 ` Junio C Hamano
2024-01-15 10:48 ` Phillip Wood
2024-01-12 20:21 ` Junio C Hamano
2024-01-12 21:06 ` Michael Lohmann
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=c5d60b5b-3181-4bb7-a7f8-eb97474526d7@gmail.com \
--to=phillip.wood123@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=j6t@kdbg.org \
--cc=levraiphilippeblain@gmail.com \
--cc=mi.al.lohmann@gmail.com \
--cc=mial.lohmann@gmail.com \
--cc=newren@gmail.com \
--cc=phillip.wood@dunelm.org.uk \
--cc=ps@pks.im \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).