diff-format.txt 5.44 KB
Newer Older
1 2 3 4
Raw output format
-----------------

The raw output format from "git-diff-index", "git-diff-tree",
5
"git-diff-files" and "git diff --raw" are very similar.
6

Junio C Hamano's avatar
Junio C Hamano committed
7
These commands all compare two sets of things; what is
8
compared differs:
9

Junio C Hamano's avatar
Junio C Hamano committed
10
git-diff-index <tree-ish>::
11 12
        compares the <tree-ish> and the files on the filesystem.

Junio C Hamano's avatar
Junio C Hamano committed
13
git-diff-index --cached <tree-ish>::
14
        compares the <tree-ish> and the index.
15 16 17 18 19

git-diff-tree [-r] <tree-ish-1> <tree-ish-2> [<pattern>...]::
        compares the trees named by the two arguments.

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 24
what is being compared. After that, all the commands print one output
line per changed file.
25

26
An output line is formatted this way:
27

Junio C Hamano's avatar
Junio C Hamano committed
28
------------------------------------------------
29 30 31
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
Junio C Hamano's avatar
Junio C Hamano committed
32
create         :000000 100644 0000000... 1234567... A file4
33 34
delete         :100644 000000 1234567... 0000000... D file5
unmerged       :000000 000000 0000000... 0000000... U file6
Junio C Hamano's avatar
Junio C Hamano committed
35
------------------------------------------------
36 37 38

That is, from the left to the right:

Junio C Hamano's avatar
Junio C Hamano committed
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
. a colon.
. mode for "src"; 000000 if creation or unmerged.
. a space.
. mode for "dst"; 000000 if deletion or unmerged.
. a space.
. sha1 for "src"; 0\{40\} if creation or unmerged.
. a space.
. sha1 for "dst"; 0\{40\} if creation, unmerged or "look at work tree".
. a space.
. status, followed by optional "score" number.
. a tab or a NUL when '-z' option is used.
. path for "src"
. a tab or a NUL when '-z' option is used; only exists for C or R.
. path for "dst"; only exists for C or R.
. an LF or a NUL when '-z' option is used, to terminate the record.
54

55 56 57 58 59 60 61 62 63 64 65 66
Possible status letters are:

- A: addition of a file
- C: copy of a file into a new one
- D: deletion of a file
- M: modification of the contents or mode of a file
- R: renaming of a file
- T: change in the type of the file
- U: file is unmerged (you must complete the merge before it can
be committed)
- X: "unknown" change type (most probably a bug, please report it)

67
Status letters C and R are always followed by a score (denoting the
68 69 70
percentage of similarity between the source and target of the move or
copy), and are the only ones to be so.

71
<sha1> is shown as all 0's if a file is new on the filesystem
72
and it is out of sync with the index.
73

Junio C Hamano's avatar
Junio C Hamano committed
74 75 76 77 78
Example:

------------------------------------------------
:100644 100644 5be4a4...... 000000...... M file.c
------------------------------------------------
79

80 81 82 83
When `-z` option is not used, TAB, LF, and backslash characters
in pathnames are represented as `\t`, `\n`, and `\\`,
respectively.

84 85 86
diff format for merges
----------------------

87 88
"git-diff-tree", "git-diff-files" and "git-diff --raw"
can take '-c' or '--cc' option
89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
to generate diff output also for merge commits.  The output differs
from the format described above in the following way:

. there is a colon for each parent
. there are more "src" modes and "src" sha1
. status is concatenated status characters for each parent
. no optional "score" number
. single path, only for "dst"

Example:

------------------------------------------------
::100644 100644 100644 fabadb8... cc95eb0... 4866510... MM	describe.c
------------------------------------------------

Note that 'combined diff' lists only files which were modified from
all parents.

107

108
include::diff-generate-patch.txt[]
109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169


other diff formats
------------------

The `--summary` option describes newly added, deleted, renamed and
copied files.  The `--stat` option adds diffstat(1) graph to the
output.  These options can be combined with other options, such as
`-p`, and are meant for human consumption.

When showing a change that involves a rename or a copy, `--stat` output
formats the pathnames compactly by combining common prefix and suffix of
the pathnames.  For example, a change that moves `arch/i386/Makefile` to
`arch/x86/Makefile` while modifying 4 lines will be shown like this:

------------------------------------
arch/{i386 => x86}/Makefile    |   4 +--
------------------------------------

The `--numstat` option gives the diffstat(1) information but is designed
for easier machine consumption.  An entry in `--numstat` output looks
like this:

----------------------------------------
1	2	README
3	1	arch/{i386 => x86}/Makefile
----------------------------------------

That is, from left to right:

. the number of added lines;
. a tab;
. the number of deleted lines;
. a tab;
. pathname (possibly with rename/copy information);
. a newline.

When `-z` output option is in effect, the output is formatted this way:

----------------------------------------
1	2	README NUL
3	1	NUL arch/i386/Makefile NUL arch/x86/Makefile NUL
----------------------------------------

That is:

. the number of added lines;
. a tab;
. the number of deleted lines;
. a tab;
. a NUL (only exists if renamed/copied);
. pathname in preimage;
. a NUL (only exists if renamed/copied);
. pathname in postimage (only exists if renamed/copied);
. a NUL.

The extra `NUL` before the preimage path in renamed case is to allow
scripts that read the output to tell if the current record being read is
a single-path record or a rename/copy record without reading ahead.
After reading added and deleted lines, reading up to `NUL` would yield
the pathname, but if that is `NUL`, the record will show two paths.