сравнивает файлы в рабочем дереве и индексе (Compares files in the working tree and the index)
Комбинированный формат DIFF (Combined DIFF format)
Any diff-generating command can take the -c
or --cc
option to
produce a combined diff when showing a merge. This is the default
format when showing merges with git-diff(1) or git-show(1). Note
also that you can give suitable --diff-merges
option to any of
these commands to force generation of diffs in specific format.
A "combined diff" format looks like this:
diff --combined describe.c
index fabadb8,cc95eb0..4866510
--- a/describe.c
+++ b/describe.c
@@@ -98,20 -98,12 +98,20 @@@
return (a_date > b_date) ? -1 : (a_date == b_date) ? 0 : 1;
}
- static void describe(char *arg)
-static void describe(struct commit *cmit, int last_one)
++static void describe(char *arg, int last_one)
{
+ unsigned char sha1[20];
+ struct commit *cmit;
struct commit_list *list;
static int initialized = 0;
struct commit_name *n;
+ if (get_sha1(arg, sha1) < 0)
+ usage(describe_usage);
+ cmit = lookup_commit_reference(sha1);
+ if (!cmit)
+ usage(describe_usage);
+
if (!initialized) {
initialized = 1;
for_each_ref(get_name);
1. It is preceded with a "git diff" header, that looks like this
(when the -c
option is used):
diff --combined file
or like this (when the --cc
option is used):
diff --cc file
2. It is followed by one or more extended header lines (this
example shows a merge with two parents):
index <hash>,<hash>..<hash>
mode <mode>,<mode>..<mode>
new file mode <mode>
deleted file mode <mode>,<mode>
The mode <mode>,<mode>..<mode>
line appears only if at least
one of the <mode> is different from the rest. Extended
headers with information about detected contents movement
(renames and copying detection) are designed to work with
diff of two <tree-ish> and are not used by combined diff
format.
3. It is followed by two-line from-file/to-file header
--- a/file
+++ b/file
Similar to two-line header for traditional unified diff
format, /dev/null
is used to signal created or deleted files.
However, if the --combined-all-paths option is provided,
instead of a two-line from-file/to-file you get a N+1 line
from-file/to-file header, where N is the number of parents in
the merge commit
--- a/file
--- a/file
--- a/file
+++ b/file
This extended format can be useful if rename or copy
detection is active, to allow you to see the original name of
the file in different parents.
4. Chunk header format is modified to prevent people from
accidentally feeding it to patch -p1
. Combined diff format
was created for review of merge commit changes, and was not
meant to be applied. The change is similar to the change in
the extended index header:
@@@ <from-file-range> <from-file-range> <to-file-range> @@@
There are (number of parents + 1) @
characters in the chunk
header for combined diff format.
Unlike the traditional unified diff format, which shows two files
A and B with a single column that has -
(minus — appears in A but
removed in B), +
(plus — missing in A but added to B), or " "
(space — unchanged) prefix, this format compares two or more
files file1, file2,... with one file X, and shows how X differs
from each of fileN. One column for each of fileN is prepended to
the output line to note how X's line is different from it.
A -
character in the column N means that the line appears in
fileN but it does not appear in the result. A +
character in the
column N means that the line appears in the result, and fileN
does not have that line (in other words, the line was added, from
the point of view of that parent).
In the above example output, the function signature was changed
from both files (hence two -
removals from both file1 and file2,
plus ++
to mean one line that was added does not appear in either
file1 or file2). Also eight other lines are the same from file1
but do not appear in file2 (hence prefixed with +
).
When shown by git diff-tree -c
, it compares the parents of a
merge commit with the merge result (i.e. file1..fileN are the
parents). When shown by git diff-files -c
, it compares the two
unresolved merge parents with the working tree file (i.e. file1
is stage 2 aka "our version", file2 is stage 3 aka "their
version").