summaryrefslogtreecommitdiffstats
path: root/gitdiffcore.html
diff options
context:
space:
mode:
authorJunio C Hamano <junio@hera.kernel.org>2008-06-06 22:50:53 +0000
committerJunio C Hamano <junio@hera.kernel.org>2008-06-06 22:50:53 +0000
commitf7c042d91f834c0648b5ca3ebf1ef6d0cdc1e36d (patch)
treec337e9562caa23656a3771abad8b5cbc7288ba0e /gitdiffcore.html
parent14ccc607126490ca7c19d8fedf5c3c97ea4c8ffb (diff)
downloadgit-htmldocs-f7c042d91f834c0648b5ca3ebf1ef6d0cdc1e36d.tar.gz
Autogenerated HTML docs for v1.5.6-rc1-21-g03300
Diffstat (limited to 'gitdiffcore.html')
-rw-r--r--gitdiffcore.html575
1 files changed, 575 insertions, 0 deletions
diff --git a/gitdiffcore.html b/gitdiffcore.html
new file mode 100644
index 000000000..f29b5b572
--- /dev/null
+++ b/gitdiffcore.html
@@ -0,0 +1,575 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+ "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<meta name="generator" content="AsciiDoc 7.0.2" />
+<style type="text/css">
+/* Debug borders */
+p, li, dt, dd, div, pre, h1, h2, h3, h4, h5, h6 {
+/*
+ border: 1px solid red;
+*/
+}
+
+body {
+ margin: 1em 5% 1em 5%;
+}
+
+a { color: blue; }
+a:visited { color: fuchsia; }
+
+em {
+ font-style: italic;
+}
+
+strong {
+ font-weight: bold;
+}
+
+tt {
+ color: navy;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ color: #527bbd;
+ font-family: sans-serif;
+ margin-top: 1.2em;
+ margin-bottom: 0.5em;
+ line-height: 1.3;
+}
+
+h1 {
+ border-bottom: 2px solid silver;
+}
+h2 {
+ border-bottom: 2px solid silver;
+ padding-top: 0.5em;
+}
+
+div.sectionbody {
+ font-family: serif;
+ margin-left: 0;
+}
+
+hr {
+ border: 1px solid silver;
+}
+
+p {
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+}
+
+pre {
+ padding: 0;
+ margin: 0;
+}
+
+span#author {
+ color: #527bbd;
+ font-family: sans-serif;
+ font-weight: bold;
+ font-size: 1.2em;
+}
+span#email {
+}
+span#revision {
+ font-family: sans-serif;
+}
+
+div#footer {
+ font-family: sans-serif;
+ font-size: small;
+ border-top: 2px solid silver;
+ padding-top: 0.5em;
+ margin-top: 4.0em;
+}
+div#footer-text {
+ float: left;
+ padding-bottom: 0.5em;
+}
+div#footer-badges {
+ float: right;
+ padding-bottom: 0.5em;
+}
+
+div#preamble,
+div.tableblock, div.imageblock, div.exampleblock, div.verseblock,
+div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
+div.admonitionblock {
+ margin-right: 10%;
+ margin-top: 1.5em;
+ margin-bottom: 1.5em;
+}
+div.admonitionblock {
+ margin-top: 2.5em;
+ margin-bottom: 2.5em;
+}
+
+div.content { /* Block element content. */
+ padding: 0;
+}
+
+/* Block element titles. */
+div.title, caption.title {
+ font-family: sans-serif;
+ font-weight: bold;
+ text-align: left;
+ margin-top: 1.0em;
+ margin-bottom: 0.5em;
+}
+div.title + * {
+ margin-top: 0;
+}
+
+td div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content + div.title {
+ margin-top: 0.0em;
+}
+
+div.sidebarblock > div.content {
+ background: #ffffee;
+ border: 1px solid silver;
+ padding: 0.5em;
+}
+
+div.listingblock > div.content {
+ border: 1px solid silver;
+ background: #f4f4f4;
+ padding: 0.5em;
+}
+
+div.quoteblock > div.content {
+ padding-left: 2.0em;
+}
+div.quoteblock .attribution {
+ text-align: right;
+}
+
+div.admonitionblock .icon {
+ vertical-align: top;
+ font-size: 1.1em;
+ font-weight: bold;
+ text-decoration: underline;
+ color: #527bbd;
+ padding-right: 0.5em;
+}
+div.admonitionblock td.content {
+ padding-left: 0.5em;
+ border-left: 2px solid silver;
+}
+
+div.exampleblock > div.content {
+ border-left: 2px solid silver;
+ padding: 0.5em;
+}
+
+div.verseblock div.content {
+ white-space: pre;
+}
+
+div.imageblock div.content { padding-left: 0; }
+div.imageblock img { border: 1px solid silver; }
+span.image img { border-style: none; }
+
+dl {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+dt {
+ margin-top: 0.5em;
+ margin-bottom: 0;
+ font-style: italic;
+}
+dd > *:first-child {
+ margin-top: 0;
+}
+
+ul, ol {
+ list-style-position: outside;
+}
+ol.olist2 {
+ list-style-type: lower-alpha;
+}
+
+div.tableblock > table {
+ border-color: #527bbd;
+ border-width: 3px;
+}
+thead {
+ font-family: sans-serif;
+ font-weight: bold;
+}
+tfoot {
+ font-weight: bold;
+}
+
+div.hlist {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+td.hlist1 {
+ vertical-align: top;
+ font-style: italic;
+ padding-right: 0.8em;
+}
+td.hlist2 {
+ vertical-align: top;
+}
+
+@media print {
+ div#footer-badges { display: none; }
+}
+include::./stylesheets/xhtml11-manpage.css[]
+/* Workarounds for IE6's broken and incomplete CSS2. */
+
+div.sidebar-content {
+ background: #ffffee;
+ border: 1px solid silver;
+ padding: 0.5em;
+}
+div.sidebar-title, div.image-title {
+ font-family: sans-serif;
+ font-weight: bold;
+ margin-top: 0.0em;
+ margin-bottom: 0.5em;
+}
+
+div.listingblock div.content {
+ border: 1px solid silver;
+ background: #f4f4f4;
+ padding: 0.5em;
+}
+
+div.quoteblock-content {
+ padding-left: 2.0em;
+}
+
+div.exampleblock-content {
+ border-left: 2px solid silver;
+ padding-left: 0.5em;
+}
+</style>
+<title>gitdiffcore(7)</title>
+</head>
+<body>
+<div id="header">
+<h1>
+gitdiffcore(7) Manual Page
+</h1>
+<h2>NAME</h2>
+<div class="sectionbody">
+<p>gitdiffcore -
+ Tweaking diff output (June 2005)
+</p>
+</div>
+</div>
+<h2>SYNOPSIS</h2>
+<div class="sectionbody">
+<p>git diff *</p>
+</div>
+<h2>DESCRIPTION</h2>
+<div class="sectionbody">
+<p>The diff commands git-diff-index, git-diff-files, and git-diff-tree
+can be told to manipulate differences they find in
+unconventional ways before showing diff(1) output. The manipulation
+is collectively called "diffcore transformation". This short note
+describes what they are and how to use them to produce diff outputs
+that are easier to understand than the conventional kind.</p>
+</div>
+<h2>The chain of operation</h2>
+<div class="sectionbody">
+<p>The git-diff-* family works by first comparing two sets of
+files:</p>
+<ul>
+<li>
+<p>
+git-diff-index compares contents of a "tree" object and the
+ working directory (when <em>--cached</em> flag is not used) or a
+ "tree" object and the index file (when <em>--cached</em> flag is
+ used);
+</p>
+</li>
+<li>
+<p>
+git-diff-files compares contents of the index file and the
+ working directory;
+</p>
+</li>
+<li>
+<p>
+git-diff-tree compares contents of two "tree" objects;
+</p>
+</li>
+</ul>
+<p>In all of these cases, the commands themselves compare
+corresponding paths in the two sets of files. The result of
+comparison is passed from these commands to what is internally
+called "diffcore", in a format similar to what is output when
+the -p option is not used. E.g.</p>
+<div class="listingblock">
+<div class="content">
+<pre><tt>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</tt></pre>
+</div></div>
+<p>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:</p>
+<ul>
+<li>
+<p>
+diffcore-pathspec
+</p>
+</li>
+<li>
+<p>
+diffcore-break
+</p>
+</li>
+<li>
+<p>
+diffcore-rename
+</p>
+</li>
+<li>
+<p>
+diffcore-merge-broken
+</p>
+</li>
+<li>
+<p>
+diffcore-pickaxe
+</p>
+</li>
+<li>
+<p>
+diffcore-order
+</p>
+</li>
+</ul>
+<p>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
+diff-patch format.</p>
+</div>
+<h2>diffcore-pathspec: For Ignoring Files Outside Our Consideration</h2>
+<div class="sectionbody">
+<p>The first transformation in the chain is diffcore-pathspec, and
+is controlled by giving the pathname parameters to the
+git-diff-* commands on the command line. The pathspec is used
+to limit the world diff operates in. It removes the filepairs
+outside the specified set of pathnames. E.g. If the input set
+of filepairs included:</p>
+<div class="listingblock">
+<div class="content">
+<pre><tt>:100644 100644 bcd1234... 0123456... M junkfile</tt></pre>
+</div></div>
+<p>but the command invocation was "git-diff-files myfile", then the
+junkfile entry would be removed from the list because only "myfile"
+is under consideration.</p>
+<p>Implementation note. For performance reasons, git-diff-tree
+uses the pathname parameters on the command line to cull set of
+filepairs it feeds the diffcore mechanism itself, and does not
+use diffcore-pathspec, but the end result is the same.</p>
+</div>
+<h2>diffcore-break: For Splitting Up "Complete Rewrites"</h2>
+<div class="sectionbody">
+<p>The second transformation in the chain is diffcore-break, and is
+controlled by the -B option to the git-diff-* commands. This is
+used to detect a filepair that represents "complete rewrite" and
+break such filepair into two filepairs that represent delete and
+create. E.g. If the input contained this filepair:</p>
+<div class="listingblock">
+<div class="content">
+<pre><tt>:100644 100644 bcd1234... 0123456... M file0</tt></pre>
+</div></div>
+<p>and if it detects that the file "file0" is completely rewritten,
+it changes it to:</p>
+<div class="listingblock">
+<div class="content">
+<pre><tt>:100644 000000 bcd1234... 0000000... D file0
+:000000 100644 0000000... 0123456... A file0</tt></pre>
+</div></div>
+<p>For the purpose of breaking a filepair, diffcore-break examines
+the extent of changes between the contents of the files before
+and after modification (i.e. the contents that have "bcd1234&#8230;"
+and "0123456&#8230;" as their SHA1 content ID, in the above
+example). The amount of deletion of original contents and
+insertion of new material are added together, and if it exceeds
+the "break score", the filepair is broken into two. The break
+score defaults to 50% of the size of the smaller of the original
+and the result (i.e. if the edit shrinks the file, the size of
+the result is used; if the edit lengthens the file, the size of
+the original is used), and can be customized by giving a number
+after "-B" option (e.g. "-B75" to tell it to use 75%).</p>
+</div>
+<h2>diffcore-rename: For Detection Renames and Copies</h2>
+<div class="sectionbody">
+<p>This transformation is used to detect renames and copies, and is
+controlled by the -M option (to detect renames) and the -C option
+(to detect copies as well) to the git-diff-* commands. If the
+input contained these filepairs:</p>
+<div class="listingblock">
+<div class="content">
+<pre><tt>:100644 000000 0123456... 0000000... D fileX
+:000000 100644 0000000... 0123456... A file0</tt></pre>
+</div></div>
+<p>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:</p>
+<div class="listingblock">
+<div class="content">
+<pre><tt>:100644 100644 0123456... 0123456... R100 fileX file0</tt></pre>
+</div></div>
+<p>When the "-C" option is used, the original contents of modified files,
+and deleted files (and also unmodified files, if the
+"--find-copies-harder" option is used) are considered as candidates
+of the source files in rename/copy operation. If the input were like
+these filepairs, that talk about a modified file fileY and a newly
+created file file0:</p>
+<div class="listingblock">
+<div class="content">
+<pre><tt>:100644 100644 0123456... 1234567... M fileY
+:000000 100644 0000000... bcd3456... A file0</tt></pre>
+</div></div>
+<p>the original contents of fileY and the resulting contents of
+file0 are compared, and if they are similar enough, they are
+changed to:</p>
+<div class="listingblock">
+<div class="content">
+<pre><tt>:100644 100644 0123456... 1234567... M fileY
+:100644 100644 0123456... bcd3456... C100 fileY file0</tt></pre>
+</div></div>
+<p>In both rename and copy detection, the same "extent of changes"
+algorithm used in diffcore-break is used to determine if two
+files are "similar enough", and can be customized to use
+a similarity score different from the default of 50% by giving a
+number after the "-M" or "-C" option (e.g. "-M8" to tell it to use
+8/10 = 80%).</p>
+<p>Note. When the "-C" option is used with <tt>--find-copies-harder</tt>
+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 <tt>--find-copies-harder</tt>,
+git-diff-* commands can detect copies only if the file that was
+copied happened to have been modified in the same changeset.</p>
+</div>
+<h2>diffcore-merge-broken: For Putting "Complete Rewrites" Back Together</h2>
+<div class="sectionbody">
+<p>This transformation is used to merge filepairs broken by
+diffcore-break, and not transformed into rename/copy by
+diffcore-rename, back into a single modification. This always
+runs when diffcore-break is used.</p>
+<p>For the purpose of merging broken filepairs back, it uses a
+different "extent of changes" computation from the ones used by
+diffcore-break and diffcore-rename. It counts only the deletion
+from the original, and does not count insertion. If you removed
+only 10 lines from a 100-line document, even if you added 910
+new lines to make a new 1000-line document, you did not do a
+complete rewrite. diffcore-break breaks such a case in order to
+help diffcore-rename to consider such filepairs as candidate of
+rename/copy detection, but if filepairs broken that way were not
+matched with other filepairs to create rename/copy, then this
+transformation merges them back into the original
+"modification".</p>
+<p>The "extent of changes" parameter can be tweaked from the
+default 80% (that is, unless more than 80% of the original
+material is deleted, the broken pairs are merged back into a
+single modification) by giving a second number to -B option,
+like these:</p>
+<ul>
+<li>
+<p>
+-B50/60 (give 50% "break score" to diffcore-break, use 60%
+ for diffcore-merge-broken).
+</p>
+</li>
+<li>
+<p>
+-B/60 (the same as above, since diffcore-break defaults to 50%).
+</p>
+</li>
+</ul>
+<p>Note that earlier implementation left a broken pair as a separate
+creation and deletion patches. This was an unnecessary hack and
+the latest implementation always merges all the broken pairs
+back into modifications, but the resulting patch output is
+formatted differently for easier review in case of such
+a complete rewrite by showing the entire contents of old version
+prefixed with <em>-</em>, followed by the entire contents of new
+version prefixed with <em>+</em>.</p>
+</div>
+<h2>diffcore-pickaxe: For Detecting Addition/Deletion of Specified String</h2>
+<div class="sectionbody">
+<p>This transformation is used to find filepairs that represent
+changes that touch a specified string, and is controlled by the
+-S option and the <tt>--pickaxe-all</tt> option to the git-diff-*
+commands.</p>
+<p>When diffcore-pickaxe is in use, it checks if there are
+filepairs whose "original" side has the specified string and
+whose "result" side does not. Such a filepair represents "the
+string appeared in this changeset". It also checks for the
+opposite case that loses the specified string.</p>
+<p>When <tt>--pickaxe-all</tt> is not in effect, diffcore-pickaxe leaves
+only such filepairs that touch the specified string in its
+output. When <tt>--pickaxe-all</tt> is used, diffcore-pickaxe leaves all
+filepairs intact if there is such a filepair, or makes the
+output empty otherwise. The latter behaviour is designed to
+make reviewing of the changes in the context of the whole
+changeset easier.</p>
+</div>
+<h2>diffcore-order: For Sorting the Output Based on Filenames</h2>
+<div class="sectionbody">
+<p>This is used to reorder the filepairs according to the user's
+(or project's) taste, and is controlled by the -O option to the
+git-diff-* commands.</p>
+<p>This takes a text file each of whose lines is a shell glob
+pattern. Filepairs that match a glob pattern on an earlier line
+in the file are output before ones that match a later line, and
+filepairs that do not match any glob pattern are output last.</p>
+<p>As an example, a typical orderfile for the core git probably
+would look like this:</p>
+<div class="listingblock">
+<div class="content">
+<pre><tt>README
+Makefile
+Documentation
+*.h
+*.c
+t</tt></pre>
+</div></div>
+</div>
+<h2>SEE ALSO</h2>
+<div class="sectionbody">
+<p><a href="git-diff.html">git-diff(1)</a>,
+<a href="git-diff-files.html">git-diff-files(1)</a>,
+<a href="git-diff-index.html">git-diff-index(1)</a>,
+<a href="git-diff-tree.html">git-diff-tree(1)</a>,
+<a href="git-format-patch.html">git-format-patch(1)</a>,
+<a href="git-log.html">git-log(1)</a>,
+<a href="gitglossary.html">gitglossary(7)</a>,
+<a href="user-manual.html">The Git User's Manual</a></p>
+</div>
+<h2>GIT</h2>
+<div class="sectionbody">
+<p>Part of the <a href="git.html">git(1)</a> suite.</p>
+</div>
+<div id="footer">
+<div id="footer-text">
+Last updated 06-Jun-2008 22:46:14 UTC
+</div>
+</div>
+</body>
+</html>