Autogenerated man pages for 026351a03507dc3a2e89e068c01234dc55914df2
[git.git] / man1 / git-diff-index.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-INDEX" 1 "" "" ""
21 .SH NAME
22 git-diff-index \- Compares content and mode of blobs between the index and repository
23 .SH "SYNOPSIS"
24
25
26 git\-diff\-index [\-m] [\-\-cached] [<common diff options>] <tree\-ish> [<path>...]
27
28 .SH "DESCRIPTION"
29
30
31 Compares the content and mode of the blobs found via a tree object with the content of the current index and, optionally ignoring the stat state of the file on disk\&. When paths are specified, compares only those named paths\&. Otherwise all entries in the index are compared\&.
32
33 .SH "OPTIONS"
34
35 .TP
36 \-p
37 Generate patch (see section on generating patches)
38
39 .TP
40 \-u
41 Synonym for "\-p"\&.
42
43 .TP
44 \-z
45 \\0 line termination on output
46
47 .TP
48 \-\-name\-only
49 Show only names of changed files\&.
50
51 .TP
52 \-\-name\-status
53 Show only names and status of changed files\&.
54
55 .TP
56 \-\-full\-index
57 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\&.
58
59 .TP
60 \-\-abbrev[=<n>]
61 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>\&.
62
63 .TP
64 \-B
65 Break complete rewrite changes into pairs of delete and create\&.
66
67 .TP
68 \-M
69 Detect renames\&.
70
71 .TP
72 \-C
73 Detect copies as well as renames\&.
74
75 .TP
76 \-\-find\-copies\-harder
77 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\&.
78
79 .TP
80 \-l<num>
81 \-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\&.
82
83 .TP
84 \-S<string>
85 Look for differences that contain the change in <string>\&.
86
87 .TP
88 \-\-pickaxe\-all
89 When \-S finds a change, show all the changes in that changeset, not just the files that contain the change in <string>\&.
90
91 .TP
92 \-O<orderfile>
93 Output the patch in the order specified in the <orderfile>, which has one shell glob pattern per line\&.
94
95 .TP
96 \-R
97 Swap two inputs; that is, show differences from index or on\-disk file to tree contents\&.
98
99
100 For more detailed explanation on these common options, see also diffcore documentation: \fIdiffcore.html\fR\&.
101
102 .TP
103 <tree\-ish>
104 The id of a tree object to diff against\&.
105
106 .TP
107 \-\-cached
108 do not consider the on\-disk file at all
109
110 .TP
111 \-m
112 By default, files recorded in the index but not checked out are reported as deleted\&. This flag makes "git\-diff\-index" say that all non\-checked\-out files are up to date\&.
113
114 .SH "OUTPUT FORMAT"
115
116
117 The output format from "git\-diff\-index", "git\-diff\-tree" and "git\-diff\-files" are very similar\&.
118
119
120 These commands all compare two sets of things; what is compared differs:
121
122 .TP
123 git\-diff\-index <tree\-ish>
124 compares the <tree\-ish> and the files on the filesystem\&.
125
126 .TP
127 git\-diff\-index \-\-cached <tree\-ish>
128 compares the <tree\-ish> and the index\&.
129
130 .TP
131 git\-diff\-tree [\-r] <tree\-ish\-1> <tree\-ish\-2> [<pattern>...]
132 compares the trees named by the two arguments\&.
133
134 .TP
135 git\-diff\-files [<pattern>...]
136 compares the index and the files on the filesystem\&.
137
138
139 An output line is formatted this way:
140
141 .IP
142 in\-place edit  :100644 100644 bcd1234\&.\&.\&. 0123456\&.\&.\&. M file0
143 copy\-edit      :100644 100644 abcd123\&.\&.\&. 1234567\&.\&.\&. C68 file1 file2
144 rename\-edit    :100644 100644 abcd123\&.\&.\&. 1234567\&.\&.\&. R86 file1 file3
145 create         :000000 100644 0000000\&.\&.\&. 1234567\&.\&.\&. A file4
146 delete         :100644 000000 1234567\&.\&.\&. 0000000\&.\&.\&. D file5
147 unmerged       :000000 000000 0000000\&.\&.\&. 0000000\&.\&.\&. U file6
148
149 That is, from the left to the right:
150
151 .TP 3
152 1.
153 a colon\&.
154 .TP
155 2.
156 mode for "src"; 000000 if creation or unmerged\&.
157 .TP
158 3.
159 a space\&.
160 .TP
161 4.
162 mode for "dst"; 000000 if deletion or unmerged\&.
163 .TP
164 5.
165 a space\&.
166 .TP
167 6.
168 sha1 for "src"; 0{40} if creation or unmerged\&.
169 .TP
170 7.
171 a space\&.
172 .TP
173 8.
174 sha1 for "dst"; 0{40} if creation, unmerged or "look at work tree"\&.
175 .TP
176 9.
177 a space\&.
178 .TP
179 10.
180 status, followed by optional "score" number\&.
181 .TP
182 11.
183 a tab or a NUL when \-z option is used\&.
184 .TP
185 12.
186 path for "src"
187 .TP
188 13.
189 a tab or a NUL when \-z option is used; only exists for C or R\&.
190 .TP
191 14.
192 path for "dst"; only exists for C or R\&.
193 .TP
194 15.
195 an LF or a NUL when \-z option is used, to terminate the record\&.
196 .LP
197
198
199 <sha1> is shown as all 0's if a file is new on the filesystem and it is out of sync with the index\&.
200
201
202 Example:
203
204 .IP
205 :100644 100644 5be4a4\&.\&.\&.\&.\&.\&. 000000\&.\&.\&.\&.\&.\&. M file\&.c
206
207 When \-z option is not used, TAB, LF, and backslash characters in pathnames are represented as \\t, \\n, and \\\\, respectively\&.
208
209 .SH "GENERATING PATCHES WITH -P"
210
211
212 When "git\-diff\-index", "git\-diff\-tree", or "git\-diff\-files" are run with a \-p option, they do not produce the output described above; instead they produce a patch file\&.
213
214
215 The patch generation can be customized at two levels\&.
216
217 .TP 3
218 1.
219 When the environment variable GIT_EXTERNAL_DIFF is not set, these commands internally invoke "diff" like this:
220
221
222 .nf
223 diff \-L a/<path> \-L b/<path> \-pu <old> <new>
224 .fi
225 For added files, /dev/null is used for <old>\&. For removed files, /dev/null is used for <new>
226
227 The "diff" formatting options can be customized via the environment variable GIT_DIFF_OPTS\&. For example, if you prefer context diff:
228
229 .nf
230 GIT_DIFF_OPTS=\-c git\-diff\-index \-p HEAD
231 .fi
232 .TP
233 2.
234 When the environment variable GIT_EXTERNAL_DIFF is set, the program named by it is called, instead of the diff invocation described above\&.
235
236 For a path that is added, removed, or modified, GIT_EXTERNAL_DIFF is called with 7 parameters:
237
238
239 .nf
240 path old\-file old\-hex old\-mode new\-file new\-hex new\-mode
241 .fi
242 where:
243
244 <old|new>\-file
245 are files GIT_EXTERNAL_DIFF can use to read the contents of <old|new>,
246 <old|new>\-hex
247 are the 40\-hexdigit SHA1 hashes,
248 <old|new>\-mode
249 are the octal representation of the file modes\&.
250 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)\&. GIT_EXTERNAL_DIFF should not worry about unlinking the temporary file \-\-\- it is removed when GIT_EXTERNAL_DIFF exits\&.
251 .LP
252
253
254 For a path that is unmerged, GIT_EXTERNAL_DIFF is called with 1 parameter, <path>\&.
255
256 .SH "GIT SPECIFIC EXTENSION TO DIFF FORMAT"
257
258
259 What \-p option produces is slightly different from the traditional diff format\&.
260
261 .TP 3
262 1.
263 It is preceded with a "git diff" header, that looks like this:
264
265
266 .nf
267 diff \-\-git a/file1 b/file2
268 .fi
269 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\&.
270
271 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\&.
272 .TP
273 2.
274 It is followed by one or more extended header lines:
275
276 .nf
277 old mode <mode>
278 new mode <mode>
279 deleted file mode <mode>
280 new file mode <mode>
281 copy from <path>
282 copy to <path>
283 rename from <path>
284 rename to <path>
285 similarity index <number>
286 dissimilarity index <number>
287 index <hash>\&.\&.<hash> <mode>
288 .fi
289 .TP
290 3.
291 TAB, LF, and backslash characters in pathnames are represented as \\t, \\n, and \\\\, respectively\&.
292 .LP
293
294 .SH "OPERATING MODES"
295
296
297 You can choose whether you want to trust the index file entirely (using the \-\-cached flag) or ask the diff logic to show any files that don't match the stat state as being "tentatively changed"\&. Both of these operations are very useful indeed\&.
298
299 .SH "CACHED MODE"
300
301
302 If \-\-cached is specified, it allows you to ask:
303
304 .nf
305 show me the differences between HEAD and the current index
306 contents (the ones I'd write with a "git\-write\-tree")
307 .fi
308
309
310 For example, let's say that you have worked on your working directory, updated some files in the index and are ready to commit\&. You want to see exactly what you are going to commit is without having to write a new tree object and compare it that way, and to do that, you just do
311
312 .nf
313 git\-diff\-index \-\-cached HEAD
314 .fi
315
316
317 Example: let's say I had renamed commit\&.c to git\-commit\&.c, and I had done an "git\-update\-index" to make that effective in the index file\&. "git\-diff\-files" wouldn't show anything at all, since the index file matches my working directory\&. But doing a "git\-diff\-index" does:
318
319 .nf
320 torvalds@ppc970:~/git> git\-diff\-index \-\-cached HEAD
321 \-100644 blob    4161aecc6700a2eb579e842af0b7f22b98443f74        commit\&.c
322 +100644 blob    4161aecc6700a2eb579e842af0b7f22b98443f74        git\-commit\&.c
323 .fi
324
325
326 You can trivially see that the above is a rename\&.
327
328
329 In fact, "git\-diff\-index \-\-cached" should always be entirely equivalent to actually doing a "git\-write\-tree" and comparing that\&. Except this one is much nicer for the case where you just want to check where you are\&.
330
331
332 So doing a "git\-diff\-index \-\-cached" is basically very useful when you are asking yourself "what have I already marked for being committed, and what's the difference to a previous tree"\&.
333
334 .SH "NON-CACHED MODE"
335
336
337 The "non\-cached" mode takes a different approach, and is potentially the more useful of the two in that what it does can't be emulated with a "git\-write\-tree" + "git\-diff\-tree"\&. Thus that's the default mode\&. The non\-cached version asks the question:
338
339 .nf
340 show me the differences between HEAD and the currently checked out
341 tree \- index contents _and_ files that aren't up\-to\-date
342 .fi
343
344
345 which is obviously a very useful question too, since that tells you what you could commit\&. Again, the output matches the "git\-diff\-tree \-r" output to a tee, but with a twist\&.
346
347
348 The twist is that if some file doesn't match the index, we don't have a backing store thing for it, and we use the magic "all\-zero" sha1 to show that\&. So let's say that you have edited kernel/sched\&.c, but have not actually done a "git\-update\-index" on it yet \- there is no "object" associated with the new state, and you get:
349
350 .nf
351 torvalds@ppc970:~/v2\&.6/linux> git\-diff\-index HEAD
352 *100644\->100664 blob    7476bb\&.\&.\&.\&.\&.\&.\->000000\&.\&.\&.\&.\&.\&.      kernel/sched\&.c
353 .fi
354
355
356 ie it shows that the tree has changed, and that kernel/sched\&.c has is not up\-to\-date and may contain new stuff\&. The all\-zero sha1 means that to get the real diff, you need to look at the object in the working directory directly rather than do an object\-to\-object diff\&.
357
358 .RS
359 .Sh "Note"
360
361
362 As with other commands of this type, "git\-diff\-index" does not actually look at the contents of the file at all\&. So maybe kernel/sched\&.c hasn't actually changed, and it's just that you touched it\&. In either case, it's a note that you need to "git\-update\-index" it to make the index be in sync\&.
363
364 .RE
365
366 .RS
367 .Sh "Note"
368
369
370 You can have a mixture of files show up as "has been updated" and "is still dirty in the working directory" together\&. You can always tell which file is in which state, since the "has been updated" ones show a valid sha1, and the "not in sync with the index" ones will always have the special all\-zero sha1\&.
371
372 .RE
373
374 .SH "AUTHOR"
375
376
377 Written by Linus Torvalds <torvalds@osdl\&.org>
378
379 .SH "DOCUMENTATION"
380
381
382 Documentation by David Greaves, Junio C Hamano and the git\-list <git@vger\&.kernel\&.org>\&.
383
384 .SH "GIT"
385
386
387 Part of the \fBgit\fR(7) suite
388