// Please don't remove this comment as asciidoc behaves badly when
// the first non-empty line is ifdef/ifndef. The symptom is that
// without this comment the <git-diff-core> attribute conditionally
// defined below ends up being defined unconditionally.
// Last checked with asciidoc 7.0.2.

ifndef::git-format-patch[]
ifndef::git-diff[]
ifndef::git-log[]
:git-diff-core: 1
endif::git-log[]
endif::git-diff[]
endif::git-format-patch[]

ifdef::git-format-patch[]
-p::
--no-stat::
	Generate plain patches without any diffstats.
endif::git-format-patch[]

ifndef::git-format-patch[]
`-p`::
`-u`::
`--patch`::
	Generate patch (see <<generate_patch_text_with_p>>).
ifdef::git-diff[]
	This is the default.
endif::git-diff[]

`-s`::
`--no-patch`::
	Suppress all output from the diff machinery.  Useful for
	commands like `git show` that show the patch by default to
	squelch their output, or to cancel the effect of options like
	`--patch`, `--stat` earlier on the command line in an alias.

endif::git-format-patch[]

ifdef::git-log[]
`-m`::
	Show diffs for merge commits in the default format. This is
	similar to `--diff-merges=on`, except `-m` will
	produce no output unless `-p` is given as well.

`-c`::
	Produce combined diff output for merge commits.
	Shortcut for `--diff-merges=combined -p`.

`--cc`::
	Produce dense combined diff output for merge commits.
	Shortcut for `--diff-merges=dense-combined -p`.

`--dd`::
	Produce diff with respect to first parent for both merge and
	regular commits.
	Shortcut for `--diff-merges=first-parent -p`.

`--remerge-diff`::
	Produce remerge-diff output for merge commits.
	Shortcut for `--diff-merges=remerge -p`.

`--no-diff-merges`::
	Synonym for `--diff-merges=off`.

`--diff-merges=<format>`::
	Specify diff format to be used for merge commits. Default is
	{diff-merges-default} unless `--first-parent` is in use, in
	which case `first-parent` is the default.
+
The following formats are supported:
+
--
`off`::
`none`::
	Disable output of diffs for merge commits. Useful to override
	implied value.

`on`::
`m`::
	Make diff output for merge commits to be shown in the default
	format. The default format can be changed using
	`log.diffMerges` configuration variable, whose default value
	is `separate`.

`first-parent`::
`1`::
	Show full diff with respect to first parent. This is the same
	format as `--patch` produces for non-merge commits.

`separate`::
	Show full diff with respect to each of parents.
	Separate log entry and diff is generated for each parent.

`combined`::
`c`::
	Show differences from each of the parents to the merge
	result simultaneously instead of showing pairwise diff between
	a parent and the result one at a time. Furthermore, it lists
	only files which were modified from all parents.

`dense-combined`::
`cc`::
	Further compress output produced by `--diff-merges=combined`
	by omitting uninteresting hunks whose contents in the parents
	have only two variants and the merge result picks one of them
	without modification.

`remerge`::
`r`:: Remerge two-parent merge commits to create a temporary tree
	object--potentially containing files with conflict markers
	and such.  A diff is then shown between that temporary tree
	and the actual merge commit.
--
+
The output emitted when this option is used is subject to change, and
so is its interaction with other options (unless explicitly
documented).


`--combined-all-paths`::
	Cause combined diffs (used for merge commits) to
	list the name of the file from all parents.  It thus only has
	effect when `--diff-merges=[dense-]combined` is in use, and
	is likely only useful if filename changes are detected (i.e.
	when either rename or copy detection have been requested).
endif::git-log[]

`-U<n>`::
`--unified=<n>`::
	Generate diffs with _<n>_ lines of context. The number of context
	lines defaults to `diff.context` or 3 if the configuration variable
	is unset. (`-U` without `<n>` is silently accepted as a synonym for
	`-p` due to a historical accident).
ifndef::git-format-patch[]
	Implies `--patch`.
endif::git-format-patch[]

`--output=<file>`::
	Output to a specific file instead of stdout.

