2009-07-28 08:32:18 +00:00
|
|
|
Raw output format
|
|
|
|
-----------------
|
|
|
|
|
|
|
|
The raw output format from "git-diff-index", "git-diff-tree",
|
2007-10-31 13:59:16 +00:00
|
|
|
"git-diff-files" and "git diff --raw" are very similar.
|
2005-05-08 17:22:48 +00:00
|
|
|
|
2007-06-07 07:04:01 +00:00
|
|
|
These commands all compare two sets of things; what is
|
2005-10-05 22:08:26 +00:00
|
|
|
compared differs:
|
2005-05-08 17:22:48 +00:00
|
|
|
|
2005-09-08 00:26:23 +00:00
|
|
|
git-diff-index <tree-ish>::
|
2005-05-08 17:22:48 +00:00
|
|
|
compares the <tree-ish> and the files on the filesystem.
|
|
|
|
|
2005-09-08 00:26:23 +00:00
|
|
|
git-diff-index --cached <tree-ish>::
|
2005-11-11 01:12:27 +00:00
|
|
|
compares the <tree-ish> and the index.
|
2005-05-08 17:22:48 +00:00
|
|
|
|
|
|
|
git-diff-tree [-r] <tree-ish-1> <tree-ish-2> [<pattern>...]::
|
|
|
|
compares the trees named by the two arguments.
|
|
|
|
|
|
|
|
git-diff-files [<pattern>...]::
|
2005-11-11 01:12:27 +00:00
|
|
|
compares the index and the files on the filesystem.
|
2005-05-08 17:22:48 +00:00
|
|
|
|
2010-01-31 13:24:39 +00:00
|
|
|
The "git-diff-tree" command begins its output by printing the hash of
|
2009-07-28 08:32:18 +00:00
|
|
|
what is being compared. After that, all the commands print one output
|
|
|
|
line per changed file.
|
2005-05-08 17:22:48 +00:00
|
|
|
|
2005-05-22 02:42:18 +00:00
|
|
|
An output line is formatted this way:
|
2005-05-08 17:22:48 +00:00
|
|
|
|
2005-08-30 20:51:01 +00:00
|
|
|
------------------------------------------------
|
2018-11-24 09:29:58 +00:00
|
|
|
in-place edit :100644 100644 bcd1234 0123456 M file0
|
|
|
|
copy-edit :100644 100644 abcd123 1234567 C68 file1 file2
|
|
|
|
rename-edit :100644 100644 abcd123 1234567 R86 file1 file3
|
|
|
|
create :000000 100644 0000000 1234567 A file4
|
|
|
|
delete :100644 000000 1234567 0000000 D file5
|
|
|
|
unmerged :000000 000000 0000000 0000000 U file6
|
2005-08-30 20:51:01 +00:00
|
|
|
------------------------------------------------
|
2005-05-23 21:55:33 +00:00
|
|
|
|
|
|
|
That is, from the left to the right:
|
|
|
|
|
2005-08-30 20:51:01 +00:00
|
|
|
. a colon.
|
|
|
|
. mode for "src"; 000000 if creation or unmerged.
|
|
|
|
. a space.
|
|
|
|
. mode for "dst"; 000000 if deletion or unmerged.
|
|
|
|
. a space.
|
|
|
|
. sha1 for "src"; 0\{40\} if creation or unmerged.
|
|
|
|
. a space.
|
diff-format.txt: correct misleading wording
Near the end of the "Raw output format" section, an example shows the
output of 'git diff-files' for a tracked file modified on disk but not
yet added to the index. However the wording is:
<sha1> is shown as all 0's if a file is new on the filesystem
and it is out of sync with the index.
which is confusing since it can be understood to mean that 'file' is a
new, yet untracked file, in which case 'git diff-files' does not care
about it at all.
When this example was introduced all the way back in c64b9b8860
(Reference documentation for the core git commands., 2005-05-05), 'old'
and 'new' referred to the two entities being compared, depending on the
command being used (diff-index, diff-tree or diff-files - which at the
time were diff-cache, diff-tree and show-diff). The wording used at the
time was:
<new-sha1> is shown as all 0's if new is a file on the
filesystem and it is out of sync with the cache.
This section was reworked in 81e50eabf0 ([PATCH] The diff-raw
format updates., 2005-05-21) and the mention of the meaning of 'new' and
'old' was removed. Then in f73ae1fc5d (Some typos and light editing of
various manpages, 2005-10-05), the wording was changed to what it is
now.
In addition, in b6d8f309d9 ([PATCH] diff-raw format update take #2.,
2005-05-23), the section was further reworked and did not use '<sha1>'
anymore, making the example the sole user of this token.
Rework the introductory sentence of the example to instead refer to
'sha1 for "dst"', which is what the text description above it uses, and
fix the wording so that we do not mention a "new file".
While at it, also tweak the wording used in the description of the raw
format to explicitely state that all 0's are used for the destination
hash if the working tree is out of sync with the index, instead of the
more vague "look at worktree".
Signed-off-by: Philippe Blain <levraiphilippeblain@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2022-06-13 12:29:42 +00:00
|
|
|
. sha1 for "dst"; 0\{40\} if deletion, unmerged or "work tree out of sync with the index".
|
2005-08-30 20:51:01 +00:00
|
|
|
. a space.
|
|
|
|
. status, followed by optional "score" number.
|
2016-06-28 11:40:10 +00:00
|
|
|
. a tab or a NUL when `-z` option is used.
|
2005-08-30 20:51:01 +00:00
|
|
|
. path for "src"
|
2016-06-28 11:40:10 +00:00
|
|
|
. a tab or a NUL when `-z` option is used; only exists for C or R.
|
2005-08-30 20:51:01 +00:00
|
|
|
. path for "dst"; only exists for C or R.
|
2016-06-28 11:40:10 +00:00
|
|
|
. an LF or a NUL when `-z` option is used, to terminate the record.
|
2005-05-08 17:22:48 +00:00
|
|
|
|
2008-11-02 13:37:28 +00:00
|
|
|
Possible status letters are:
|
|
|
|
|
|
|
|
- A: addition of a file
|
|
|
|
- C: copy of a file into a new one
|
|
|
|
- D: deletion of a file
|
|
|
|
- M: modification of the contents or mode of a file
|
|
|
|
- R: renaming of a file
|
2021-10-04 19:00:48 +00:00
|
|
|
- T: change in the type of the file (regular file, symbolic link or submodule)
|
2008-11-02 13:37:28 +00:00
|
|
|
- U: file is unmerged (you must complete the merge before it can
|
2019-12-12 20:46:55 +00:00
|
|
|
be committed)
|
2008-11-02 13:37:28 +00:00
|
|
|
- X: "unknown" change type (most probably a bug, please report it)
|
|
|
|
|
2008-12-19 12:14:18 +00:00
|
|
|
Status letters C and R are always followed by a score (denoting the
|
2008-11-02 13:37:28 +00:00
|
|
|
percentage of similarity between the source and target of the move or
|
2015-01-28 21:17:19 +00:00
|
|
|
copy). Status letter M may be followed by a score (denoting the
|
|
|
|
percentage of dissimilarity) for file rewrites.
|
2008-11-02 13:37:28 +00:00
|
|
|
|
diff-format.txt: correct misleading wording
Near the end of the "Raw output format" section, an example shows the
output of 'git diff-files' for a tracked file modified on disk but not
yet added to the index. However the wording is:
<sha1> is shown as all 0's if a file is new on the filesystem
and it is out of sync with the index.
which is confusing since it can be understood to mean that 'file' is a
new, yet untracked file, in which case 'git diff-files' does not care
about it at all.
When this example was introduced all the way back in c64b9b8860
(Reference documentation for the core git commands., 2005-05-05), 'old'
and 'new' referred to the two entities being compared, depending on the
command being used (diff-index, diff-tree or diff-files - which at the
time were diff-cache, diff-tree and show-diff). The wording used at the
time was:
<new-sha1> is shown as all 0's if new is a file on the
filesystem and it is out of sync with the cache.
This section was reworked in 81e50eabf0 ([PATCH] The diff-raw
format updates., 2005-05-21) and the mention of the meaning of 'new' and
'old' was removed. Then in f73ae1fc5d (Some typos and light editing of
various manpages, 2005-10-05), the wording was changed to what it is
now.
In addition, in b6d8f309d9 ([PATCH] diff-raw format update take #2.,
2005-05-23), the section was further reworked and did not use '<sha1>'
anymore, making the example the sole user of this token.
Rework the introductory sentence of the example to instead refer to
'sha1 for "dst"', which is what the text description above it uses, and
fix the wording so that we do not mention a "new file".
While at it, also tweak the wording used in the description of the raw
format to explicitely state that all 0's are used for the destination
hash if the working tree is out of sync with the index, instead of the
more vague "look at worktree".
Signed-off-by: Philippe Blain <levraiphilippeblain@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2022-06-13 12:29:42 +00:00
|
|
|
The sha1 for "dst" is shown as all 0's if a file on the filesystem
|
|
|
|
is out of sync with the index.
|
2005-05-08 17:22:48 +00:00
|
|
|
|
2005-08-30 20:51:01 +00:00
|
|
|
Example:
|
|
|
|
|
|
|
|
------------------------------------------------
|
2018-11-24 09:29:58 +00:00
|
|
|
:100644 100644 5be4a4a 0000000 M file.c
|
2005-08-30 20:51:01 +00:00
|
|
|
------------------------------------------------
|
2005-05-08 17:22:48 +00:00
|
|
|
|
2017-03-02 19:03:52 +00:00
|
|
|
Without the `-z` option, pathnames with "unusual" characters are
|
|
|
|
quoted as explained for the configuration variable `core.quotePath`
|
|
|
|
(see linkgit:git-config[1]). Using `-z` the filename is output
|
|
|
|
verbatim and the line is terminated by a NUL byte.
|
2005-10-15 04:56:46 +00:00
|
|
|
|
2007-05-04 22:48:35 +00:00
|
|
|
diff format for merges
|
|
|
|
----------------------
|
|
|
|
|
2007-10-31 13:59:16 +00:00
|
|
|
"git-diff-tree", "git-diff-files" and "git-diff --raw"
|
2016-06-28 11:40:11 +00:00
|
|
|
can take `-c` or `--cc` option
|
2007-05-04 22:48:35 +00:00
|
|
|
to generate diff output also for merge commits. The output differs
|
|
|
|
from the format described above in the following way:
|
|
|
|
|
|
|
|
. there is a colon for each parent
|
|
|
|
. there are more "src" modes and "src" sha1
|
|
|
|
. status is concatenated status characters for each parent
|
|
|
|
. no optional "score" number
|
log,diff-tree: add --combined-all-paths option
The combined diff format for merges will only list one filename, even if
rename or copy detection is active. For example, with raw format one
might see:
::100644 100644 100644 fabadb8 cc95eb0 4866510 MM describe.c
::100755 100755 100755 52b7a2d 6d1ac04 d2ac7d7 RM bar.sh
::100644 100644 100644 e07d6c5 9042e82 ee91881 RR phooey.c
This doesn't let us know what the original name of bar.sh was in the
first parent, and doesn't let us know what either of the original names
of phooey.c were in either of the parents. In contrast, for non-merge
commits, raw format does provide original filenames (and a rename score
to boot). In order to also provide original filenames for merge
commits, add a --combined-all-paths option (which must be used with
either -c or --cc, and is likely only useful with rename or copy
detection active) so that we can print tab-separated filenames when
renames are involved. This transforms the above output to:
::100644 100644 100644 fabadb8 cc95eb0 4866510 MM desc.c desc.c desc.c
::100755 100755 100755 52b7a2d 6d1ac04 d2ac7d7 RM foo.sh bar.sh bar.sh
::100644 100644 100644 e07d6c5 9042e82 ee91881 RR fooey.c fuey.c phooey.c
Further, in patch format, this changes the from/to headers so that
instead of just having one "from" header, we get one for each parent.
For example, instead of having
--- a/phooey.c
+++ b/phooey.c
we would see
--- a/fooey.c
--- a/fuey.c
+++ b/phooey.c
Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2019-02-08 01:12:46 +00:00
|
|
|
. tab-separated pathname(s) of the file
|
2007-05-04 22:48:35 +00:00
|
|
|
|
log,diff-tree: add --combined-all-paths option
The combined diff format for merges will only list one filename, even if
rename or copy detection is active. For example, with raw format one
might see:
::100644 100644 100644 fabadb8 cc95eb0 4866510 MM describe.c
::100755 100755 100755 52b7a2d 6d1ac04 d2ac7d7 RM bar.sh
::100644 100644 100644 e07d6c5 9042e82 ee91881 RR phooey.c
This doesn't let us know what the original name of bar.sh was in the
first parent, and doesn't let us know what either of the original names
of phooey.c were in either of the parents. In contrast, for non-merge
commits, raw format does provide original filenames (and a rename score
to boot). In order to also provide original filenames for merge
commits, add a --combined-all-paths option (which must be used with
either -c or --cc, and is likely only useful with rename or copy
detection active) so that we can print tab-separated filenames when
renames are involved. This transforms the above output to:
::100644 100644 100644 fabadb8 cc95eb0 4866510 MM desc.c desc.c desc.c
::100755 100755 100755 52b7a2d 6d1ac04 d2ac7d7 RM foo.sh bar.sh bar.sh
::100644 100644 100644 e07d6c5 9042e82 ee91881 RR fooey.c fuey.c phooey.c
Further, in patch format, this changes the from/to headers so that
instead of just having one "from" header, we get one for each parent.
For example, instead of having
--- a/phooey.c
+++ b/phooey.c
we would see
--- a/fooey.c
--- a/fuey.c
+++ b/phooey.c
Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2019-02-08 01:12:46 +00:00
|
|
|
For `-c` and `--cc`, only the destination or final path is shown even
|
|
|
|
if the file was renamed on any side of history. With
|
|
|
|
`--combined-all-paths`, the name of the path in each parent is shown
|
|
|
|
followed by the name of the path in the merge commit.
|
|
|
|
|
|
|
|
Examples for `-c` and `--cc` without `--combined-all-paths`:
|
|
|
|
------------------------------------------------
|
|
|
|
::100644 100644 100644 fabadb8 cc95eb0 4866510 MM desc.c
|
|
|
|
::100755 100755 100755 52b7a2d 6d1ac04 d2ac7d7 RM bar.sh
|
|
|
|
::100644 100644 100644 e07d6c5 9042e82 ee91881 RR phooey.c
|
|
|
|
------------------------------------------------
|
|
|
|
|
|
|
|
Examples when `--combined-all-paths` added to either `-c` or `--cc`:
|
2007-05-04 22:48:35 +00:00
|
|
|
|
|
|
|
------------------------------------------------
|
log,diff-tree: add --combined-all-paths option
The combined diff format for merges will only list one filename, even if
rename or copy detection is active. For example, with raw format one
might see:
::100644 100644 100644 fabadb8 cc95eb0 4866510 MM describe.c
::100755 100755 100755 52b7a2d 6d1ac04 d2ac7d7 RM bar.sh
::100644 100644 100644 e07d6c5 9042e82 ee91881 RR phooey.c
This doesn't let us know what the original name of bar.sh was in the
first parent, and doesn't let us know what either of the original names
of phooey.c were in either of the parents. In contrast, for non-merge
commits, raw format does provide original filenames (and a rename score
to boot). In order to also provide original filenames for merge
commits, add a --combined-all-paths option (which must be used with
either -c or --cc, and is likely only useful with rename or copy
detection active) so that we can print tab-separated filenames when
renames are involved. This transforms the above output to:
::100644 100644 100644 fabadb8 cc95eb0 4866510 MM desc.c desc.c desc.c
::100755 100755 100755 52b7a2d 6d1ac04 d2ac7d7 RM foo.sh bar.sh bar.sh
::100644 100644 100644 e07d6c5 9042e82 ee91881 RR fooey.c fuey.c phooey.c
Further, in patch format, this changes the from/to headers so that
instead of just having one "from" header, we get one for each parent.
For example, instead of having
--- a/phooey.c
+++ b/phooey.c
we would see
--- a/fooey.c
--- a/fuey.c
+++ b/phooey.c
Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2019-02-08 01:12:46 +00:00
|
|
|
::100644 100644 100644 fabadb8 cc95eb0 4866510 MM desc.c desc.c desc.c
|
|
|
|
::100755 100755 100755 52b7a2d 6d1ac04 d2ac7d7 RM foo.sh bar.sh bar.sh
|
|
|
|
::100644 100644 100644 e07d6c5 9042e82 ee91881 RR fooey.c fuey.c phooey.c
|
2007-05-04 22:48:35 +00:00
|
|
|
------------------------------------------------
|
|
|
|
|
|
|
|
Note that 'combined diff' lists only files which were modified from
|
|
|
|
all parents.
|
|
|
|
|
2005-10-15 04:56:46 +00:00
|
|
|
|
2007-11-01 14:57:40 +00:00
|
|
|
include::diff-generate-patch.txt[]
|
2007-12-12 07:46:30 +00:00
|
|
|
|
|
|
|
|
|
|
|
other diff formats
|
|
|
|
------------------
|
|
|
|
|
|
|
|
The `--summary` option describes newly added, deleted, renamed and
|
|
|
|
copied files. The `--stat` option adds diffstat(1) graph to the
|
|
|
|
output. These options can be combined with other options, such as
|
|
|
|
`-p`, and are meant for human consumption.
|
|
|
|
|
|
|
|
When showing a change that involves a rename or a copy, `--stat` output
|
|
|
|
formats the pathnames compactly by combining common prefix and suffix of
|
|
|
|
the pathnames. For example, a change that moves `arch/i386/Makefile` to
|
|
|
|
`arch/x86/Makefile` while modifying 4 lines will be shown like this:
|
|
|
|
|
|
|
|
------------------------------------
|
|
|
|
arch/{i386 => x86}/Makefile | 4 +--
|
|
|
|
------------------------------------
|
|
|
|
|
|
|
|
The `--numstat` option gives the diffstat(1) information but is designed
|
|
|
|
for easier machine consumption. An entry in `--numstat` output looks
|
|
|
|
like this:
|
|
|
|
|
|
|
|
----------------------------------------
|
|
|
|
1 2 README
|
|
|
|
3 1 arch/{i386 => x86}/Makefile
|
|
|
|
----------------------------------------
|
|
|
|
|
|
|
|
That is, from left to right:
|
|
|
|
|
|
|
|
. the number of added lines;
|
|
|
|
. a tab;
|
|
|
|
. the number of deleted lines;
|
|
|
|
. a tab;
|
|
|
|
. pathname (possibly with rename/copy information);
|
|
|
|
. a newline.
|
|
|
|
|
|
|
|
When `-z` output option is in effect, the output is formatted this way:
|
|
|
|
|
|
|
|
----------------------------------------
|
|
|
|
1 2 README NUL
|
|
|
|
3 1 NUL arch/i386/Makefile NUL arch/x86/Makefile NUL
|
|
|
|
----------------------------------------
|
|
|
|
|
|
|
|
That is:
|
|
|
|
|
|
|
|
. the number of added lines;
|
|
|
|
. a tab;
|
|
|
|
. the number of deleted lines;
|
|
|
|
. a tab;
|
|
|
|
. a NUL (only exists if renamed/copied);
|
|
|
|
. pathname in preimage;
|
|
|
|
. a NUL (only exists if renamed/copied);
|
|
|
|
. pathname in postimage (only exists if renamed/copied);
|
|
|
|
. a NUL.
|
|
|
|
|
|
|
|
The extra `NUL` before the preimage path in renamed case is to allow
|
|
|
|
scripts that read the output to tell if the current record being read is
|
|
|
|
a single-path record or a rename/copy record without reading ahead.
|
|
|
|
After reading added and deleted lines, reading up to `NUL` would yield
|
|
|
|
the pathname, but if that is `NUL`, the record will show two paths.
|