'\" t
.\" Title: git-diff
.\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
.\" Generator: DocBook XSL Stylesheets vsnapshot
.\" Date: 01/13/2023
.\" Manual: Git Manual
.\" Source: Git 2.39.1
.\" Language: English
.\"
.TH "GIT\-DIFF" "1" "01/13/2023" "Git 2\&.39\&.1" "Git Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.\" http://bugs.debian.org/507673
.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html
.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
.\" disable hyphenation
.nh
.\" disable justification (adjust text to left margin only)
.ad l
.\" -----------------------------------------------------------------
.\" * MAIN CONTENT STARTS HERE *
.\" -----------------------------------------------------------------
.SH "NAME"
git-diff \- Show changes between commits, commit and working tree, etc
.SH "SYNOPSIS"
.sp
.nf
\fIgit diff\fR [] [] [\-\-] [\&...]
\fIgit diff\fR [] \-\-cached [\-\-merge\-base] [] [\-\-] [\&...]
\fIgit diff\fR [] [\-\-merge\-base] [\&...] [\-\-] [\&...]
\fIgit diff\fR [] \&... [\-\-] [\&...]
\fIgit diff\fR []
\fIgit diff\fR [] \-\-no\-index [\-\-]
.fi
.sp
.SH "DESCRIPTION"
.sp
Show changes between the working tree and the index or a tree, changes between the index and a tree, changes between two trees, changes resulting from a merge, changes between two blob objects, or changes between two files on disk\&.
.PP
\fIgit diff\fR [] [\-\-] [\&...]
.RS 4
This form is to view the changes you made relative to the index (staging area for the next commit)\&. In other words, the differences are what you
\fIcould\fR
tell Git to further add to the index but you still haven\(cqt\&. You can stage these changes by using
\fBgit-add\fR(1)\&.
.RE
.PP
\fIgit diff\fR [] \-\-no\-index [\-\-]
.RS 4
This form is to compare the given two paths on the filesystem\&. You can omit the
\fB\-\-no\-index\fR
option when running the command in a working tree controlled by Git and at least one of the paths points outside the working tree, or when running the command outside a working tree controlled by Git\&. This form implies
\fB\-\-exit\-code\fR\&.
.RE
.PP
\fIgit diff\fR [] \-\-cached [\-\-merge\-base] [] [\-\-] [\&...]
.RS 4
This form is to view the changes you staged for the next commit relative to the named \&. Typically you would want comparison with the latest commit, so if you do not give , it defaults to HEAD\&. If HEAD does not exist (e\&.g\&. unborn branches) and is not given, it shows all staged changes\&. \-\-staged is a synonym of \-\-cached\&.
.sp
If \-\-merge\-base is given, instead of using , use the merge base of and HEAD\&.
\fBgit diff \-\-cached \-\-merge\-base A\fR
is equivalent to
\fBgit diff \-\-cached $(git merge\-base A HEAD)\fR\&.
.RE
.PP
\fIgit diff\fR [] [\-\-merge\-base] [\-\-] [\&...]
.RS 4
This form is to view the changes you have in your working tree relative to the named \&. You can use HEAD to compare it with the latest commit, or a branch name to compare with the tip of a different branch\&.
.sp
If \-\-merge\-base is given, instead of using , use the merge base of and HEAD\&.
\fBgit diff \-\-merge\-base A\fR
is equivalent to
\fBgit diff $(git merge\-base A HEAD)\fR\&.
.RE
.PP
\fIgit diff\fR [] [\-\-merge\-base] [\-\-] [\&...]
.RS 4
This is to view the changes between two arbitrary \&.
.sp
If \-\-merge\-base is given, use the merge base of the two commits for the "before" side\&.
\fBgit diff \-\-merge\-base A B\fR
is equivalent to
\fBgit diff $(git merge\-base A B) B\fR\&.
.RE
.PP
\fIgit diff\fR [] \&... [\-\-] [\&...]
.RS 4
This form is to view the results of a merge commit\&. The first listed must be the merge itself; the remaining two or more commits should be its parents\&. Convenient ways to produce the desired set of revisions are to use the suffixes
\fB^@\fR
and
\fB^!\fR\&. If A is a merge commit, then
\fBgit diff A A^@\fR,
\fBgit diff A^!\fR
and
\fBgit show A\fR
all give the same combined diff\&.
.RE
.PP
\fIgit diff\fR [] \&.\&. [\-\-] [\&...]
.RS 4
This is synonymous to the earlier form (without the
\fB\&.\&.\fR) for viewing the changes between two arbitrary \&. If on one side is omitted, it will have the same effect as using HEAD instead\&.
.RE
.PP
\fIgit diff\fR [] \&.\&.\&. [\-\-] [\&...]
.RS 4
This form is to view the changes on the branch containing and up to the second , starting at a common ancestor of both \&.
\fBgit diff A\&.\&.\&.B\fR
is equivalent to
\fBgit diff $(git merge\-base A B) B\fR\&. You can omit any one of , which has the same effect as using HEAD instead\&.
.RE
.sp
Just in case you are doing something exotic, it should be noted that all of the in the above description, except in the \fB\-\-merge\-base\fR case and in the last two forms that use \fB\&.\&.\fR notations, can be any \&.
.sp
For a more complete list of ways to spell , see "SPECIFYING REVISIONS" section in \fBgitrevisions\fR(7)\&. However, "diff" is about comparing two \fIendpoints\fR, not ranges, and the range notations (\fB\&.\&.\fR and \fB\&.\&.\&.\fR) do not mean a range as defined in the "SPECIFYING RANGES" section in \fBgitrevisions\fR(7)\&.
.PP
\fIgit diff\fR []
.RS 4
This form is to view the differences between the raw contents of two blob objects\&.
.RE
.SH "OPTIONS"
.PP
\-p, \-u, \-\-patch
.RS 4
Generate patch (see section on generating patches)\&. This is the default\&.
.RE
.PP
\-s, \-\-no\-patch
.RS 4
Suppress diff output\&. Useful for commands like
\fBgit show\fR
that show the patch by default, or to cancel the effect of
\fB\-\-patch\fR\&.
.RE
.PP
\-U, \-\-unified=
.RS 4
Generate diffs with lines of context instead of the usual three\&. Implies
\fB\-\-patch\fR\&.
.RE
.PP
\-\-output=
.RS 4
Output to a specific file instead of stdout\&.
.RE
.PP
\-\-output\-indicator\-new=, \-\-output\-indicator\-old=, \-\-output\-indicator\-context=
.RS 4
Specify the character used to indicate new, old or context lines in the generated patch\&. Normally they are
\fI+\fR,
\fI\-\fR
and \*(Aq \*(Aq respectively\&.
.RE
.PP
\-\-raw
.RS 4
Generate the diff in raw format\&.
.RE
.PP
\-\-patch\-with\-raw
.RS 4
Synonym for
\fB\-p \-\-raw\fR\&.
.RE
.PP
\-\-indent\-heuristic
.RS 4
Enable the heuristic that shifts diff hunk boundaries to make patches easier to read\&. This is the default\&.
.RE
.PP
\-\-no\-indent\-heuristic
.RS 4
Disable the indent heuristic\&.
.RE
.PP
\-\-minimal
.RS 4
Spend extra time to make sure the smallest possible diff is produced\&.
.RE
.PP
\-\-patience
.RS 4
Generate a diff using the "patience diff" algorithm\&.
.RE
.PP
\-\-histogram
.RS 4
Generate a diff using the "histogram diff" algorithm\&.
.RE
.PP
\-\-anchored=
.RS 4
Generate a diff using the "anchored diff" algorithm\&.
.sp
This option may be specified more than once\&.
.sp
If a line exists in both the source and destination, exists only once, and starts with this text, this algorithm attempts to prevent it from appearing as a deletion or addition in the output\&. It uses the "patience diff" algorithm internally\&.
.RE
.PP
\-\-diff\-algorithm={patience|minimal|histogram|myers}
.RS 4
Choose a diff algorithm\&. The variants are as follows:
.PP
\fBdefault\fR, \fBmyers\fR
.RS 4
The basic greedy diff algorithm\&. Currently, this is the default\&.
.RE
.PP
\fBminimal\fR
.RS 4
Spend extra time to make sure the smallest possible diff is produced\&.
.RE
.PP
\fBpatience\fR
.RS 4
Use "patience diff" algorithm when generating patches\&.
.RE
.PP
\fBhistogram\fR
.RS 4
This algorithm extends the patience algorithm to "support low\-occurrence common elements"\&.
.RE
.sp
For instance, if you configured the
\fBdiff\&.algorithm\fR
variable to a non\-default value and want to use the default one, then you have to use
\fB\-\-diff\-algorithm=default\fR
option\&.
.RE
.PP
\-\-stat[=[,[,]]]
.RS 4
Generate a diffstat\&. By default, as much space as necessary will be used for the filename part, and the rest for the graph part\&. Maximum width defaults to terminal width, or 80 columns if not connected to a terminal, and can be overridden by
\fB\fR\&. The width of the filename part can be limited by giving another width
\fB\fR
after a comma\&. The width of the graph part can be limited by using
\fB\-\-stat\-graph\-width=\fR
(affects all commands generating a stat graph) or by setting
\fBdiff\&.statGraphWidth=\fR
(does not affect
\fBgit format\-patch\fR)\&. By giving a third parameter
\fB\fR, you can limit the output to the first
\fB\fR
lines, followed by
\fB\&.\&.\&.\fR
if there are more\&.
.sp
These parameters can also be set individually with
\fB\-\-stat\-width=\fR,
\fB\-\-stat\-name\-width=\fR
and
\fB\-\-stat\-count=\fR\&.
.RE
.PP
\-\-compact\-summary
.RS 4
Output a condensed summary of extended header information such as file creations or deletions ("new" or "gone", optionally "+l" if it\(cqs a symlink) and mode changes ("+x" or "\-x" for adding or removing executable bit respectively) in diffstat\&. The information is put between the filename part and the graph part\&. Implies
\fB\-\-stat\fR\&.
.RE
.PP
\-\-numstat
.RS 4
Similar to
\fB\-\-stat\fR, but shows number of added and deleted lines in decimal notation and pathname without abbreviation, to make it more machine friendly\&. For binary files, outputs two
\fB\-\fR
instead of saying
\fB0 0\fR\&.
.RE
.PP
\-\-shortstat
.RS 4
Output only the last line of the
\fB\-\-stat\fR
format containing total number of modified files, as well as number of added and deleted lines\&.
.RE
.PP
\-X[], \-\-dirstat[=]
.RS 4
Output the distribution of relative amount of changes for each sub\-directory\&. The behavior of
\fB\-\-dirstat\fR
can be customized by passing it a comma separated list of parameters\&. The defaults are controlled by the
\fBdiff\&.dirstat\fR
configuration variable (see
\fBgit-config\fR(1))\&. The following parameters are available:
.PP
\fBchanges\fR
.RS 4
Compute the dirstat numbers by counting the lines that have been removed from the source, or added to the destination\&. This ignores the amount of pure code movements within a file\&. In other words, rearranging lines in a file is not counted as much as other changes\&. This is the default behavior when no parameter is given\&.
.RE
.PP
\fBlines\fR
.RS 4
Compute the dirstat numbers by doing the regular line\-based diff analysis, and summing the removed/added line counts\&. (For binary files, count 64\-byte chunks instead, since binary files have no natural concept of lines)\&. This is a more expensive
\fB\-\-dirstat\fR
behavior than the
\fBchanges\fR
behavior, but it does count rearranged lines within a file as much as other changes\&. The resulting output is consistent with what you get from the other
\fB\-\-*stat\fR
options\&.
.RE
.PP
\fBfiles\fR
.RS 4
Compute the dirstat numbers by counting the number of files changed\&. Each changed file counts equally in the dirstat analysis\&. This is the computationally cheapest
\fB\-\-dirstat\fR
behavior, since it does not have to look at the file contents at all\&.
.RE
.PP
\fBcumulative\fR
.RS 4
Count changes in a child directory for the parent directory as well\&. Note that when using
\fBcumulative\fR, the sum of the percentages reported may exceed 100%\&. The default (non\-cumulative) behavior can be specified with the
\fBnoncumulative\fR
parameter\&.
.RE
.PP
.RS 4
An integer parameter specifies a cut\-off percent (3% by default)\&. Directories contributing less than this percentage of the changes are not shown in the output\&.
.RE
.sp
Example: The following will count changed files, while ignoring directories with less than 10% of the total amount of changed files, and accumulating child directory counts in the parent directories:
\fB\-\-dirstat=files,10,cumulative\fR\&.
.RE
.PP
\-\-cumulative
.RS 4
Synonym for \-\-dirstat=cumulative
.RE
.PP
\-\-dirstat\-by\-file[=\&...]
.RS 4
Synonym for \-\-dirstat=files,param1,param2\&...
.RE
.PP
\-\-summary
.RS 4
Output a condensed summary of extended header information such as creations, renames and mode changes\&.
.RE
.PP
\-\-patch\-with\-stat
.RS 4
Synonym for
\fB\-p \-\-stat\fR\&.
.RE
.PP
\-z
.RS 4
When
\fB\-\-raw\fR,
\fB\-\-numstat\fR,
\fB\-\-name\-only\fR
or
\fB\-\-name\-status\fR
has been given, do not munge pathnames and use NULs as output field terminators\&.
.sp
Without this option, pathnames with "unusual" characters are quoted as explained for the configuration variable
\fBcore\&.quotePath\fR
(see
\fBgit-config\fR(1))\&.
.RE
.PP
\-\-name\-only
.RS 4
Show only names of changed files\&. The file names are often encoded in UTF\-8\&. For more information see the discussion about encoding in the
\fBgit-log\fR(1)
manual page\&.
.RE
.PP
\-\-name\-status
.RS 4
Show only names and status of changed files\&. See the description of the
\fB\-\-diff\-filter\fR
option on what the status letters mean\&. Just like
\fB\-\-name\-only\fR
the file names are often encoded in UTF\-8\&.
.RE
.PP
\-\-submodule[=]
.RS 4
Specify how differences in submodules are shown\&. When specifying
\fB\-\-submodule=short\fR
the
\fIshort\fR
format is used\&. This format just shows the names of the commits at the beginning and end of the range\&. When
\fB\-\-submodule\fR
or
\fB\-\-submodule=log\fR
is specified, the
\fIlog\fR
format is used\&. This format lists the commits in the range like
\fBgit-submodule\fR(1)
\fBsummary\fR
does\&. When
\fB\-\-submodule=diff\fR
is specified, the
\fIdiff\fR
format is used\&. This format shows an inline diff of the changes in the submodule contents between the commit range\&. Defaults to
\fBdiff\&.submodule\fR
or the
\fIshort\fR
format if the config option is unset\&.
.RE
.PP
\-\-color[=]
.RS 4
Show colored diff\&.
\fB\-\-color\fR
(i\&.e\&. without
\fI=\fR) is the same as
\fB\-\-color=always\fR\&.
\fI\fR
can be one of
\fBalways\fR,
\fBnever\fR, or
\fBauto\fR\&. It can be changed by the
\fBcolor\&.ui\fR
and
\fBcolor\&.diff\fR
configuration settings\&.
.RE
.PP
\-\-no\-color
.RS 4
Turn off colored diff\&. This can be used to override configuration settings\&. It is the same as
\fB\-\-color=never\fR\&.
.RE
.PP
\-\-color\-moved[=]
.RS 4
Moved lines of code are colored differently\&. It can be changed by the
\fBdiff\&.colorMoved\fR
configuration setting\&. The defaults to
\fIno\fR
if the option is not given and to
\fIzebra\fR
if the option with no mode is given\&. The mode must be one of:
.PP
no
.RS 4
Moved lines are not highlighted\&.
.RE
.PP
default
.RS 4
Is a synonym for
\fBzebra\fR\&. This may change to a more sensible mode in the future\&.
.RE
.PP
plain
.RS 4
Any line that is added in one location and was removed in another location will be colored with
\fIcolor\&.diff\&.newMoved\fR\&. Similarly
\fIcolor\&.diff\&.oldMoved\fR
will be used for removed lines that are added somewhere else in the diff\&. This mode picks up any moved line, but it is not very useful in a review to determine if a block of code was moved without permutation\&.
.RE
.PP
blocks
.RS 4
Blocks of moved text of at least 20 alphanumeric characters are detected greedily\&. The detected blocks are painted using either the
\fIcolor\&.diff\&.{old,new}Moved\fR
color\&. Adjacent blocks cannot be told apart\&.
.RE
.PP
zebra
.RS 4
Blocks of moved text are detected as in
\fIblocks\fR
mode\&. The blocks are painted using either the
\fIcolor\&.diff\&.{old,new}Moved\fR
color or
\fIcolor\&.diff\&.{old,new}MovedAlternative\fR\&. The change between the two colors indicates that a new block was detected\&.
.RE
.PP
dimmed\-zebra
.RS 4
Similar to
\fIzebra\fR, but additional dimming of uninteresting parts of moved code is performed\&. The bordering lines of two adjacent blocks are considered interesting, the rest is uninteresting\&.
\fBdimmed_zebra\fR
is a deprecated synonym\&.
.RE
.RE
.PP
\-\-no\-color\-moved
.RS 4
Turn off move detection\&. This can be used to override configuration settings\&. It is the same as
\fB\-\-color\-moved=no\fR\&.
.RE
.PP
\-\-color\-moved\-ws=
.RS 4
This configures how whitespace is ignored when performing the move detection for
\fB\-\-color\-moved\fR\&. It can be set by the
\fBdiff\&.colorMovedWS\fR
configuration setting\&. These modes can be given as a comma separated list:
.PP
no
.RS 4
Do not ignore whitespace when performing move detection\&.
.RE
.PP
ignore\-space\-at\-eol
.RS 4
Ignore changes in whitespace at EOL\&.
.RE
.PP
ignore\-space\-change
.RS 4
Ignore changes in amount of whitespace\&. This ignores whitespace at line end, and considers all other sequences of one or more whitespace characters to be equivalent\&.
.RE
.PP
ignore\-all\-space
.RS 4
Ignore whitespace when comparing lines\&. This ignores differences even if one line has whitespace where the other line has none\&.
.RE
.PP
allow\-indentation\-change
.RS 4
Initially ignore any whitespace in the move detection, then group the moved code blocks only into a block if the change in whitespace is the same per line\&. This is incompatible with the other modes\&.
.RE
.RE
.PP
\-\-no\-color\-moved\-ws
.RS 4
Do not ignore whitespace when performing move detection\&. This can be used to override configuration settings\&. It is the same as
\fB\-\-color\-moved\-ws=no\fR\&.
.RE
.PP
\-\-word\-diff[=]
.RS 4
Show a word diff, using the to delimit changed words\&. By default, words are delimited by whitespace; see
\fB\-\-word\-diff\-regex\fR
below\&. The defaults to
\fIplain\fR, and must be one of:
.PP
color
.RS 4
Highlight changed words using only colors\&. Implies
\fB\-\-color\fR\&.
.RE
.PP
plain
.RS 4
Show words as
\fB[\-removed\-]\fR
and
\fB{+added+}\fR\&. Makes no attempts to escape the delimiters if they appear in the input, so the output may be ambiguous\&.
.RE
.PP
porcelain
.RS 4
Use a special line\-based format intended for script consumption\&. Added/removed/unchanged runs are printed in the usual unified diff format, starting with a
\fB+\fR/\fB\-\fR/` ` character at the beginning of the line and extending to the end of the line\&. Newlines in the input are represented by a tilde
\fB~\fR
on a line of its own\&.
.RE
.PP
none
.RS 4
Disable word diff again\&.
.RE
.sp
Note that despite the name of the first mode, color is used to highlight the changed parts in all modes if enabled\&.
.RE
.PP
\-\-word\-diff\-regex=
.RS 4
Use to decide what a word is, instead of considering runs of non\-whitespace to be a word\&. Also implies
\fB\-\-word\-diff\fR
unless it was already enabled\&.
.sp
Every non\-overlapping match of the is considered a word\&. Anything between these matches is considered whitespace and ignored(!) for the purposes of finding differences\&. You may want to append
\fB|[^[:space:]]\fR
to your regular expression to make sure that it matches all non\-whitespace characters\&. A match that contains a newline is silently truncated(!) at the newline\&.
.sp
For example,
\fB\-\-word\-diff\-regex=\&.\fR
will treat each character as a word and, correspondingly, show differences character by character\&.
.sp
The regex can also be set via a diff driver or configuration option, see
\fBgitattributes\fR(5)
or
\fBgit-config\fR(1)\&. Giving it explicitly overrides any diff driver or configuration setting\&. Diff drivers override configuration settings\&.
.RE
.PP
\-\-color\-words[=]
.RS 4
Equivalent to
\fB\-\-word\-diff=color\fR
plus (if a regex was specified)
\fB\-\-word\-diff\-regex=\fR\&.
.RE
.PP
\-\-no\-renames
.RS 4
Turn off rename detection, even when the configuration file gives the default to do so\&.
.RE
.PP
\-\-[no\-]rename\-empty
.RS 4
Whether to use empty blobs as rename source\&.
.RE
.PP
\-\-check
.RS 4
Warn if changes introduce conflict markers or whitespace errors\&. What are considered whitespace errors is controlled by
\fBcore\&.whitespace\fR
configuration\&. By default, trailing whitespaces (including lines that consist solely of whitespaces) and a space character that is immediately followed by a tab character inside the initial indent of the line are considered whitespace errors\&. Exits with non\-zero status if problems are found\&. Not compatible with \-\-exit\-code\&.
.RE
.PP
\-\-ws\-error\-highlight=
.RS 4
Highlight whitespace errors in the
\fBcontext\fR,
\fBold\fR
or
\fBnew\fR
lines of the diff\&. Multiple values are separated by comma,
\fBnone\fR
resets previous values,
\fBdefault\fR
reset the list to
\fBnew\fR
and
\fBall\fR
is a shorthand for
\fBold,new,context\fR\&. When this option is not given, and the configuration variable
\fBdiff\&.wsErrorHighlight\fR
is not set, only whitespace errors in
\fBnew\fR
lines are highlighted\&. The whitespace errors are colored with
\fBcolor\&.diff\&.whitespace\fR\&.
.RE
.PP
\-\-full\-index
.RS 4
Instead of the first handful of characters, show the full pre\- and post\-image blob object names on the "index" line when generating patch format output\&.
.RE
.PP
\-\-binary
.RS 4
In addition to
\fB\-\-full\-index\fR, output a binary diff that can be applied with
\fBgit\-apply\fR\&. Implies
\fB\-\-patch\fR\&.
.RE
.PP
\-\-abbrev[=]
.RS 4
Instead of showing the full 40\-byte hexadecimal object name in diff\-raw format output and diff\-tree header lines, show the shortest prefix that is at least
\fI\fR
hexdigits long that uniquely refers the object\&. In diff\-patch output format,
\fB\-\-full\-index\fR
takes higher precedence, i\&.e\&. if
\fB\-\-full\-index\fR
is specified, full blob names will be shown regardless of
\fB\-\-abbrev\fR\&. Non default number of digits can be specified with
\fB\-\-abbrev=\fR\&.
.RE
.PP
\-B[][/], \-\-break\-rewrites[=[][/]]
.RS 4
Break complete rewrite changes into pairs of delete and create\&. This serves two purposes:
.sp
It affects the way a change that amounts to a total rewrite of a file not as a series of deletion and insertion mixed together with a very few lines that happen to match textually as the context, but as a single deletion of everything old followed by a single insertion of everything new, and the number
\fBm\fR
controls this aspect of the \-B option (defaults to 60%)\&.
\fB\-B/70%\fR
specifies that less than 30% of the original should remain in the result for Git to consider it a total rewrite (i\&.e\&. otherwise the resulting patch will be a series of deletion and insertion mixed together with context lines)\&.
.sp
When used with \-M, a totally\-rewritten file is also considered as the source of a rename (usually \-M only considers a file that disappeared as the source of a rename), and the number
\fBn\fR
controls this aspect of the \-B option (defaults to 50%)\&.
\fB\-B20%\fR
specifies that a change with addition and deletion compared to 20% or more of the file\(cqs size are eligible for being picked up as a possible source of a rename to another file\&.
.RE
.PP
\-M[], \-\-find\-renames[=]
.RS 4
Detect renames\&. If
\fBn\fR
is specified, it is a threshold on the similarity index (i\&.e\&. amount of addition/deletions compared to the file\(cqs size)\&. For example,
\fB\-M90%\fR
means Git should consider a delete/add pair to be a rename if more than 90% of the file hasn\(cqt changed\&. Without a
\fB%\fR
sign, the number is to be read as a fraction, with a decimal point before it\&. I\&.e\&.,
\fB\-M5\fR
becomes 0\&.5, and is thus the same as
\fB\-M50%\fR\&. Similarly,
\fB\-M05\fR
is the same as
\fB\-M5%\fR\&. To limit detection to exact renames, use
\fB\-M100%\fR\&. The default similarity index is 50%\&.
.RE
.PP
\-C[], \-\-find\-copies[=]
.RS 4
Detect copies as well as renames\&. See also
\fB\-\-find\-copies\-harder\fR\&. If
\fBn\fR
is specified, it has the same meaning as for
\fB\-M\fR\&.
.RE
.PP
\-\-find\-copies\-harder
.RS 4
For performance reasons, by default,
\fB\-C\fR
option finds copies only if the original file of the copy was modified in the same changeset\&. This flag makes the command inspect unmodified files as candidates for the source of copy\&. This is a very expensive operation for large projects, so use it with caution\&. Giving more than one
\fB\-C\fR
option has the same effect\&.
.RE
.PP
\-D, \-\-irreversible\-delete
.RS 4
Omit the preimage for deletes, i\&.e\&. print only the header but not the diff between the preimage and
\fB/dev/null\fR\&. The resulting patch is not meant to be applied with
\fBpatch\fR
or
\fBgit apply\fR; this is solely for people who want to just concentrate on reviewing the text after the change\&. In addition, the output obviously lacks enough information to apply such a patch in reverse, even manually, hence the name of the option\&.
.sp
When used together with
\fB\-B\fR, omit also the preimage in the deletion part of a delete/create pair\&.
.RE
.PP
\-l
.RS 4
The
\fB\-M\fR
and
\fB\-C\fR
options involve some preliminary steps that can detect subsets of renames/copies cheaply, followed by an exhaustive fallback portion that compares all remaining unpaired destinations to all relevant sources\&. (For renames, only remaining unpaired sources are relevant; for copies, all original sources are relevant\&.) For N sources and destinations, this exhaustive check is O(N^2)\&. This option prevents the exhaustive portion of rename/copy detection from running if the number of source/destination files involved exceeds the specified number\&. Defaults to diff\&.renameLimit\&. Note that a value of 0 is treated as unlimited\&.
.RE
.PP
\-\-diff\-filter=[(A|C|D|M|R|T|U|X|B)\&...[*]]
.RS 4
Select only files that are Added (\fBA\fR), Copied (\fBC\fR), Deleted (\fBD\fR), Modified (\fBM\fR), Renamed (\fBR\fR), have their type (i\&.e\&. regular file, symlink, submodule, \&...) changed (\fBT\fR), are Unmerged (\fBU\fR), are Unknown (\fBX\fR), or have had their pairing Broken (\fBB\fR)\&. Any combination of the filter characters (including none) can be used\&. When
\fB*\fR
(All\-or\-none) is added to the combination, all paths are selected if there is any file that matches other criteria in the comparison; if there is no file that matches other criteria, nothing is selected\&.
.sp
Also, these upper\-case letters can be downcased to exclude\&. E\&.g\&.
\fB\-\-diff\-filter=ad\fR
excludes added and deleted paths\&.
.sp
Note that not all diffs can feature all types\&. For instance, copied and renamed entries cannot appear if detection for those types is disabled\&.
.RE
.PP
\-S
.RS 4
Look for differences that change the number of occurrences of the specified string (i\&.e\&. addition/deletion) in a file\&. Intended for the scripter\(cqs use\&.
.sp
It is useful when you\(cqre looking for an exact block of code (like a struct), and want to know the history of that block since it first came into being: use the feature iteratively to feed the interesting block in the preimage back into
\fB\-S\fR, and keep going until you get the very first version of the block\&.
.sp
Binary files are searched as well\&.
.RE
.PP
\-G
.RS 4
Look for differences whose patch text contains added/removed lines that match \&.
.sp
To illustrate the difference between
\fB\-S \-\-pickaxe\-regex\fR
and
\fB\-G\fR, consider a commit with the following diff in the same file:
.sp
.if n \{\
.RS 4
.\}
.nf
+ return frotz(nitfol, two\->ptr, 1, 0);
\&.\&.\&.
\- hit = frotz(nitfol, mf2\&.ptr, 1, 0);
.fi
.if n \{\
.RE
.\}
.sp
While
\fBgit log \-G"frotz\e(nitfol"\fR
will show this commit,
\fBgit log \-S"frotz\e(nitfol" \-\-pickaxe\-regex\fR
will not (because the number of occurrences of that string did not change)\&.
.sp
Unless
\fB\-\-text\fR
is supplied patches of binary files without a textconv filter will be ignored\&.
.sp
See the
\fIpickaxe\fR
entry in
\fBgitdiffcore\fR(7)
for more information\&.
.RE
.PP
\-\-find\-object=