`--output-indicator-new=<char>`::
`--output-indicator-old=<char>`::
`--output-indicator-context=<char>`::
	Specify the character used to indicate new, old or context
	lines in the generated patch. Normally they are `+`, `-` and
	' ' respectively.

ifndef::git-format-patch[]
`--raw`::
ifndef::git-log[]
	Generate the diff in raw format.
ifdef::git-diff-core[]
	This is the default.
endif::git-diff-core[]
endif::git-log[]
ifdef::git-log[]
	For each commit, show a summary of changes using the raw diff
	format. See the "RAW OUTPUT FORMAT" section of
	linkgit:git-diff[1]. This is different from showing the log
	itself in raw format, which you can achieve with
	`--format=raw`.
endif::git-log[]
endif::git-format-patch[]

ifndef::git-format-patch[]
`--patch-with-raw`::
	Synonym for `-p --raw`.
endif::git-format-patch[]

ifdef::git-log[]
`-t`::
	Show the tree objects in the diff output.
endif::git-log[]

`--indent-heuristic`::
	Enable the heuristic that shifts diff hunk boundaries to make patches
	easier to read. This is the default.

`--no-indent-heuristic`::
	Disable the indent heuristic.

`--minimal`::
	Spend extra time to make sure the smallest possible
	diff is produced.

`--patience`::
	Generate a diff using the "patience diff" algorithm.

`--histogram`::
	Generate a diff using the "histogram diff" algorithm.

`--anchored=<text>`::
	Generate a diff using the "anchored diff" algorithm.
+
This option may be specified more than once.
+
If a line exists in both the source and destination, exists only once,
and starts with _<text>_, this algorithm attempts to prevent it from
appearing as a deletion or addition in the output. It uses the "patience
diff" algorithm internally.

include::diff-algorithm-option.adoc[]

`--stat[=<width>[,<name-width>[,<count>]]]`::
	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
	_<width>_. The width of the filename part can be limited by
	giving another width _<name-width>_ after a comma or by setting
	`diff.statNameWidth=<name-width>`. The width of the graph part can be
	limited by using `--stat-graph-width=<graph-width>` or by setting
	`diff.statGraphWidth=<graph-width>`. Using `--stat` or
	`--stat-graph-width` affects all commands generating a stat graph,
	while setting `diff.statNameWidth` or `diff.statGraphWidth`
	does not affect `git format-patch`.
	By giving a third parameter _<count>_, you can limit the output to
	the first _<count>_ lines, followed by `...` if there are more.
+
These parameters can also be set individually with `--stat-width=<width>`,
`--stat-name-width=<name-width>` and `--stat-count=<count>`.

