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

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

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

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

--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
link:diffcore.html[diffcore documentation].
