trailer: use size_t for string offsets
[git] / Documentation / diff-format.txt
1 Raw output format
2 -----------------
3
4 The raw output format from "git-diff-index", "git-diff-tree",
5 "git-diff-files" and "git diff --raw" are very similar.
6
7 These commands all compare two sets of things; what is
8 compared 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
22 The "git-diff-tree" command begins its output by printing the hash of
23 what is being compared. After that, all the commands print one output
24 line per changed file.
25
26 An output line is formatted this way:
27
28 ------------------------------------------------
29 in-place edit  :100644 100644 bcd1234... 0123456... M file0
30 copy-edit      :100644 100644 abcd123... 1234567... C68 file1 file2
31 rename-edit    :100644 100644 abcd123... 1234567... R86 file1 file3
32 create         :000000 100644 0000000... 1234567... A file4
33 delete         :100644 000000 1234567... 0000000... D file5
34 unmerged       :000000 000000 0000000... 0000000... U file6
35 ------------------------------------------------
36
37 That 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 creation, unmerged or "look at work tree".
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
55 Possible 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
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
67 Status letters C and R are always followed by a score (denoting the
68 percentage of similarity between the source and target of the move or
69 copy).  Status letter M may be followed by a score (denoting the
70 percentage of dissimilarity) for file rewrites.
71
72 <sha1> is shown as all 0's if a file is new on the filesystem
73 and it is out of sync with the index.
74
75 Example:
76
77 ------------------------------------------------
78 :100644 100644 5be4a4...... 000000...... M file.c
79 ------------------------------------------------
80
81 Without the `-z` option, pathnames with "unusual" characters are
82 quoted as explained for the configuration variable `core.quotePath`
83 (see linkgit:git-config[1]).  Using `-z` the filename is output
84 verbatim and the line is terminated by a NUL byte.
85
86 diff format for merges
87 ----------------------
88
89 "git-diff-tree", "git-diff-files" and "git-diff --raw"
90 can take `-c` or `--cc` option
91 to generate diff output also for merge commits.  The output differs
92 from 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 . single path, only for "dst"
99
100 Example:
101
102 ------------------------------------------------
103 ::100644 100644 100644 fabadb8... cc95eb0... 4866510... MM      describe.c
104 ------------------------------------------------
105
106 Note that 'combined diff' lists only files which were modified from
107 all parents.
108
109
110 include::diff-generate-patch.txt[]
111
112
113 other diff formats
114 ------------------
115
116 The `--summary` option describes newly added, deleted, renamed and
117 copied files.  The `--stat` option adds diffstat(1) graph to the
118 output.  These options can be combined with other options, such as
119 `-p`, and are meant for human consumption.
120
121 When showing a change that involves a rename or a copy, `--stat` output
122 formats the pathnames compactly by combining common prefix and suffix of
123 the pathnames.  For example, a change that moves `arch/i386/Makefile` to
124 `arch/x86/Makefile` while modifying 4 lines will be shown like this:
125
126 ------------------------------------
127 arch/{i386 => x86}/Makefile    |   4 +--
128 ------------------------------------
129
130 The `--numstat` option gives the diffstat(1) information but is designed
131 for easier machine consumption.  An entry in `--numstat` output looks
132 like this:
133
134 ----------------------------------------
135 1       2       README
136 3       1       arch/{i386 => x86}/Makefile
137 ----------------------------------------
138
139 That is, from left to right:
140
141 . the number of added lines;
142 . a tab;
143 . the number of deleted lines;
144 . a tab;
145 . pathname (possibly with rename/copy information);
146 . a newline.
147
148 When `-z` output option is in effect, the output is formatted this way:
149
150 ----------------------------------------
151 1       2       README NUL
152 3       1       NUL arch/i386/Makefile NUL arch/x86/Makefile NUL
153 ----------------------------------------
154
155 That is:
156
157 . the number of added lines;
158 . a tab;
159 . the number of deleted lines;
160 . a tab;
161 . a NUL (only exists if renamed/copied);
162 . pathname in preimage;
163 . a NUL (only exists if renamed/copied);
164 . pathname in postimage (only exists if renamed/copied);
165 . a NUL.
166
167 The extra `NUL` before the preimage path in renamed case is to allow
168 scripts that read the output to tell if the current record being read is
169 a single-path record or a rename/copy record without reading ahead.
170 After reading added and deleted lines, reading up to `NUL` would yield
171 the pathname, but if that is `NUL`, the record will show two paths.