// 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::
-u::
	Generate patch (see section on generating patches).
	{git-diff? This is the default.}
endif::git-format-patch[]

-U<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 the distribution of relative amount of changes (number of lines added or
	removed) for each sub-directory. Directories with changes below
	a cut-off percent (3% by default) are not shown. The cut-off percent
	can be set with "--dirstat=limit". Changes in a child directory is not
	counted for the parent directory, unless "--cumulative" is used.

--dirstat-by-file[=limit]::
	Same as --dirstat, but counts changed files instead of 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. 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 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 "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 (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 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.

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

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

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