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

[PATCH v3 0/3] diff-merges: introduce '--dd' option

From
Sergey Organov <sorganov@gmail.com>
Date
Oct 4, 2023, 21:45 UTC
Message-ID
<20231004214558.210339-1-sorganov@gmail.com>
In-Reply-To
<20230909125446.142715-1-sorganov@gmail.com>

This new convenience option requests full diff with respect to first parent, so that

  git log --dd

will output diff with respect to first parent for every commit, universally, no matter how many parents the commit turns out to have.

'--dd' is implemented as pure synonym for "--diff-merges=first-parent --patch".

The first commit in the series tweaks diff-merges documentation a bit, and is valuable by itself. It's put here as '--dd' implementation commit depends on it in its documentation part.

Note: the need for this new convenience option mostly emerged from
denial by the community of patches that modify '-m' behavior to imply
'-p' as the rest of similar options (such as --cc) do. So, basically,
'--dd' is what '-m' should have been to be more useful.
Updates in v3:
  * Option renamed from '-d' to '--dd' due to Junio overpowering
    request to keep short-and-sweet '-d' reserved for another (yet
    unspecified) use.
  * Added completion of '--dd' to git-completion.bash.
Updates in v2:
  * Reordered documentation for diff-merges formats in accordance with
    Junio recommendation.
  * Removed clarification of surprising -m behavior due to controversy
    with Junio on how exactly it should look like.
Sergey Organov (3):
  diff-merges: improve --diff-merges documentation
  diff-merges: introduce '--dd' option
  completion: complete '--dd'
 Documentation/diff-options.txt         | 103 ++++++++++++++-----------
 Documentation/git-log.txt              |   4 +-
 contrib/completion/git-completion.bash |   2 +-
 diff-merges.c                          |   3 +
 t/t4013-diff-various.sh                |   8 ++
 5 files changed, 72 insertions(+), 48 deletions(-)
Interdiff against v2:
diff --git a/Documentation/diff-options.txt b/Documentation/diff-options.txt
index 19bb78ff6652..f80d493dd4c8 100644
--- a/Documentation/diff-options.txt
+++ b/Documentation/diff-options.txt
@@ -48,10 +48,6 @@ ifdef::git-log[]
 	similar to '--diff-merges=on' (which see) except `-m` will
 	produce no output unless `-p` is given as well.
 
--d::
-	Produce diff with respect to first parent.
-	Shortcut for '--diff-merges=first-parent -p'.
-
 -c::
 	Produce combined diff output for merge commits.
 	Shortcut for '--diff-merges=combined -p'.
@@ -60,6 +56,11 @@ ifdef::git-log[]
 	Produce dense combined diff output for merge commits.
 	Shortcut for '--diff-merges=dense-combined -p'.
 
+--dd::
+	Produce diff with respect to first parent for both merge and
+	regular commits.
+	Shortcut for '--diff-merges=first-parent -p'.
+
 --remerge-diff::
 	Produce diff against re-merge.
 	Shortcut for '--diff-merges=remerge -p'.
diff --git a/Documentation/git-log.txt b/Documentation/git-log.txt
index 59bd74a1a596..579682172fe4 100644
--- a/Documentation/git-log.txt
+++ b/Documentation/git-log.txt
@@ -120,7 +120,7 @@ By default, `git log` does not generate any diff output. The options
 below can be used to show the changes made by each commit.
 
 Note that unless one of `--diff-merges` variants (including short
-`-d`, `-m`, `-c`, and `--cc` options) is explicitly given, merge commits
+`-m`, `-c`, `--cc`, and `--dd` options) is explicitly given, merge commits
 will not show a diff, even if a diff format like `--patch` is
 selected, nor will they match search options like `-S`. The exception
 is when `--first-parent` is in use, in which case `first-parent` is
diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index 133ec92bfae7..ca4fa39f3ff8 100644
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -2042,7 +2042,7 @@ __git_log_shortlog_options="
 "
 # Options accepted by log and show
 __git_log_show_options="
-	--diff-merges --diff-merges= --no-diff-merges --remerge-diff
+	--diff-merges --diff-merges= --no-diff-merges --dd --remerge-diff
 "
 
 __git_diff_merges_opts="off none on first-parent 1 separate m combined c dense-combined cc remerge r"
