// 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::
	Generate patches without diffstat.
endif::git-format-patch[]

ifndef::git-format-patch[]
-p::
	Generate patch (see section on generating patches).
	{git-diff? This is the default.}
endif::git-format-patch[]

-u::
	Synonym for "-p".

-U<n>::
	Shorthand for "--unified=<n>".

--unified=<n>::
	Generate diffs with <n> lines of context instead of
	the usual three. Implies "-p".

--raw::
	Generate the raw format.
	{git-diff-core? This is the default.}

--patch-with-raw::
	Synonym for "-p --raw".

--stat[=width[,name-width]]::
	Generate a diffstat.  You can override the default
	output width for 80-column terminal by "--stat=width".
	The width of the filename part can be controlled by
	giving another width to it separated by a comma.

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

--dirstat[=limit]::
	Output only the sub-directories that are impacted by a diff,
	and to what degree they are impacted.  You can override the
	default cut-off in percent (3) by "--dirstat=limit".  If you
	want to enable "cumulative" directory statistics, you can use
	the "--cumulative" flag, which adds up percentages recursively
	even when they have been already reported for a sub-directory.

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

--patch-with-stat::
	Synonym for "-p --stat".
	{git-format-patch? This is the default.}

-z::
	NUL-line termination on output.  This affects the --raw
	output field terminator.  Also output from commands such
	as "git-log" will be delimited with NUL between commits.

--name-only::
	Show only names of changed files.

--name-status::
	Show only names and status of changed files. See the description
	of the `--diff-filter` option on what the status letters mean.

--color::
	Show colored diff.

--no-color::
	Turn off colored diff, even when the configuration file
	gives the default to color output.

--color-words::
	Show colored word diff, i.e. color words which have changed.

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

--check::
	Warn if changes introduce trailing whitespace
	or an indent that uses a space before a tab. Exits with
	non-zero status if problems are found. Not compatible with
	--exit-code.

--full-index::
	Instead of the first handful characters, show full
	object name of pre- and post-image blob on the "index"
	line when generating a patch format output.

--binary::
	In addition to --full-index, output "binary diff" that
	can be applied with "git apply".

--abbrev[=<n>]::
	Instead of showing the full 40-byte hexadecimal object
	name in diff-raw format output and diff-tree header
	lines, show only handful hexdigits prefix.  This is
	independent of --full-index option above, which controls
	the diff-patch output format.  Non default number of
	digits can be specified with --abbrev=<n>.

-B::
	Break complete rewrite changes into pairs of delete and create.

-M::
	Detect renames.

-C::
	Detect copies as well as renames.  See also `--find-copies-harder`.

--diff-filter=[ACDMRTUXB*]::
	Select only files that are Added (`A`), Copied (`C`),
	Deleted (`D`), Modified (`M`), Renamed (`R`), have their
	type (mode) changed (`T`), are Unmerged (`U`), are
	Unknown (`X`), or have had their pairing Broken (`B`).
	Any combination of the filter characters may 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.

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

-l<num>::
	-M and -C options require O(n^2) processing time where n
	is the number of potential rename/copy targets.  This
	option prevents rename/copy detection from running if
	the number of rename/copy targets exceeds the specified
	number.

-S<string>::
	Look for differences that contain the change in <string>.

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

--pickaxe-regex::
	Make the <string> not a plain string but an extended POSIX
	regex to match.

-O<orderfile>::
	Output the patch in the order specified in the
	<orderfile>, which has one shell glob pattern per line.

-R::
	Swap two inputs; that is, show differences from index or
	on-disk file to tree contents.

--relative[=<path>]::
	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.

--text::
	Treat all files as text.

-a::
	Shorthand for "--text".

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

-b::
	Shorthand for "--ignore-space-change".

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

-w::
	Shorthand for "--ignore-all-space".

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

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

--ignore-submodules::
	Ignore changes to submodules in the diff generation.

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

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