git-diff-stages [<common diff options>] <stage1> <stage2> [<path>…]
Compares the content and mode of the blobs in two stages in an
unmerged index file.
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) a space.
(10) status, followed by optional "score" number.
(11) a tab or a NUL when '-z' option is used.
(12) path for "src"
(13) a tab or a NUL when '-z' option is used; only exists for C or R.
(14) path for "dst"; only exists for C or R.
(15) 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
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".
-
When the environment variable GIT_EXTERNAL_DIFF is not set,
these commands internally invoke "diff" like this:
diff -L a/<path> -L b/<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)
-
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>.
What -p option produces is slightly different from the
traditional diff format.
(1) It is preceeded with a "git diff" header, that looks like
this:
diff --git a/file1 b/file2
The a/ and b/ filenames are the same unless rename/copy is
involved. Especially, even for a creation or a deletion,
/dev/null is _not_ used in place of a/ or b/ filename.
When rename/copy is involved, file1 and file2 shows the
name of the source file of the rename/copy and the name of
the file that rename/copy produces, respectively.
(2) It is followed by extended header lines that are one or
more of:
old mode <mode>
new mode <mode>
deleted file mode <mode>
new file mode <mode>
copy from <path>
copy to <path>
rename from <path>
rename to <path>
similarity index <number>
dissimilarity index <number>
Written by Junio C Hamano <junkio@cox.net>
Documentation by Junio C Hamano.