diff --git a/diff-merges.c b/diff-merges.c
index 6eb72e6fc28a..45507588a279 100644
--- a/diff-merges.c
+++ b/diff-merges.c
@@ -125,15 +125,15 @@ int diff_merges_parse_opts(struct rev_info *revs, const char **argv)
 	if (!suppress_m_parsing && !strcmp(arg, "-m")) {
 		set_to_default(revs);
 		revs->merges_need_diff = 0;
-	} else if (!strcmp(arg, "-d")) {
-		set_first_parent(revs);
-		revs->merges_imply_patch = 1;
 	} else if (!strcmp(arg, "-c")) {
 		set_combined(revs);
 		revs->merges_imply_patch = 1;
 	} else if (!strcmp(arg, "--cc")) {
 		set_dense_combined(revs);
 		revs->merges_imply_patch = 1;
+	} else if (!strcmp(arg, "--dd")) {
+		set_first_parent(revs);
+		revs->merges_imply_patch = 1;
 	} else if (!strcmp(arg, "--remerge-diff")) {
 		set_remerge_diff(revs);
 		revs->merges_imply_patch = 1;
diff --git a/t/t4013-diff-various.sh b/t/t4013-diff-various.sh
index a07d6eb6dd97..4b474808311e 100755
--- a/t/t4013-diff-various.sh
+++ b/t/t4013-diff-various.sh
@@ -473,10 +473,10 @@ test_expect_success 'log --diff-merges=on matches --diff-merges=separate' '
 	test_cmp expected actual
 '
 
-test_expect_success 'log -d matches --diff-merges=1 -p' '
+test_expect_success 'log --dd matches --diff-merges=1 -p' '
 	git log --diff-merges=1 -p master >result &&
 	process_diffs result >expected &&
-	git log -d master >result &&
+	git log --dd master >result &&
 	process_diffs result >actual &&
 	test_cmp expected actual
 '
-- 
2.25.1
Previous: Sergey OrganovNext: Sergey Organov
Message 23 of 55 in “diff-merges: introduce '-d' option”
  1. 0/2 diff-merges: introduce '-d' optionSergey Organov, Sep 9, 2023
  2. 2/2 diff-merges: introduce '-d' optionSergey Organov, Sep 9, 2023
  3. Junio C HamanoSep 11, 2023
  4. Sergey OrganovSep 12, 2023
  5. Junio C HamanoSep 14, 2023
  6. Sergey OrganovSep 14, 2023
  7. Junio C HamanoSep 15, 2023
  8. Sergey OrganovSep 16, 2023
  9. Junio C HamanoSep 26, 2023
  10. Sergey OrganovSep 26, 2023
  11. Junio C HamanoSep 26, 2023
  12. Sergey OrganovSep 26, 2023
  13. 1/2 diff-merges: improve --diff-merges documentationSergey Organov, Sep 9, 2023
  14. Junio C HamanoSep 11, 2023
  15. Sergey OrganovSep 12, 2023
  16. Junio C HamanoSep 13, 2023
  17. Sergey OrganovSep 18, 2023
  18. Junio C HamanoSep 19, 2023
  19. Sergey OrganovSep 19, 2023
  20. 0/2 diff-merges: introduce '-d' optionSergey Organov, Sep 20, 2023
  21. 2/2 diff-merges: introduce '-d' optionSergey Organov, Sep 20, 2023
  22. 1/2 diff-merges: improve --diff-merges documentationSergey Organov, Sep 20, 2023
  23. 0/3 diff-merges: introduce '--dd' optionSergey Organov, Oct 4, 2023
  24. 2/3 diff-merges: introduce '--dd' optionSergey Organov, Oct 4, 2023
  25. Junio C HamanoOct 5, 2023
  26. Sergey OrganovOct 6, 2023
  27. 1/3 diff-merges: improve --diff-merges documentationSergey Organov, Oct 4, 2023
  28. Eric SunshineOct 4, 2023
  29. Sergey OrganovOct 4, 2023
  30. Junio C HamanoOct 5, 2023
  31. Sergey OrganovOct 6, 2023
  32. Junio C HamanoOct 5, 2023
  33. Elijah NewrenOct 6, 2023
  34. Sergey OrganovOct 6, 2023
  35. Sergey OrganovOct 6, 2023
  36. Junio C HamanoOct 6, 2023
  37. Sergey OrganovOct 6, 2023
  38. Junio C HamanoOct 6, 2023
  39. Elijah NewrenOct 7, 2023
  40. Junio C HamanoOct 7, 2023
  41. Junio C HamanoOct 7, 2023
  42. Elijah NewrenOct 9, 2023
  43. Junio C HamanoOct 10, 2023
  44. [silly] worldview documents?Junio C Hamano, Oct 10, 2023
  45. Emily ShafferOct 10, 2023
  46. Sergey OrganovOct 6, 2023
  47. Sergey OrganovOct 6, 2023
  48. 3/3 completion: complete '--dd'Sergey Organov, Oct 4, 2023
  49. Junio C HamanoOct 5, 2023
  50. Sergey OrganovOct 6, 2023
  51. 0/3 diff-merges: introduce '--dd' optionSergey Organov, Oct 9, 2023
  52. 2/3 diff-merges: introduce '--dd' optionSergey Organov, Oct 9, 2023
  53. 1/3 diff-merges: improve --diff-merges documentationSergey Organov, Oct 9, 2023
  54. 3/3 completion: complete '--dd'Sergey Organov, Oct 9, 2023
  55. Junio C HamanoOct 9, 2023

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.