| The output format from "git-diff-cache", "git-diff-tree" and | 
 | "git-diff-files" is very similar. | 
 |  | 
 | These commands all compare two sets of things; what are | 
 | compared are different: | 
 |  | 
 | git-diff-cache <tree-ish>:: | 
 |         compares the <tree-ish> and the files on the filesystem. | 
 |  | 
 | git-diff-cache --cached <tree-ish>:: | 
 |         compares the <tree-ish> and the cache. | 
 |  | 
 | git-diff-tree [-r] <tree-ish-1> <tree-ish-2> [<pattern>...]:: | 
 |         compares the trees named by the two arguments. | 
 |  | 
 | git-diff-files [<pattern>...]:: | 
 |         compares the cache and the files on the filesystem. | 
 |  | 
 |  | 
 | An output line is formatted this way: | 
 |  | 
 | in-place edit  :100644 100644 bcd1234... 0123456... M file0 | 
 | copy-edit      :100644 100644 abcd123... 1234567... C68 file1 file2 | 
 | rename-edit    :100644 100644 abcd123... 1234567... R86 file1 file3 | 
 | create         :000000 100644 0000000... 1234567... N file4 | 
 | delete         :100644 000000 1234567... 0000000... D file5 | 
 | unmerged       :000000 000000 0000000... 0000000... U file6 | 
 |  | 
 | That is, from the left to the right: | 
 |  | 
 |   (1) a colon. | 
 |   (2) mode for "src"; 000000 if creation or unmerged. | 
 |   (3) a space. | 
 |   (4) mode for "dst"; 000000 if deletion or unmerged. | 
 |   (5) a space. | 
 |   (6) sha1 for "src"; 0{40} if creation or unmerged. | 
 |   (7) a space. | 
 |   (8) sha1 for "dst"; 0{40} if creation, unmerged or "look at work tree". | 
 |   (9) status, followed by similarlity index number only for C and R. | 
 |  (10) a tab or a NUL when '-z' option is used. | 
 |  (11) path for "src" | 
 |  (12) a tab or a NUL when '-z' option is used; only exists for C or R. | 
 |  (13) path for "dst"; only exists for C or R. | 
 |  (14) an LF or a NUL when '-z' option is used, to terminate the record. | 
 |  | 
 | <sha1> is shown as all 0's if new is a file on the filesystem | 
 | and it is out of sync with the cache.  Example: | 
 |  | 
 |   :100644 100644 5be4a4...... 000000...... M file.c | 
 |  | 
 | Generating patches with -p | 
 | -------------------------- | 
 |  | 
 | When "git-diff-cache", "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. | 
 |  | 
 | The patch generation can be customized at two levels.  This | 
 | customization also applies to "git-diff-helper". | 
 |  | 
 | 1. When the environment variable 'GIT_EXTERNAL_DIFF' is not set, | 
 |    these commands internally invoke "diff" like this: | 
 |  | 
 |       diff -L a/<path> -L a/<path> -pu <old> <new> | 
 | + | 
 | For added files, `/dev/null` is used for <old>.  For removed | 
 | files, `/dev/null` is used for <new> | 
 | + | 
 | The "diff" formatting options can be customized via the | 
 | environment variable 'GIT_DIFF_OPTS'.  For example, if you | 
 | prefer context diff: | 
 |  | 
 |       GIT_DIFF_OPTS=-c git-diff-cache -p $(cat .git/HEAD) | 
 |  | 
 |  | 
 | 2. When the environment variable 'GIT_EXTERNAL_DIFF' is set, the | 
 |    program named by it is called, instead of the diff invocation | 
 |    described above. | 
 | + | 
 | For a path that is added, removed, or modified, | 
 | 'GIT_EXTERNAL_DIFF' is called with 7 parameters: | 
 |  | 
 |      path old-file old-hex old-mode new-file new-hex new-mode | 
 | + | 
 | where: | 
 |  | 
 |      <old|new>-file:: are files GIT_EXTERNAL_DIFF can use to read the | 
 | 		      contents of <old|ne>, | 
 |      <old|new>-hex:: are the 40-hexdigit SHA1 hashes, | 
 |      <old|new>-mode:: are the octal representation of the file modes. | 
 |  | 
 | +  | 
 | 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 | 
 | cache).  'GIT_EXTERNAL_DIFF' should not worry about unlinking the | 
 | temporary file --- it is removed when 'GIT_EXTERNAL_DIFF' exits. | 
 |  | 
 | For a path that is unmerged, 'GIT_EXTERNAL_DIFF' is called with 1 | 
 | parameter, <path>. |