1The output format from "git-diff-index", "git-diff-tree", 2"git-diff-files" and "git diff --raw" are very similar. 3 4These commands all compare two sets of things; what is 5compared differs: 6 7git-diff-index <tree-ish>:: 8 compares the <tree-ish> and the files on the filesystem. 9 10git-diff-index --cached <tree-ish>:: 11 compares the <tree-ish> and the index. 12 13git-diff-tree [-r] <tree-ish-1> <tree-ish-2> [<pattern>...]:: 14 compares the trees named by the two arguments. 15 16git-diff-files [<pattern>...]:: 17 compares the index and the files on the filesystem. 18 19 20An output line is formatted this way: 21 22------------------------------------------------ 23in-place edit :100644 100644 bcd1234... 0123456... M file0 24copy-edit :100644 100644 abcd123... 1234567... C68 file1 file2 25rename-edit :100644 100644 abcd123... 1234567... R86 file1 file3 26create :000000 100644 0000000... 1234567... A file4 27delete :100644 000000 1234567... 0000000... D file5 28unmerged :000000 000000 0000000... 0000000... U file6 29------------------------------------------------ 30 31That is, from the left to the right: 32 33. a colon. 34. mode for "src"; 000000 if creation or unmerged. 35. a space. 36. mode for "dst"; 000000 if deletion or unmerged. 37. a space. 38. sha1 for "src"; 0\{40\} if creation or unmerged. 39. a space. 40. sha1 for "dst"; 0\{40\} if creation, unmerged or "look at work tree". 41. a space. 42. status, followed by optional "score" number. 43. a tab or a NUL when '-z' option is used. 44. path for "src" 45. a tab or a NUL when '-z' option is used; only exists for C or R. 46. path for "dst"; only exists for C or R. 47. an LF or a NUL when '-z' option is used, to terminate the record. 48 49<sha1> is shown as all 0's if a file is new on the filesystem 50and it is out of sync with the index. 51 52Example: 53 54------------------------------------------------ 55:100644 100644 5be4a4...... 000000...... M file.c 56------------------------------------------------ 57 58When `-z` option is not used, TAB, LF, and backslash characters 59in pathnames are represented as `\t`, `\n`, and `\\`, 60respectively. 61 62diff format for merges 63---------------------- 64 65"git-diff-tree", "git-diff-files" and "git-diff --raw" 66can take '-c' or '--cc' option 67to generate diff output also for merge commits. The output differs 68from the format described above in the following way: 69 70. there is a colon for each parent 71. there are more "src" modes and "src" sha1 72. status is concatenated status characters for each parent 73. no optional "score" number 74. single path, only for "dst" 75 76Example: 77 78------------------------------------------------ 79::100644 100644 100644 fabadb8... cc95eb0... 4866510... MM describe.c 80------------------------------------------------ 81 82Note that 'combined diff' lists only files which were modified from 83all parents. 84 85 86include::diff-generate-patch.txt[] 87 88 89other diff formats 90------------------ 91 92The `--summary` option describes newly added, deleted, renamed and 93copied files. The `--stat` option adds diffstat(1) graph to the 94output. These options can be combined with other options, such as 95`-p`, and are meant for human consumption. 96 97When showing a change that involves a rename or a copy, `--stat` output 98formats the pathnames compactly by combining common prefix and suffix of 99the pathnames. For example, a change that moves `arch/i386/Makefile` to 100`arch/x86/Makefile` while modifying 4 lines will be shown like this: 101 102------------------------------------ 103arch/{i386 => x86}/Makefile | 4 +-- 104------------------------------------ 105 106The `--numstat` option gives the diffstat(1) information but is designed 107for easier machine consumption. An entry in `--numstat` output looks 108like this: 109 110---------------------------------------- 1111 2 README 1123 1 arch/{i386 => x86}/Makefile 113---------------------------------------- 114 115That is, from left to right: 116 117. the number of added lines; 118. a tab; 119. the number of deleted lines; 120. a tab; 121. pathname (possibly with rename/copy information); 122. a newline. 123 124When `-z` output option is in effect, the output is formatted this way: 125 126---------------------------------------- 1271 2 README NUL 1283 1 NUL arch/i386/Makefile NUL arch/x86/Makefile NUL 129---------------------------------------- 130 131That is: 132 133. the number of added lines; 134. a tab; 135. the number of deleted lines; 136. a tab; 137. a NUL (only exists if renamed/copied); 138. pathname in preimage; 139. a NUL (only exists if renamed/copied); 140. pathname in postimage (only exists if renamed/copied); 141. a NUL. 142 143The extra `NUL` before the preimage path in renamed case is to allow 144scripts that read the output to tell if the current record being read is 145a single-path record or a rename/copy record without reading ahead. 146After reading added and deleted lines, reading up to `NUL` would yield 147the pathname, but if that is `NUL`, the record will show two paths.