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@xxxxxxxxx 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@xxxxxxxxx> ## 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@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 ## +@@ 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/revert Documentation/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