4c8cbca63d9ae52f6b74d155afd7293613b5cf76
[git.git] / man1 / git-diff-tree.1
1 .\"Generated by db2man.xsl. Don't modify this, modify the source.
2 .de Sh \" Subsection
3 .br
4 .if t .Sp
5 .ne 5
6 .PP
7 \fB\\$1\fR
8 .PP
9 ..
10 .de Sp \" Vertical space (when we can't use .PP)
11 .if t .sp .5v
12 .if n .sp
13 ..
14 .de Ip \" List item
15 .br
16 .ie \\n(.$>=3 .ne \\$3
17 .el .ne 3
18 .IP "\\$1" \\$2
19 ..
20 .TH "GIT-DIFF-TREE" 1 "" "" ""
21 .SH NAME
22 git-diff-tree \- Compares the content and mode of blobs found via two tree objects
23 .SH "SYNOPSIS"
24
25 .nf
26 \fIgit\-diff\-tree\fR [\-\-stdin] [\-m] [\-s] [\-v] [\-\-no\-commit\-id] [\-\-pretty]
27               [\-t] [\-r] [\-c | \-\-cc] [\-\-root] [<common diff options>]
28               <tree\-ish> [<tree\-ish>] [<path>...]
29 .fi
30
31 .SH "DESCRIPTION"
32
33
34 Compares the content and mode of the blobs found via two tree objects\&.
35
36
37 If there is only one <tree\-ish> given, the commit is compared with its parents (see \-\-stdin below)\&.
38
39
40 Note that "git\-diff\-tree" can use the tree encapsulated in a commit object\&.
41
42 .SH "OPTIONS"
43
44 .TP
45 \-p
46 Generate patch (see section on generating patches)
47
48 .TP
49 \-u
50 Synonym for "\-p"\&.
51
52 .TP
53 \-z
54 \\0 line termination on output
55
56 .TP
57 \-\-name\-only
58 Show only names of changed files\&.
59
60 .TP
61 \-\-name\-status
62 Show only names and status of changed files\&.
63
64 .TP
65 \-\-full\-index
66 Instead of the first handful characters, show full object name of pre\- and post\-image blob on the "index" line when generating a patch format output\&.
67
68 .TP
69 \-\-abbrev[=<n>]
70 Instead of showing the full 40\-byte hexadecimal object name in diff\-raw format output and diff\-tree header lines, show only handful hexdigits prefix\&. This is independent of \-\-full\-index option above, which controls the diff\-patch output format\&. Non default number of digits can be specified with \-\-abbrev=<n>\&.
71
72 .TP
73 \-B
74 Break complete rewrite changes into pairs of delete and create\&.
75
76 .TP
77 \-M
78 Detect renames\&.
79
80 .TP
81 \-C
82 Detect copies as well as renames\&.
83
84 .TP
85 \-\-find\-copies\-harder
86 For performance reasons, by default, \-C option finds copies only if the original file of the copy was modified in the same changeset\&. This flag makes the command inspect unmodified files as candidates for the source of copy\&. This is a very expensive operation for large projects, so use it with caution\&.
87
88 .TP
89 \-l<num>
90 \-M and \-C options require O(n^2) processing time where n is the number of potential rename/copy targets\&. This option prevents rename/copy detection from running if the number of rename/copy targets exceeds the specified number\&.
91
92 .TP
93 \-S<string>
94 Look for differences that contain the change in <string>\&.
95
96 .TP
97 \-\-pickaxe\-all
98 When \-S finds a change, show all the changes in that changeset, not just the files that contain the change in <string>\&.
99
100 .TP
101 \-O<orderfile>
102 Output the patch in the order specified in the <orderfile>, which has one shell glob pattern per line\&.
103
104 .TP
105 \-R
106 Swap two inputs; that is, show differences from index or on\-disk file to tree contents\&.
107
108
109 For more detailed explanation on these common options, see also diffcore documentation: \fIdiffcore.html\fR\&.
110
111 .TP
112 <tree\-ish>
113 The id of a tree object\&.
114
115 .TP
116 <path>...
117 If provided, the results are limited to a subset of files matching one of these prefix strings\&. ie file matches /^<pattern1>|<pattern2>|.../ Note that this parameter does not provide any wildcard or regexp features\&.
118
119 .TP
120 \-r
121 recurse into sub\-trees
122
123 .TP
124 \-t
125 show tree entry itself as well as subtrees\&. Implies \-r\&.
126
127 .TP
128 \-\-root
129 When \fI\-\-root\fR is specified the initial commit will be showed as a big creation event\&. This is equivalent to a diff against the NULL tree\&.
130
131 .TP
132 \-\-stdin
133 When \fI\-\-stdin\fR is specified, the command does not take <tree\-ish> arguments from the command line\&. Instead, it reads either one <commit> or a pair of <tree\-ish> separated with a single space from its standard input\&.
134
135 When a single commit is given on one line of such input, it compares the commit with its parents\&. The following flags further affects its behaviour\&. This does not apply to the case where two <tree\-ish> separated with a single space are given\&.
136
137 .TP
138 \-m
139 By default, "git\-diff\-tree \-\-stdin" does not show differences for merge commits\&. With this flag, it shows differences to that commit from all of its parents\&.
140
141 .TP
142 \-s
143 By default, "git\-diff\-tree \-\-stdin" shows differences, either in machine\-readable form (without \fI\-p\fR) or in patch form (with \fI\-p\fR)\&. This output can be suppressed\&. It is only useful with \fI\-v\fR flag\&.
144
145 .TP
146 \-v
147 This flag causes "git\-diff\-tree \-\-stdin" to also show the commit message before the differences\&.
148
149 .TP
150 \-\-pretty[=(raw|medium|short)]
151 This is used to control "pretty printing" format of the commit message\&. Without "=<style>", it defaults to medium\&.
152
153 .TP
154 \-\-no\-commit\-id
155 git\-diff\-tree outputs a line with the commit ID when applicable\&. This flag suppressed the commit ID output\&.
156
157 .TP
158 \-c,\-\-cc
159 These flags change the way a merge commit is displayed (which means it is useful only when the command is given one <tree\-ish>, or \fI\-\-stdin\fR)\&. It 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, which \fI\-m\fR option output does\&. \fI\-\-cc\fR further compresses the output by omiting hunks that show differences from only one parent, or show the same change from all but one parent for an Octopus merge\&. When this optimization makes all hunks disappear, the commit itself and the commit log message is not shown, just like any other "empty diff" cases\&.
160
161 .TP
162 \-\-always
163 Show the commit itself and the commit log message even if the diff itself is empty\&.
164
165 .SH "LIMITING OUTPUT"
166
167
168 If you're only interested in differences in a subset of files, for example some architecture\-specific files, you might do:
169
170 .nf
171 git\-diff\-tree \-r <tree\-ish> <tree\-ish> arch/ia64 include/asm\-ia64
172 .fi
173
174
175 and it will only show you what changed in those two directories\&.
176
177
178 Or if you are searching for what changed in just kernel/sched\&.c, just do
179
180 .nf
181 git\-diff\-tree \-r <tree\-ish> <tree\-ish> kernel/sched\&.c
182 .fi
183
184
185 and it will ignore all differences to other files\&.
186
187
188 The pattern is always the prefix, and is matched exactly\&. There are no wildcards\&. Even stricter, it has to match a complete path component\&. I\&.e\&. "foo" does not pick up foobar\&.h\&. "foo" does match foo/bar\&.h so it can be used to name subdirectories\&.
189
190
191 An example of normal usage is:
192
193 .nf
194 torvalds@ppc970:~/git> git\-diff\-tree 5319e4\&.\&.\&.\&.\&.\&.
195 *100664\->100664 blob    ac348b\&.\&.\&.\&.\&.\&.\&.\->a01513\&.\&.\&.\&.\&.\&.\&.      git\-fsck\-objects\&.c
196 .fi
197
198
199 which tells you that the last commit changed just one file (it's from this one:
200
201 .IP
202 commit 3c6f7ca19ad4043e9e72fa94106f352897e651a8
203 tree 5319e4d609cdd282069cc4dce33c1db559539b03
204 parent b4e628ea30d5ab3606119d2ea5caeab141d38df7
205 author Linus Torvalds <torvalds@ppc970\&.osdl\&.org> Sat Apr 9 12:02:30 2005
206 committer Linus Torvalds <torvalds@ppc970\&.osdl\&.org> Sat Apr 9 12:02:30 2005
207
208 Make "git\-fsck\-objects" print out all the root commits it finds\&.
209
210 Once I do the reference tracking, I'll also make it print out all the
211 HEAD commits it finds, which is even more interesting\&.
212
213 in case you care)\&.
214
215 .SH "OUTPUT FORMAT"
216
217
218 The output format from "git\-diff\-index", "git\-diff\-tree" and "git\-diff\-files" are very similar\&.
219
220
221 These commands all compare two sets of things; what is compared differs:
222
223 .TP
224 git\-diff\-index <tree\-ish>
225 compares the <tree\-ish> and the files on the filesystem\&.
226
227 .TP
228 git\-diff\-index \-\-cached <tree\-ish>
229 compares the <tree\-ish> and the index\&.
230
231 .TP
232 git\-diff\-tree [\-r] <tree\-ish\-1> <tree\-ish\-2> [<pattern>...]
233 compares the trees named by the two arguments\&.
234
235 .TP
236 git\-diff\-files [<pattern>...]
237 compares the index and the files on the filesystem\&.
238
239
240 An output line is formatted this way:
241
242 .IP
243 in\-place edit  :100644 100644 bcd1234\&.\&.\&. 0123456\&.\&.\&. M file0
244 copy\-edit      :100644 100644 abcd123\&.\&.\&. 1234567\&.\&.\&. C68 file1 file2
245 rename\-edit    :100644 100644 abcd123\&.\&.\&. 1234567\&.\&.\&. R86 file1 file3
246 create         :000000 100644 0000000\&.\&.\&. 1234567\&.\&.\&. A file4
247 delete         :100644 000000 1234567\&.\&.\&. 0000000\&.\&.\&. D file5
248 unmerged       :000000 000000 0000000\&.\&.\&. 0000000\&.\&.\&. U file6
249
250 That is, from the left to the right:
251
252 .TP 3
253 1.
254 a colon\&.
255 .TP
256 2.
257 mode for "src"; 000000 if creation or unmerged\&.
258 .TP
259 3.
260 a space\&.
261 .TP
262 4.
263 mode for "dst"; 000000 if deletion or unmerged\&.
264 .TP
265 5.
266 a space\&.
267 .TP
268 6.
269 sha1 for "src"; 0{40} if creation or unmerged\&.
270 .TP
271 7.
272 a space\&.
273 .TP
274 8.
275 sha1 for "dst"; 0{40} if creation, unmerged or "look at work tree"\&.
276 .TP
277 9.
278 a space\&.
279 .TP
280 10.
281 status, followed by optional "score" number\&.
282 .TP
283 11.
284 a tab or a NUL when \fI\-z\fR option is used\&.
285 .TP
286 12.
287 path for "src"
288 .TP
289 13.
290 a tab or a NUL when \fI\-z\fR option is used; only exists for C or R\&.
291 .TP
292 14.
293 path for "dst"; only exists for C or R\&.
294 .TP
295 15.
296 an LF or a NUL when \fI\-z\fR option is used, to terminate the record\&.
297 .LP
298
299
300 <sha1> is shown as all 0's if a file is new on the filesystem and it is out of sync with the index\&.
301
302
303 Example:
304
305 .IP
306 :100644 100644 5be4a4\&.\&.\&.\&.\&.\&. 000000\&.\&.\&.\&.\&.\&. M file\&.c
307
308 When \-z option is not used, TAB, LF, and backslash characters in pathnames are represented as \\t, \\n, and \\\\, respectively\&.
309
310 .SH "GENERATING PATCHES WITH -P"
311
312
313 When "git\-diff\-index", "git\-diff\-tree", or "git\-diff\-files" are run with a \fI\-p\fR option, they do not produce the output described above; instead they produce a patch file\&.
314
315
316 The patch generation can be customized at two levels\&.
317
318 .TP 3
319 1.
320 When the environment variable \fIGIT_EXTERNAL_DIFF\fR is not set, these commands internally invoke "diff" like this:
321
322
323 .nf
324 diff \-L a/<path> \-L b/<path> \-pu <old> <new>
325 .fi
326 For added files, /dev/null is used for <old>\&. For removed files, /dev/null is used for <new>
327
328 The "diff" formatting options can be customized via the environment variable \fIGIT_DIFF_OPTS\fR\&. For example, if you prefer context diff:
329
330 .nf
331 GIT_DIFF_OPTS=\-c git\-diff\-index \-p HEAD
332 .fi
333 .TP
334 2.
335 When the environment variable \fIGIT_EXTERNAL_DIFF\fR is set, the program named by it is called, instead of the diff invocation described above\&.
336
337 For a path that is added, removed, or modified, \fIGIT_EXTERNAL_DIFF\fR is called with 7 parameters:
338
339
340 .nf
341 path old\-file old\-hex old\-mode new\-file new\-hex new\-mode
342 .fi
343 where:
344
345 <old|new>\-file
346
347 are files GIT_EXTERNAL_DIFF can use to read the contents of <old|new>,
348
349 <old|new>\-hex
350
351 are the 40\-hexdigit SHA1 hashes,
352
353 <old|new>\-mode
354
355 are the octal representation of the file modes\&.
356
357 The file parameters can point at the user's working file (e\&.g\&. new\-file in "git\-diff\-files"), /dev/null (e\&.g\&. old\-file when a new file is added), or a temporary file (e\&.g\&. old\-file in the index)\&. \fIGIT_EXTERNAL_DIFF\fR should not worry about unlinking the temporary file \-\-\- it is removed when \fIGIT_EXTERNAL_DIFF\fR exits\&.
358 .LP
359
360
361 For a path that is unmerged, \fIGIT_EXTERNAL_DIFF\fR is called with 1 parameter, <path>\&.
362
363 .SH "GIT SPECIFIC EXTENSION TO DIFF FORMAT"
364
365
366 What \-p option produces is slightly different from the traditional diff format\&.
367
368 .TP 3
369 1.
370 It is preceded with a "git diff" header, that looks like this:
371
372
373 .nf
374 diff \-\-git a/file1 b/file2
375 .fi
376 The a/ and b/ filenames are the same unless rename/copy is involved\&. Especially, even for a creation or a deletion, /dev/null is _not_ used in place of a/ or b/ filenames\&.
377
378 When rename/copy is involved, file1 and file2 show the name of the source file of the rename/copy and the name of the file that rename/copy produces, respectively\&.
379 .TP
380 2.
381 It is followed by one or more extended header lines:
382
383 .nf
384 old mode <mode>
385 new mode <mode>
386 deleted file mode <mode>
387 new file mode <mode>
388 copy from <path>
389 copy to <path>
390 rename from <path>
391 rename to <path>
392 similarity index <number>
393 dissimilarity index <number>
394 index <hash>\&.\&.<hash> <mode>
395 .fi
396 .TP
397 3.
398 TAB, LF, and backslash characters in pathnames are represented as \\t, \\n, and \\\\, respectively\&.
399 .LP
400
401 .SH "COMBINED DIFF FORMAT"
402
403
404 git\-diff\-tree and git\-diff\-files can take \fI\-c\fR or \fI\-\-cc\fR option to produce \fIcombined diff\fR, which looks like this:
405
406 .IP
407 diff \-\-combined describe\&.c
408 @@@ +98,7 @@@
409    return (a_date > b_date) ? \-1 : (a_date == b_date) ? 0 : 1;
410   }
411
412 \- static void describe(char *arg)
413  \-static void describe(struct commit *cmit, int last_one)
414 ++static void describe(char *arg, int last_one)
415   {
416  +     unsigned char sha1[20];
417  +     struct commit *cmit;
418
419 Unlike the traditional \fIunified\fR 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\&.
420
421
422 A \- character in the column N means that the line appears in fileN but it does not appear in the last file\&. A + character in the column N means that the line appears in the last file, and fileN does not have that line\&.
423
424
425 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 nor file2)\&. Also two other lines are the same from file1 but do not appear in file2 (hence prefixed with +)\&.
426
427
428 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")\&.
429
430 .SH "AUTHOR"
431
432
433 Written by Linus Torvalds <torvalds@osdl\&.org>
434
435 .SH "DOCUMENTATION"
436
437
438 Documentation by David Greaves, Junio C Hamano and the git\-list <git@vger\&.kernel\&.org>\&.
439
440 .SH "GIT"
441
442
443 Part of the \fBgit\fR(7) suite
444