`--compact-summary`::
	Output a condensed summary of extended header information such
	as file creations or deletions ("new" or "gone", optionally `+l`
	if it's 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 `--stat`.

`--numstat`::
	Similar to `--stat`, 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 `-` instead of saying
	`0 0`.

`--shortstat`::
	Output only the last line of the `--stat` format containing total
	number of modified files, as well as number of added and deleted
	lines.

`-X [<param>,...]`::
`--dirstat[=<param>,...]`::
	Output the distribution of relative amount of changes for each
	sub-directory. The behavior of `--dirstat` can be customized by
	passing it a comma separated list of parameters.
	The defaults are controlled by the `diff.dirstat` configuration
	variable (see linkgit:git-config[1]).
	The following parameters are available:
+
--
`changes`;;
	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.
`lines`;;
	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 `--dirstat`
	behavior than the `changes` 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 `--*stat` options.
`files`;;
	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 `--dirstat` behavior, since it does
	not have to look at the file contents at all.
`cumulative`;;
	Count changes in a child directory for the parent directory as well.
	Note that when using `cumulative`, the sum of the percentages
	reported may exceed 100%. The default (non-cumulative) behavior can
	be specified with the `noncumulative` parameter.
_<limit>_;;
	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.
--
+
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:
`--dirstat=files,10,cumulative`.

`--cumulative`::
	Synonym for `--dirstat=cumulative`.

`--dirstat-by-file[=<param>,...]`::
	Synonym for `--dirstat=files,<param>,...`.

`--summary`::
	Output a condensed summary of extended header information
	such as creations, renames and mode changes.

ifndef::git-format-patch[]
`--patch-with-stat`::
	Synonym for `-p --stat`.
endif::git-format-patch[]

ifndef::git-format-patch[]

`-z`::
ifdef::git-log[]
	Separate the commits with __NUL__s instead of newlines.
+
Also, when `--raw` or `--numstat` has been given, do not munge
pathnames and use __NUL__s as output field terminators.
endif::git-log[]
ifndef::git-log[]
	When `--raw`, `--numstat`, `--name-only` or `--name-status` has been
	given, do not munge pathnames and use NULs as output field terminators.
endif::git-log[]
+
Without this option, pathnames with "unusual" characters are quoted as
explained for the configuration variable `core.quotePath` (see
linkgit:git-config[1]).

`--name-only`::
	Show only the name of each changed file in the post-image tree.
	The file names are often encoded in UTF-8.
	For more information see the discussion about encoding in the linkgit:git-log[1]
	manual page.

`--name-status`::
	Show only the name(s) and status of each changed file. See the description
	of the `--diff-filter` option on what the status letters mean.
	Just like `--name-only` the file names are often encoded in UTF-8.

`--submodule[=<format>]`::
	Specify how differences in submodules are shown.  When specifying
	`--submodule=short` the `short` format is used.  This format just
	shows the names of the commits at the beginning and end of the range.
	When `--submodule` or `--submodule=log` is specified, the `log`
	format is used.  This format lists the commits in the range like
	linkgit:git-submodule[1] `summary` does.  When `--submodule=diff`
	is specified, the `diff` format is used.  This format shows an
	inline diff of the changes in the submodule contents between the
	commit range.  Defaults to `diff.submodule` or the `short` format
	if the config option is unset.

`--color[=<when>]`::
	Show colored diff.
	`--color` (i.e. without `=<when>`) is the same as `--color=always`.
	_<when>_ can be one of `always`, `never`, or `auto`.
ifdef::git-diff[]
	It can be changed by the `color.ui` and `color.diff`
	configuration settings.
endif::git-diff[]

`--no-color`::
	Turn off colored diff.
ifdef::git-diff[]
	This can be used to override configuration settings.
endif::git-diff[]
	It is the same as `--color=never`.

`--color-moved[=<mode>]`::
	Moved lines of code are colored differently.
ifdef::git-diff[]
	It can be changed by the `diff.colorMoved` configuration setting.
endif::git-diff[]
	The _<mode>_ defaults to `no` if the option is not given
	and to `zebra` if the option with no mode is given.
	The mode must be one of:
+
--
`no`::
	Moved lines are not highlighted.
`default`::
	Is a synonym for `zebra`. This may change to a more sensible mode
	in the future.
`plain`::
	Any line that is added in one location and was removed
	in another location will be colored with `color.diff.newMoved`.
	Similarly `color.diff.oldMoved` 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.
`blocks`::
	Blocks of moved text of at least 20 alphanumeric characters
	are detected greedily. The detected blocks are
	painted using either the `color.diff.(old|new)Moved` color.
	Adjacent blocks cannot be told apart.
`zebra`::
	Blocks of moved text are detected as in `blocks` mode. The blocks
	are painted using either the `color.diff.(old|new)Moved` color or
	`color.diff.(old|new)MovedAlternative`. The change between
	the two colors indicates that a new block was detected.
`dimmed-zebra`::
	Similar to `zebra`, 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.
	`dimmed_zebra` is a deprecated synonym.
--

`--no-color-moved`::
	Turn off move detection. This can be used to override configuration
	settings. It is the same as `--color-moved=no`.

`--color-moved-ws=<mode>,...`::
	This configures how whitespace is ignored when performing the
	move detection for `--color-moved`.
ifdef::git-diff[]
	It can be set by the `diff.colorMovedWS` configuration setting.
endif::git-diff[]
	These modes can be given as a comma separated list:
+
--
`no`::
	Do not ignore whitespace when performing move detection.
`ignore-space-at-eol`::
	Ignore changes in whitespace at EOL.
`ignore-space-change`::
	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.
`ignore-all-space`::
	Ignore whitespace when comparing lines. This ignores differences
	even if one line has whitespace where the other line has none.
`allow-indentation-change`::
	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.
--

`--no-color-moved-ws`::
	Do not ignore whitespace when performing move detection. This can be
	used to override configuration settings. It is the same as
	`--color-moved-ws=no`.

`--word-diff[=<mode>]`::
	By default, words are delimited by whitespace; see
	`--word-diff-regex` below.  The _<mode>_ defaults to `plain`, and
	must be one of:
+
--
`color`::
	Highlight changed words using only colors.  Implies `--color`.
`plain`::
	Show words as ++[-removed-]++ and ++{+added+}++.  Makes no
	attempts to escape the delimiters if they appear in the input,
	so the output may be ambiguous.
`porcelain`::
	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 `+`/`-`/` `
	character at the beginning of the line and extending to the
	end of the line.  Newlines in the input are represented by a
	tilde `~` on a line of its own.
`none`::
	Disable word diff again.
--
+
Note that despite the name of the first mode, color is used to
highlight the changed parts in all modes if enabled.
+
The `--word-diff` option operates by taking the same line-by-line
diff that is produced without the option and computing
word-by-word changes within each hunk.  This may produce a
larger diff than a dedicated word-diff tool would.  If Git
acquires a different implementation in the future, the output
may change.  Note that this is similar to the `--diff-algorithm`
option, which may also change the output.

`--word-diff-regex=<regex>`::
	Use _<regex>_ to decide what a word is, instead of considering
	runs of non-whitespace to be a word.  Also implies
	`--word-diff` unless it was already enabled.
+
Every non-overlapping match of the
_<regex>_ is considered a word.  Anything between these matches is
considered whitespace and ignored(!) for the purposes of finding
differences.  You may want to append `|[^[:space:]]` 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.
+
For example, `--word-diff-regex=.` will treat each character as a word
and, correspondingly, show differences character by character.
+
The regex can also be set via a diff driver or configuration option, see
linkgit:gitattributes[5] or linkgit:git-config[1].  Giving it explicitly
overrides any diff driver or configuration setting.  Diff drivers
override configuration settings.

`--color-words[=<regex>]`::
	Equivalent to `--word-diff=color` plus (if a regex was
	specified) `--word-diff-regex=<regex>`.
endif::git-format-patch[]

`--no-renames`::
	Turn off rename detection, even when the configuration
	file gives the default to do so.

`--rename-empty`::
`--no-rename-empty`::
	Whether to use empty blobs as rename source.

ifndef::git-format-patch[]
`--check`::
	Warn if changes introduce conflict markers or whitespace errors.
	What are considered whitespace errors is controlled by `core.whitespace`
	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`.

`--ws-error-highlight=<kind>`::
	Highlight whitespace errors in the `context`, `old` or `new`
	lines of the diff.  Multiple values are separated by comma,
	`none` resets previous values, `default` reset the list to
	`new` and `all` is a shorthand for `old,new,context`.  When
	this option is not given, and the configuration variable
	`diff.wsErrorHighlight` is not set, only whitespace errors in
	`new` lines are highlighted. The whitespace errors are colored
	with `color.diff.whitespace`.

endif::git-format-patch[]

`--full-index`::
	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.

`--binary`::
	In addition to `--full-index`, output a binary diff that
	can be applied with `git-apply`.
ifndef::git-format-patch[]
	Implies `--patch`.
endif::git-format-patch[]

`--abbrev[=<n>]`::
	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 _<n>_
	hexdigits long that uniquely refers the object.
	In diff-patch output format, `--full-index` takes higher
	precedence, i.e. if `--full-index` is specified, full blob
	names will be shown regardless of `--abbrev`.
	Non default number of digits can be specified with `--abbrev=<n>`.

`-B[<n>][/<m>]`::
`--break-rewrites[=[<n>][/<m>]]`::
	Break complete rewrite changes into pairs of delete and
	create. This serves two purposes:
+
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 _<m>_ controls this aspect of the `-B`
option (defaults to 60%). `-B/70%` 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).
+
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 _<n>_ controls this aspect of
the `-B` option (defaults to 50%). `-B20%` specifies that a change with
addition and deletion compared to 20% or more of the file's size are
eligible for being picked up as a possible source of a rename to
another file.

`-M[<n>]`::
`--find-renames[=<n>]`::
ifndef::git-log[]
	Detect renames.
endif::git-log[]
ifdef::git-log[]
	If generating diffs, detect and report renames for each commit.
	For following files across renames while traversing history, see
	`--follow`.
endif::git-log[]
	If _<n>_ is specified, it is a threshold on the similarity
	index (i.e. amount of addition/deletions compared to the
	file's size). For example, `-M90%` means Git should consider a
	delete/add pair to be a rename if more than 90% of the file
	hasn't changed.  Without a `%` sign, the number is to be read as
	a fraction, with a decimal point before it.  I.e., `-M5` becomes
	0.5, and is thus the same as `-M50%`.  Similarly, `-M05` is
	the same as `-M5%`.  To limit detection to exact renames, use
	`-M100%`.  The default similarity index is 50%.

`-C[<n>]`::
`--find-copies[=<n>]`::
	Detect copies as well as renames.  See also `--find-copies-harder`.
	If _<n>_ is specified, it has the same meaning as for `-M<n>`.

`--find-copies-harder`::
	For performance reasons, by default, `-C` 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
	`-C` option has the same effect.

`-D`::
`--irreversible-delete`::
	Omit the preimage for deletes, i.e. print only the header but not
	the diff between the preimage and `/dev/null`. The resulting patch
	is not meant to be applied with `patch` or `git apply`; 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.
+
When used together with `-B`, omit also the preimage in the deletion part
of a delete/create pair.

`-l<num>`::
	The `-M` and `-C` 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.

ifndef::git-format-patch[]
`--diff-filter=[(A|C|D|M|R|T|U|X|B)...[*]]`::
	Select only files that are Added (`A`), Copied (`C`),
	Deleted (`D`), Modified (`M`), Renamed (`R`), have their
	type (i.e. regular file, symlink, submodule, ...) changed (`T`),
	are Unmerged (`U`), are
	Unknown (`X`), or have had their pairing Broken (`B`).
	Any combination of the filter characters (including none) can be used.
	When `*` (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.
+
Also, these upper-case letters can be downcased to exclude.  E.g.
`--diff-filter=ad` excludes added and deleted paths.
+
Note that not all diffs can feature all types. For instance, copied and
renamed entries cannot appear if detection for those types is disabled.

`-S<string>`::
	Look for differences that change the number of occurrences of
	the specified _<string>_ (i.e. addition/deletion) in a file.
	Intended for the scripter's use.
+
It is useful when you're 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 `-S`, and keep going until you get the
very first version of the block.
+
Binary files are searched as well.

`-G<regex>`::
	Look for differences whose patch text contains added/removed
	lines that match _<regex>_.
+
To illustrate the difference between `-S<regex>` `--pickaxe-regex` and
`-G<regex>`, consider a commit with the following diff in the same
file:
+
----
+    return frotz(nitfol, two->ptr, 1, 0);
...
-    hit = frotz(nitfol, mf2.ptr, 1, 0);
----
+
While `git log -G"frotz\(nitfol"` will show this commit, `git log
-S"frotz\(nitfol" --pickaxe-regex` will not (because the number of
occurrences of that string did not change).
+
Unless `--text` is supplied patches of binary files without a textconv
filter will be ignored.
+
See the 'pickaxe' entry in linkgit:gitdiffcore[7] for more
information.

`--find-object=<object-id>`::
	Look for differences that change the number of occurrences of
	the specified object. Similar to `-S`, just the argument is different
	in that it doesn't search for a specific string but for a specific
	object id.
+
The object can be a blob or a submodule commit. It implies the `-t` option in
`git-log` to also find trees.

`--pickaxe-all`::
	When `-S` or `-G` finds a change, show all the changes in that
	changeset, not just the files that contain the change
	in _<string>_.

`--pickaxe-regex`::
	Treat the _<string>_ given to `-S` as an extended POSIX regular
	expression to match.

endif::git-format-patch[]

`-O<orderfile>`::
	Control the order in which files appear in the output.
	This overrides the `diff.orderFile` configuration variable
	(see linkgit:git-config[1]).  To cancel `diff.orderFile`,
	use `-O/dev/null`.
+
The output order is determined by the order of glob patterns in
_<orderfile>_.
All files with pathnames that match the first pattern are output
first, all files with pathnames that match the second pattern (but not
the first) are output next, and so on.
All files with pathnames that do not match any pattern are output
last, as if there was an implicit match-all pattern at the end of the
file.
If multiple pathnames have the same rank (they match the same pattern
but no earlier patterns), their output order relative to each other is
the normal order.
+
_<orderfile>_ is parsed as follows:
+
--
 - Blank lines are ignored, so they can be used as separators for
   readability.

 - Lines starting with a hash ("`#`") are ignored, so they can be used
   for comments.  Add a backslash ("`\`") to the beginning of the
   pattern if it starts with a hash.

 - Each other line contains a single pattern.
--
+
Patterns have the same syntax and semantics as patterns used for
`fnmatch`(3) without the `FNM_PATHNAME` flag, except a pathname also
matches a pattern if removing any number of the final pathname
components matches the pattern.  For example, the pattern "`foo*bar`"
matches "`fooasdfbar`" and "`foo/bar/baz/asdf`" but not "`foobarx`".

`--skip-to=<file>`::
`--rotate-to=<file>`::
	Discard the files before the named _<file>_ from the output
	(i.e. 'skip to'), or move them to the end of the output
	(i.e. 'rotate to').  These options were invented primarily for the use
	of the `git difftool` command, and may not be very useful
	otherwise.

ifndef::git-format-patch[]
`-R`::
	Swap two inputs; that is, show differences from index or
	on-disk file to tree contents.
endif::git-format-patch[]

`--relative[=<path>]`::
`--no-relative`::
	When run from a subdirectory of the project, it can be
	told to exclude changes outside the directory and show
	pathnames relative to it with this option.  When you are
	not in a subdirectory (e.g. in a bare repository), you
	can name which subdirectory to make the output relative
	to by giving a _<path>_ as an argument.
	`--no-relative` can be used to countermand both `diff.relative` config
	option and previous `--relative`.

`-a`::
`--text`::
	Treat all files as text.

`--ignore-cr-at-eol`::
	Ignore carriage-return at the end of line when doing a comparison.

`--ignore-space-at-eol`::
	Ignore changes in whitespace at EOL.

`-b`::
`--ignore-space-change`::
	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.

`-w`::
`--ignore-all-space`::
	Ignore whitespace when comparing lines.  This ignores
	differences even if one line has whitespace where the other
	line has none.

`--ignore-blank-lines`::
	Ignore changes whose lines are all blank.


`-I<regex>`::
`--ignore-matching-lines=<regex>`::
	Ignore changes whose all lines match _<regex>_.  This option may
	be specified more than once.

`--inter-hunk-context=<number>`::
	Show the context between diff hunks, up to the specified _<number>_
	of lines, thereby fusing hunks that are close to each other.
	Defaults to `diff.interHunkContext` or 0 if the config option
	is unset.

`-W`::
`--function-context`::
	Show whole function as context lines for each change.
	The function names are determined in the same way as
	`git diff` works out patch hunk headers (see "Defining a
	custom hunk-header" in linkgit:gitattributes[5]).

ifndef::git-format-patch[]
ifndef::git-log[]
`--exit-code`::
	Make the program exit with codes similar to `diff`(1).
	That is, it exits with 1 if there were differences and
	0 means no differences.

`--quiet`::
	Disable all output of the program. Implies `--exit-code`.
	Disables execution of external diff helpers whose exit code
	is not trusted, i.e. their respective configuration option
	`diff.trustExitCode` or ++diff.++__<driver>__++.trustExitCode++ or
	environment variable `GIT_EXTERNAL_DIFF_TRUST_EXIT_CODE` is
	false.
endif::git-log[]
endif::git-format-patch[]

`--ext-diff`::
	Allow an external diff helper to be executed. If you set an
	external diff driver with linkgit:gitattributes[5], you need
	to use this option with linkgit:git-log[1] and friends.

`--no-ext-diff`::
	Disallow external diff drivers.

`--textconv`::
`--no-textconv`::
	Allow (or disallow) external text conversion filters to be run
	when comparing binary files. See linkgit:gitattributes[5] for
	details. Because textconv filters are typically a one-way
	conversion, the resulting diff is suitable for human
	consumption, but cannot be applied. For this reason, textconv
	filters are enabled by default only for linkgit:git-diff[1] and
	linkgit:git-log[1], but not for linkgit:git-format-patch[1] or
	diff plumbing commands.


`--ignore-submodules[=(none|untracked|dirty|all)]`::
	Ignore changes to submodules in the diff generation. `all` is the default.
	Using `none` will consider the submodule modified when it either contains
	untracked or modified files or its `HEAD` differs from the commit recorded
	in the superproject and can be used to override any settings of the
	`ignore` option in linkgit:git-config[1] or linkgit:gitmodules[5]. When
	`untracked` is used submodules are not considered dirty when they only
	contain untracked content (but they are still scanned for modified
	content). Using `dirty` ignores all changes to the work tree of submodules,
	only changes to the commits stored in the superproject are shown (this was
	the behavior until 1.7.0). Using `all` hides all changes to submodules.

`--src-prefix=<prefix>`::
	Show the given source _<prefix>_ instead of "a/".

`--dst-prefix=<prefix>`::
	Show the given destination _<prefix>_ instead of "b/".

`--no-prefix`::
	Do not show any source or destination prefix.

`--default-prefix`::
ifdef::git-format-patch[]
	Use the default source and destination prefixes ("a/" and "b/").
	This overrides configuration variables such as `format.noprefix`,
	`diff.srcPrefix`, `diff.dstPrefix`, and `diff.mnemonicPrefix`
	(see linkgit:git-config[1]).
endif::git-format-patch[]
ifndef::git-format-patch[]
	Use the default source and destination prefixes ("a/" and "b/").
	This overrides configuration variables such as `diff.noprefix`,
	`diff.srcPrefix`, `diff.dstPrefix`, and `diff.mnemonicPrefix`
	(see linkgit:git-config[1]).
endif::git-format-patch[]

`--line-prefix=<prefix>`::
	Prepend an additional _<prefix>_ to every line of output.

`--ita-invisible-in-index`::
	By default entries added by `git add -N` appear as an existing
	empty file in `git diff` and a new file in `git diff --cached`.
	This option makes the entry appear as a new file in `git diff`
	and non-existent in `git diff --cached`. This option could be
	reverted with `--ita-visible-in-index`. Both options are
	experimental and could be removed in future.

--max-depth=<depth>::
	For each pathspec given on command line, descend at most `<depth>`
	levels of directories. A value of `-1` means no limit.
	Cannot be combined with wildcards in the pathspec.
	Given a tree containing `foo/bar/baz`, the following list shows the
	matches generated by each set of options:
+
--
 - `--max-depth=0 -- foo`: `foo`

 - `--max-depth=1 -- foo`: `foo/bar`

 - `--max-depth=1 -- foo/bar`: `foo/bar/baz`

 - `--max-depth=1 -- foo foo/bar`: `foo/bar/baz`

 - `--max-depth=2 -- foo`: `foo/bar/baz`
--
+
If no pathspec is given, the depth is measured as if all
top-level entries were specified. Note that this is different
than measuring from the root, in that `--max-depth=0` would
still return `foo`. This allows you to still limit depth while
asking for a subset of the top-level entries.
+
Note that this option is only supported for diffs between tree objects,
not against the index or working tree.

For more detailed explanation on these common options, see also
linkgit:gitdiffcore[7].
