files:
- git-diff-cache compares contents of a "tree" object and the
- working directory (when --cached flag is not used) or a
- "tree" object and the index file (when --cached flag is
+ working directory (when '--cached' flag is not used) or a
+ "tree" object and the index file (when '--cached' flag is
used);
- git-diff-files compares contents of the index file and the
called "diffcore", in a format similar to what is output when
the -p option is not used. E.g.
- in-place edit :100644 100644 bcd1234... 0123456... M file0
- create :000000 100644 0000000... 1234567... N file4
- delete :100644 000000 1234567... 0000000... D file5
- unmerged :000000 000000 0000000... 0000000... U file6
+------------------------------------------------
+in-place edit :100644 100644 bcd1234... 0123456... M file0
+create :000000 100644 0000000... 1234567... A file4
+delete :100644 000000 1234567... 0000000... D file5
+unmerged :000000 000000 0000000... 0000000... U file6
+------------------------------------------------
The diffcore mechanism is fed a list of such comparison results
(each of which is called "filepair", although at this point each
of them talks about a single file), and transforms such a list
into another list. There are currently 6 such transformations:
- - diffcore-pathspec
- - diffcore-break
- - diffcore-rename
- - diffcore-merge-broken
- - diffcore-pickaxe
- - diffcore-order
+- diffcore-pathspec
+- diffcore-break
+- diffcore-rename
+- diffcore-merge-broken
+- diffcore-pickaxe
+- diffcore-order
-These are applied in sequence. The set of filepairs git-diff-*
+These are applied in sequence. The set of filepairs git-diff-\*
commands find are used as the input to diffcore-pathspec, and
the output from diffcore-pathspec is used as the input to the
next transformation. The final result is then passed to the
output routine and generates either diff-raw format (see Output
-format sections of the manual for git-diff-* commands) or
+format sections of the manual for git-diff-\* commands) or
diff-patch format.
break such filepair into two filepairs that represent delete and
create. E.g. If the input contained this filepair:
- :100644 100644 bcd1234... 0123456... M file0
+------------------------------------------------
+:100644 100644 bcd1234... 0123456... M file0
+------------------------------------------------
and if it detects that the file "file0" is completely rewritten,
it changes it to:
- :100644 000000 bcd1234... 0000000... D file0
- :000000 100644 0000000... 0123456... N file0
+------------------------------------------------
+:100644 000000 bcd1234... 0000000... D file0
+:000000 100644 0000000... 0123456... A file0
+------------------------------------------------
For the purpose of breaking a filepair, diffcore-break examines
the extent of changes between the contents of the files before
(to detect copies as well) to the git-diff-* commands. If the
input contained these filepairs:
- :100644 000000 0123456... 0000000... D fileX
- :000000 100644 0000000... 0123456... N file0
+------------------------------------------------
+:100644 000000 0123456... 0000000... D fileX
+:000000 100644 0000000... 0123456... A file0
+------------------------------------------------
and the contents of the deleted file fileX is similar enough to
the contents of the created file file0, then rename detection
merges these filepairs and creates:
- :100644 100644 0123456... 0123456... R100 fileX file0
+------------------------------------------------
+:100644 100644 0123456... 0123456... R100 fileX file0
+------------------------------------------------
When the "-C" option is used, the original contents of modified
files and contents of unchanged files are considered as
filepairs, that talk about a modified file fileY and a newly
created file file0:
- :100644 100644 0123456... 1234567... M fileY
- :000000 100644 0000000... 0123456... N file0
+------------------------------------------------
+:100644 100644 0123456... 1234567... M fileY
+:000000 100644 0000000... 0123456... A file0
+------------------------------------------------
the original contents of fileY and the resulting contents of
file0 are compared, and if they are similar enough, they are
changed to:
- :100644 100644 0123456... 1234567... M fileY
- :100644 100644 0123456... 0123456... C100 fileY file0
+------------------------------------------------
+:100644 100644 0123456... 1234567... M fileY
+:100644 100644 0123456... 0123456... C100 fileY file0
+------------------------------------------------
In both rename and copy detection, the same "extent of changes"
algorithm used in diffcore-break is used to determine if two
number after "-M" or "-C" option (e.g. "-M8" to tell it to use
8/10 = 80%).
-Note. When the "-C" option is used, git-diff-cache and
-git-diff-file commands feed not just modified filepairs but
-unmodified ones to diffcore mechanism as well. This lets the
-copy detector consider unmodified files as copy source
-candidates at the expense of making it slower. Currently
-git-diff-tree does not feed unmodified filepairs even when the
-"-C" option is used, so it can detect copies only if the file
-that was copied happened to have been modified in the same
-changeset.
+Note. When the "-C" option is used with --find-copies-harder
+option, git-diff-\* commands feed unmodified filepairs to
+diffcore mechanism as well as modified ones. This lets the copy
+detector consider unmodified files as copy source candidates at
+the expense of making it slower. Without --find-copies-harder,
+git-diff-\* commands can detect copies only if the file that was
+copied happened to have been modified in the same changeset.
diffcore-merge-broken
single modification) by giving a second number to -B option,
like these:
- -B50/60 (give 50% "break score" to diffcore-break, use
- 60% for diffcore-merge-broken).
- -B/60 (the same as above, since diffcore-break defautls to
- 50%).
+* -B50/60 (give 50% "break score" to diffcore-break, use 60%
+ for diffcore-merge-broken).
+
+* -B/60 (the same as above, since diffcore-break defaults to 50%).
+
+Note that earlier implementation left a broken pair as a separate
+creation and deletion patches. This was unnecessary hack and
+the latest implementation always merges all the broken pairs
+back into modifications, but the resulting patch output is
+formatted differently to still let the reviewing easier for such
+a complete rewrite by showing the entire contents of old version
+prefixed with '-', followed by the entire contents of new
+version prefixed with '+'.
diffcore-pickaxe
filepairs that do not match any glob pattern are output last.
As an example, typical orderfile for the core GIT probably
-should look like this:
+would look like this:
+------------------------------------------------
README
Makefile
Documentation
*.h
*.c
t
+------------------------------------------------