1
0
Fork 0
mirror of https://github.com/git/git.git synced 2024-05-29 21:26:09 +02:00

Merge branch 'jk/log-fp-implies-m'

"git log --first-parent -p" showed patches only for single-parent
commits on the first-parent chain; the "--first-parent" option has
been made to imply "-m".  Use "--no-diff-merges" to restore the
previous behaviour to omit patches for merge commits.

* jk/log-fp-implies-m:
  doc/git-log: clarify handling of merge commit diffs
  doc/git-log: move "-t" into diff-options list
  doc/git-log: drop "-r" diff option
  doc/git-log: move "Diff Formatting" from rev-list-options
  log: enable "-m" automatically with "--first-parent"
  revision: add "--no-diff-merges" option to counteract "-m"
  log: drop "--cc implies -m" logic
This commit is contained in:
Junio C Hamano 2020-08-17 17:02:49 -07:00
commit eca8c62a50
9 changed files with 158 additions and 55 deletions

View File

@ -73,6 +73,11 @@ ifndef::git-format-patch[]
Synonym for `-p --raw`. Synonym for `-p --raw`.
endif::git-format-patch[] endif::git-format-patch[]
ifdef::git-log[]
-t::
Show the tree objects in the diff output.
endif::git-log[]
--indent-heuristic:: --indent-heuristic::
Enable the heuristic that shifts diff hunk boundaries to make patches Enable the heuristic that shifts diff hunk boundaries to make patches
easier to read. This is the default. easier to read. This is the default.

View File

@ -114,8 +114,47 @@ include::rev-list-options.txt[]
include::pretty-formats.txt[] include::pretty-formats.txt[]
COMMON DIFF OPTIONS DIFF FORMATTING
------------------- ---------------
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 `-c`, `--cc`, or `-m` is given, merge commits
will never 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 merges are treated like normal
single-parent commits (this can be overridden by providing a
combined-diff option or with `--no-diff-merges`).
-c::
With this option, diff output for a merge commit
shows the differences from each of the parents to the merge result
simultaneously instead of showing pairwise diff between a parent
and the result one at a time. Furthermore, it lists only files
which were modified from all parents.
--cc::
This flag implies the `-c` option and further compresses the
patch output by omitting uninteresting hunks whose contents in
the parents have only two variants and the merge result picks
one of them without modification.
--combined-all-paths::
This flag causes combined diffs (used for merge commits) to
list the name of the file from all parents. It thus only has
effect when -c or --cc are specified, and is likely only
useful if filename changes are detected (i.e. when either
rename or copy detection have been requested).
-m::
--diff-merges::
This flag makes the merge commits show the full diff like
regular commits; for each merge parent, a separate log entry
and diff is generated. An exception is that only diff against
the first parent is shown when `--first-parent` option is given;
in that case, the output represents the changes the merge
brought _into_ the then-current branch.
:git-log: 1 :git-log: 1
include::diff-options.txt[] include::diff-options.txt[]

View File

@ -1116,48 +1116,3 @@ ifdef::git-rev-list[]
by a tab. by a tab.
endif::git-rev-list[] endif::git-rev-list[]
endif::git-shortlog[] endif::git-shortlog[]
ifndef::git-shortlog[]
ifndef::git-rev-list[]
Diff Formatting
~~~~~~~~~~~~~~~
Listed below are options that control the formatting of diff output.
Some of them are specific to linkgit:git-rev-list[1], however other diff
options may be given. See linkgit:git-diff-files[1] for more options.
-c::
With this option, diff output for a merge commit
shows the differences from each of the parents to the merge result
simultaneously instead of showing pairwise diff between a parent
and the result one at a time. Furthermore, it lists only files
which were modified from all parents.
--cc::
This flag implies the `-c` option and further compresses the
patch output by omitting uninteresting hunks whose contents in
the parents have only two variants and the merge result picks
one of them without modification.
--combined-all-paths::
This flag causes combined diffs (used for merge commits) to
list the name of the file from all parents. It thus only has
effect when -c or --cc are specified, and is likely only
useful if filename changes are detected (i.e. when either
rename or copy detection have been requested).
-m::
This flag makes the merge commits show the full diff like
regular commits; for each merge parent, a separate log entry
and diff is generated. An exception is that only diff against
the first parent is shown when `--first-parent` option is given;
in that case, the output represents the changes the merge
brought _into_ the then-current branch.
-r::
Show recursive diffs.
-t::
Show the tree objects in the diff output. This implies `-r`.
endif::git-rev-list[]
endif::git-shortlog[]

