Documentation / diff-format.txton commit Merge branch 'ab/unconditional-free-and-null' (7ae96e3)
   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
  10git-diff-index <tree-ish>::
  11        compares the <tree-ish> and the files on the filesystem.
  12
  13git-diff-index --cached <tree-ish>::
  14        compares the <tree-ish> and the index.
  15
  16git-diff-tree [-r] <tree-ish-1> <tree-ish-2> [<pattern>...]::
  17        compares the trees named by the two arguments.
  18
  19git-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 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
  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
  63- U: file is unmerged (you must complete the merge before it can
  64be 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
  72<sha1> is shown as all 0's if a file is new on the filesystem
  73and it is out of sync with the index.
  74
  75Example:
  76
  77------------------------------------------------
  78:100644 100644 5be4a4...... 000000...... 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. single path, only for "dst"
  99
 100Example:
 101
 102------------------------------------------------
 103::100644 100644 100644 fabadb8... cc95eb0... 4866510... MM      describe.c
 104------------------------------------------------
 105
 106Note that 'combined diff' lists only files which were modified from
 107all parents.
 108
 109
 110include::diff-generate-patch.txt[]
 111
 112
 113other diff formats
 114------------------
 115
 116The `--summary` option describes newly added, deleted, renamed and
 117copied files.  The `--stat` option adds diffstat(1) graph to the
 118output.  These options can be combined with other options, such as
 119`-p`, and are meant for human consumption.
 120
 121When showing a change that involves a rename or a copy, `--stat` output
 122formats the pathnames compactly by combining common prefix and suffix of
 123the 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------------------------------------
 127arch/{i386 => x86}/Makefile    |   4 +--
 128------------------------------------
 129
 130The `--numstat` option gives the diffstat(1) information but is designed
 131for easier machine consumption.  An entry in `--numstat` output looks
 132like this:
 133
 134----------------------------------------
 1351       2       README
 1363       1       arch/{i386 => x86}/Makefile
 137----------------------------------------
 138
 139That 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
 148When `-z` output option is in effect, the output is formatted this way:
 149
 150----------------------------------------
 1511       2       README NUL
 1523       1       NUL arch/i386/Makefile NUL arch/x86/Makefile NUL
 153----------------------------------------
 154
 155That 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
 167The extra `NUL` before the preimage path in renamed case is to allow
 168scripts that read the output to tell if the current record being read is
 169a single-path record or a rename/copy record without reading ahead.
 170After reading added and deleted lines, reading up to `NUL` would yield
 171the pathname, but if that is `NUL`, the record will show two paths.