[PATCH v4 0/2] Implement `git log --merge` also for rebase/cherry-pick/revert
Changes in v4: - Added a commit message for 2/2 detailing the use case and summarizing the discussion in the thread - Adjusted the documentation of the option
Link to v3: https://lore.kernel.org/r/20240117081405.14012-1-mi.al.lohmann@gmail.com
Range-diff vs v3:
1: 37405be1a3 = 1: 37405be1a3 revision: ensure MERGE_HEAD is a ref in prepare_show_merge
2: de080a628c ! 2: 6ac1608809 revision: implement `git log --merge` also for rebase/cherry_pick/revert
@@ Metadata
Author: Michael Lohmann <mi.al.lohmann@gmail.com> ## Commit message ##
- revision: implement `git log --merge` also for rebase/cherry_pick/revert
+ revision: implement `git log --merge` also for rebase/cherry-pick/revert + '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@gmail.com>
Co-authored-by: Johannes Sixt <j6t@kdbg.org>
+ Signed-off-by: Philippe Blain <levraiphilippeblain@gmail.com>
Signed-off-by: Michael Lohmann <mi.al.lohmann@gmail.com>
[jc: tweaked in j6t's precedence fix that tries REBASE_HEAD last]
Signed-off-by: Junio C Hamano <gitster@pobox.com> + ## Documentation/gitk.txt ##
+@@ Documentation/gitk.txt: 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`,
++ 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.
+
+ --left-right::
+
+
+ ## Documentation/rev-list-options.txt ##
+@@ Documentation/rev-list-options.txt: 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.
+
+ --boundary::
+ Output excluded boundary commits. Boundary commits are
+
## revision.c ##
@@ revision.c: static void add_pending_commit_list(struct rev_info *revs,
}---
Michael Lohmann (2):
revision: ensure MERGE_HEAD is a ref in prepare_show_merge
revision: implement `git log --merge` also for rebase/cherry-pick/revertDocumentation/gitk.txt | 8 ++++---- Documentation/rev-list-options.txt | 6 ++++-- revision.c | 27 +++++++++++++++++++++++---- 3 files changed, 31 insertions(+), 10 deletions(-) --- base-commit: 186b115d3062e6230ee296d1ddaa0c4b72a464b5 change-id: 20240210-ml-log-merge-with-cherry-pick-and-other-pseudo-heads-05bd8e8797db