// 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 instead of
	the usual three.
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.

`--diff-algorithm=(patience|minimal|histogram|myers)`::
	Choose a diff algorithm. The variants are as follows:
+
--
   `default`;;
   `myers`;;
	The basic greedy diff algorithm. Currently, this is the default.
   `minimal`;;
	Spend extra time to make sure the smallest possible diff is
	produced.
   `patience`;;
	Use "patience diff" algorithm when generating patches.
   `histogram`;;
	This algorithm extends the patience algorithm to "support
	low-occurrence common elements".
--
+
For instance, if you configured the `diff.algorithm` variable to a
non-default value and want to use the default one, then you
have to use `--diff-algorithm=default` option.

`--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.

`--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`::
	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]).

`--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].
