Git fork
1Raw output format
2-----------------
3
4The raw output format from `git-diff-index`, `git-diff-tree`,
5`git-diff-files` and `git diff --raw` are very similar.
6
7These commands all compare two sets of things; what is
8compared differs:
9
10`git-diff-index <tree-ish>`::
11 compares the _<tree-ish>_ and the files on the filesystem.
12
13`git-diff-index --cached <tree-ish>`::
14 compares the _<tree-ish>_ and the index.
15
16`git-diff-tree [-r] <tree-ish-1> <tree-ish-2> [<pattern>...]`::
17 compares the trees named by the two arguments.
18
19`git-diff-files [<pattern>...]`::
20 compares the index and the files on the filesystem.
21
22The `git-diff-tree` command begins its output by printing the hash of
23what is being compared. After that, all the commands print one output
24line per changed file.
25
26An output line is formatted this way:
27
28------------------------------------------------
29in-place edit :100644 100644 bcd1234 0123456 M file0
30copy-edit :100644 100644 abcd123 1234567 C68 file1 file2
31rename-edit :100644 100644 abcd123 1234567 R86 file1 file3
32create :000000 100644 0000000 1234567 A file4
33delete :100644 000000 1234567 0000000 D file5
34unmerged :000000 000000 0000000 0000000 U file6
35------------------------------------------------
36
37That is, from the left to the right:
38
39. a colon.
40. mode for "src"; 000000 if creation or unmerged.
41. a space.
42. mode for "dst"; 000000 if deletion or unmerged.
43. a space.
44. sha1 for "src"; 0\{40\} if creation or unmerged.
45. a space.
46. sha1 for "dst"; 0\{40\} if deletion, unmerged or "work tree out of sync with the index".
47. a space.
48. status, followed by optional "score" number.
49. a tab or a NUL when `-z` option is used.
50. path for "src"
51. a tab or a NUL when `-z` option is used; only exists for C or R.
52. path for "dst"; only exists for C or R.
53. an LF or a NUL when `-z` option is used, to terminate the record.
54
55Possible status letters are:
56
57- `A`: addition of a file
58- `C`: copy of a file into a new one
59- `D`: deletion of a file
60- `M`: modification of the contents or mode of a file
61- `R`: renaming of a file
62- `T`: change in the type of the file (regular file, symbolic link or submodule)
63- `U`: file is unmerged (you must complete the merge before it can
64 be committed)
65- `X`: "unknown" change type (most probably a bug, please report it)
66
67Status letters `C` and `R` are always followed by a score (denoting the
68percentage of similarity between the source and target of the move or
69copy). Status letter `M` may be followed by a score (denoting the
70percentage of dissimilarity) for file rewrites.
71
72The sha1 for "dst" is shown as all 0's if a file on the filesystem
73is out of sync with the index.
74
75Example:
76
77------------------------------------------------
78:100644 100644 5be4a4a 0000000 M file.c
79------------------------------------------------
80
81Without the `-z` option, pathnames with "unusual" characters are
82quoted as explained for the configuration variable `core.quotePath`
83(see linkgit:git-config[1]). Using `-z` the filename is output
84verbatim and the line is terminated by a NUL byte.
85
86diff format for merges
87----------------------
88
89`git-diff-tree`, `git-diff-files` and `git-diff --raw`
90can take `-c` or `--cc` option
91to generate diff output also for merge commits. The output differs
92from the format described above in the following way:
93
94. there is a colon for each parent
95. there are more "src" modes and "src" sha1
96. status is concatenated status characters for each parent
97. no optional "score" number
98. tab-separated pathname(s) of the file
99
100For `-c` and `--cc`, only the destination or final path is shown even
101if the file was renamed on any side of history. With
102`--combined-all-paths`, the name of the path in each parent is shown
103followed by the name of the path in the merge commit.
104
105Examples for `-c` and `--cc` without `--combined-all-paths`:
106
107------------------------------------------------
108::100644 100644 100644 fabadb8 cc95eb0 4866510 MM desc.c
109::100755 100755 100755 52b7a2d 6d1ac04 d2ac7d7 RM bar.sh
110::100644 100644 100644 e07d6c5 9042e82 ee91881 RR phooey.c
111------------------------------------------------
112
113Examples when `--combined-all-paths` added to either `-c` or `--cc`:
114
115------------------------------------------------
116::100644 100644 100644 fabadb8 cc95eb0 4866510 MM desc.c desc.c desc.c
117::100755 100755 100755 52b7a2d 6d1ac04 d2ac7d7 RM foo.sh bar.sh bar.sh
118::100644 100644 100644 e07d6c5 9042e82 ee91881 RR fooey.c fuey.c phooey.c
119------------------------------------------------
120
121Note that 'combined diff' lists only files which were modified from
122all parents.
123
124
125include::diff-generate-patch.adoc[]
126
127
128other diff formats
129------------------
130
131The `--summary` option describes newly added, deleted, renamed and
132copied files. The `--stat` option adds `diffstat`(1) graph to the
133output. These options can be combined with other options, such as
134`-p`, and are meant for human consumption.
135
136When showing a change that involves a rename or a copy, `--stat` output
137formats the pathnames compactly by combining common prefix and suffix of
138the pathnames. For example, a change that moves `arch/i386/Makefile` to
139`arch/x86/Makefile` while modifying 4 lines will be shown like this:
140
141------------------------------------
142arch/{i386 => x86}/Makefile | 4 +--
143------------------------------------
144
145The `--numstat` option gives the diffstat(1) information but is designed
146for easier machine consumption. An entry in `--numstat` output looks
147like this:
148
149----------------------------------------
1501 2 README
1513 1 arch/{i386 => x86}/Makefile
152----------------------------------------
153
154That is, from left to right:
155
156. the number of added lines;
157. a tab;
158. the number of deleted lines;
159. a tab;
160. pathname (possibly with rename/copy information);
161. a newline.
162
163When `-z` output option is in effect, the output is formatted this way:
164
165----------------------------------------
1661 2 README NUL
1673 1 NUL arch/i386/Makefile NUL arch/x86/Makefile NUL
168----------------------------------------
169
170That is:
171
172. the number of added lines;
173. a tab;
174. the number of deleted lines;
175. a tab;
176. a NUL (only exists if renamed/copied);
177. pathname in preimage;
178. a NUL (only exists if renamed/copied);
179. pathname in postimage (only exists if renamed/copied);
180. a NUL.
181
182The extra `NUL` before the preimage path in renamed case is to allow
183scripts that read the output to tell if the current record being read is
184a single-path record or a rename/copy record without reading ahead.
185After reading added and deleted lines, reading up to `NUL` would yield
186the pathname, but if that is `NUL`, the record will show two paths.