View File

@ -599,8 +599,8 @@ static int show_tree_object(const struct object_id *oid,
static void show_setup_revisions_tweak(struct rev_info *rev, static void show_setup_revisions_tweak(struct rev_info *rev,
struct setup_revision_opt *opt) struct setup_revision_opt *opt)
{ {
if (rev->ignore_merges) { if (rev->ignore_merges < 0) {
/* There was no "-m" on the command line */ /* There was no "-m" variant on the command line */
rev->ignore_merges = 0; rev->ignore_merges = 0;
if (!rev->first_parent_only && !rev->combine_merges) { if (!rev->first_parent_only && !rev->combine_merges) {
/* No "--first-parent", "-c", or "--cc" */ /* No "--first-parent", "-c", or "--cc" */
@ -732,8 +732,7 @@ static void log_setup_revisions_tweak(struct rev_info *rev,
if (!rev->diffopt.output_format && rev->combine_merges) if (!rev->diffopt.output_format && rev->combine_merges)
rev->diffopt.output_format = DIFF_FORMAT_PATCH; rev->diffopt.output_format = DIFF_FORMAT_PATCH;
/* Turn -m on when --cc/-c was given */ if (rev->first_parent_only && rev->ignore_merges < 0)
if (rev->combine_merges)
rev->ignore_merges = 0; rev->ignore_merges = 0;
} }

View File

@ -1815,7 +1815,7 @@ void repo_init_revisions(struct repository *r,
revs->repo = r; revs->repo = r;
revs->abbrev = DEFAULT_ABBREV; revs->abbrev = DEFAULT_ABBREV;
revs->ignore_merges = 1; revs->ignore_merges = -1;
revs->simplify_history = 1; revs->simplify_history = 1;
revs->pruning.repo = r; revs->pruning.repo = r;
revs->pruning.flags.recursive = 1; revs->pruning.flags.recursive = 1;
@ -2343,8 +2343,10 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg
revs->diff = 1; revs->diff = 1;
revs->diffopt.flags.recursive = 1; revs->diffopt.flags.recursive = 1;
revs->diffopt.flags.tree_in_recursive = 1; revs->diffopt.flags.tree_in_recursive = 1;
} else if (!strcmp(arg, "-m")) { } else if (!strcmp(arg, "-m") || !strcmp(arg, "--diff-merges")) {
revs->ignore_merges = 0; revs->ignore_merges = 0;
} else if (!strcmp(arg, "--no-diff-merges")) {
revs->ignore_merges = 1;
} else if (!strcmp(arg, "-c")) { } else if (!strcmp(arg, "-c")) {
revs->diff = 1; revs->diff = 1;
revs->dense_combined_merges = 0; revs->dense_combined_merges = 0;
@ -2854,8 +2856,10 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, struct s
copy_pathspec(&revs->diffopt.pathspec, copy_pathspec(&revs->diffopt.pathspec,
&revs->prune_data); &revs->prune_data);
} }
if (revs->combine_merges) if (revs->combine_merges && revs->ignore_merges < 0)
revs->ignore_merges = 0; revs->ignore_merges = 0;
if (revs->ignore_merges < 0)
revs->ignore_merges = 1;
if (revs->combined_all_paths && !revs->combine_merges) if (revs->combined_all_paths && !revs->combine_merges)
die("--combined-all-paths makes no sense without -c or --cc"); die("--combined-all-paths makes no sense without -c or --cc");

View File

@ -190,11 +190,11 @@ struct rev_info {
show_root_diff:1, show_root_diff:1,
no_commit_id:1, no_commit_id:1,
verbose_header:1, verbose_header:1,
ignore_merges:1,
combine_merges:1, combine_merges:1,
combined_all_paths:1, combined_all_paths:1,
dense_combined_merges:1, dense_combined_merges:1,
always_show_header:1; always_show_header:1;
int ignore_merges:2;
/* Format info */ /* Format info */
int show_notes; int show_notes;

View File

@ -297,6 +297,7 @@ log --root --patch-with-stat --summary master
log --root -c --patch-with-stat --summary master log --root -c --patch-with-stat --summary master
# improved by Timo's patch # improved by Timo's patch
log --root --cc --patch-with-stat --summary master log --root --cc --patch-with-stat --summary master
log --no-diff-merges -p --first-parent master
log -p --first-parent master log -p --first-parent master
log -m -p --first-parent master log -m -p --first-parent master
log -m -p master log -m -p master

View File

@ -0,0 +1,78 @@
$ git log --no-diff-merges -p --first-parent master
commit 59d314ad6f356dd08601a4cd5e530381da3e3c64
Merge: 9a6d494 c7a2ab9
Author: A U Thor <author@example.com>
Date: Mon Jun 26 00:04:00 2006 +0000
Merge branch 'side'
commit 9a6d4949b6b76956d9d5e26f2791ec2ceff5fdc0
Author: A U Thor <author@example.com>
Date: Mon Jun 26 00:02:00 2006 +0000
Third
diff --git a/dir/sub b/dir/sub
index 8422d40..cead32e 100644
--- a/dir/sub
+++ b/dir/sub
@@ -2,3 +2,5 @@ A
B
C
D
+E
+F
diff --git a/file1 b/file1
new file mode 100644
index 0000000..b1e6722
--- /dev/null
+++ b/file1
@@ -0,0 +1,3 @@
+A
+B
+C
commit 1bde4ae5f36c8d9abe3a0fce0c6aab3c4a12fe44
Author: A U Thor <author@example.com>
Date: Mon Jun 26 00:01:00 2006 +0000
Second
This is the second commit.
diff --git a/dir/sub b/dir/sub
index 35d242b..8422d40 100644
--- a/dir/sub
+++ b/dir/sub
@@ -1,2 +1,4 @@
A
B
+C
+D
diff --git a/file0 b/file0
index 01e79c3..b414108 100644
--- a/file0
+++ b/file0
@@ -1,3 +1,6 @@
1
2
3
+4
+5
+6
diff --git a/file2 b/file2
deleted file mode 100644
index 01e79c3..0000000
--- a/file2
+++ /dev/null
@@ -1,3 +0,0 @@
-1
-2
-3
commit 444ac553ac7612cc88969031b02b3767fb8a353a
Author: A U Thor <author@example.com>
Date: Mon Jun 26 00:00:00 2006 +0000
Initial
$

View File

@ -6,6 +6,28 @@ Date: Mon Jun 26 00:04:00 2006 +0000
Merge branch 'side' Merge branch 'side'
diff --git a/dir/sub b/dir/sub
index cead32e..992913c 100644
--- a/dir/sub
+++ b/dir/sub
@@ -4,3 +4,5 @@ C
D
E
F
+1
+2
diff --git a/file0 b/file0
index b414108..10a8a9f 100644
--- a/file0
+++ b/file0
@@ -4,3 +4,6 @@
4
5
6
+A
+B
+C
commit 9a6d4949b6b76956d9d5e26f2791ec2ceff5fdc0 commit 9a6d4949b6b76956d9d5e26f2791ec2ceff5fdc0
Author: A U Thor <author@example.com> Author: A U Thor <author@example.com>
Date: Mon Jun 26 00:02:00 2006 +0000 Date: Mon Jun 26 00:02:00 2006 +0000