Le 11/02/2024 à 00:35, Philippe Blain a écrit :
From: Michael Lohmann <mi.al.lohmann@xxxxxxxxx>
'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.
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.
Co-authored-by: Philippe Blain <levraiphilippeblain@xxxxxxxxx>
Co-authored-by: Johannes Sixt <j6t@xxxxxxxx>
Signed-off-by: Philippe Blain <levraiphilippeblain@xxxxxxxxx>
Signed-off-by: Michael Lohmann <mi.al.lohmann@xxxxxxxxx>
[jc: tweaked in j6t's precedence fix that tries REBASE_HEAD last]
Signed-off-by: Junio C Hamano <gitster@xxxxxxxxx>
---
Documentation/gitk.txt | 8 ++++----
Documentation/rev-list-options.txt | 6 ++++--
revision.c | 31 +++++++++++++++++++++++--------
3 files changed, 31 insertions(+), 14 deletions(-)
diff --git a/Documentation/gitk.txt b/Documentation/gitk.txt
index c2213bb77b..80ff4e149a 100644
--- a/Documentation/gitk.txt
+++ b/Documentation/gitk.txt
@@ -63,10 +63,10 @@ linkgit:git-rev-list[1] for a complete list.
--merge::
- After an attempt to merge stops with conflicts, show the commits on
- the history between two branches (i.e. the HEAD and the MERGE_HEAD)
- that modify the conflicted files and do not exist on all the heads
- being merged.
+ Show commits touching conflicted paths in the range `HEAD...$OTHER`,
if $OTHER is a placeholder, why not use the placeholder notation <other>
instead of a notation that could deceive the reader into thinking that
this is an actual environment variable?
+ 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.
Thanks