`diff.autoRefreshIndex`::
	When using `git diff` to compare with work tree
	files, do not consider stat-only changes as changed.
	Instead, silently run `git update-index --refresh` to
	update the cached stat information for paths whose
	contents in the work tree match the contents in the
	index.  This option defaults to `true`.  Note that this
	affects only `git diff` Porcelain, and not lower level
	`diff` commands such as `git diff-files`.

`diff.dirstat`::
ifdef::git-diff[]
	A comma separated list of `--dirstat` parameters specifying the
	default behavior of the `--dirstat` option to `git diff` and friends.
endif::git-diff[]
ifndef::git-diff[]
	A comma separated list of `--dirstat` parameters specifying the
	default behavior of the `--dirstat` option to linkgit:git-diff[1]
	and friends.
endif::git-diff[]
	The defaults can be overridden on the command line
	(using `--dirstat=<param>,...`). The fallback defaults
	(when not changed by `diff.dirstat`) are `changes,noncumulative,3`.
	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:
`files,10,cumulative`.

`diff.statNameWidth`::
	Limit the width of the filename part in `--stat` output. If set, applies
	to all commands generating `--stat` output except `format-patch`.

`diff.statGraphWidth`::
	Limit the width of the graph part in `--stat` output. If set, applies
	to all commands generating `--stat` output except `format-patch`.

`diff.context`::
	Generate diffs with _<n>_ lines of context instead of the default
	of 3. This value is overridden by the `-U` option.

`diff.interHunkContext`::
	Show the context between diff hunks, up to the specified number
	of lines, thereby fusing the hunks that are close to each other.
	This value serves as the default for the `--inter-hunk-context`
	command line option.

`diff.external`::
	If this config variable is set, diff generation is not
	performed using the internal diff machinery, but using the
	given command.  Can be overridden with the `GIT_EXTERNAL_DIFF`
	environment variable.  The command is called with parameters
	as described under "git Diffs" in linkgit:git[1].  Note: if
	you want to use an external diff program only on a subset of
	your files, you might want to use linkgit:gitattributes[5] instead.

`diff.trustExitCode`::
	If this boolean value is set to `true` then the
	`diff.external` command is expected to return exit code
	0 if it considers the input files to be equal or 1 if it
	considers them to be different, like `diff`(1).
	If it is set to `false`, which is the default, then the command
	is expected to return exit code `0` regardless of equality.
	Any other exit code causes Git to report a fatal error.

`diff.ignoreSubmodules`::
	Sets the default value of `--ignore-submodules`. Note that this
	affects only `git diff` Porcelain, and not lower level `diff`
	commands such as `git diff-files`. `git checkout`
	and `git switch` also honor
	this setting when reporting uncommitted changes. Setting it to
	`all` disables the submodule summary normally shown by `git commit`
	and `git status` when `status.submoduleSummary` is set unless it is
	overridden by using the `--ignore-submodules` command-line option.
	The `git submodule` commands are not affected by this setting.
	By default this is set to untracked so that any untracked
	submodules are ignored.

`diff.mnemonicPrefix`::
	If set, `git diff` uses a prefix pair that is different from the
	standard `a/` and `b/` depending on what is being compared.  When
	this configuration is in effect, reverse diff output also swaps
	the order of the prefixes:
`git diff`;;
	compares the (i)ndex and the (w)ork tree;
`git diff HEAD`;;
	 compares a (c)ommit and the (w)ork tree;
`git diff --cached`;;
	compares a (c)ommit and the (i)ndex;
`git diff HEAD:<file1> <file2>`;;
	compares an (o)bject and a (w)ork tree entity;
`git diff --no-index <a> <b>`;;
	compares two non-git things _<a>_ and _<b>_.

`diff.noPrefix`::
	If set, `git diff` does not show any source or destination prefix.

`diff.srcPrefix`::
	If set, `git diff` uses this source prefix. Defaults to `a/`.

`diff.dstPrefix`::
	If set, `git diff` uses this destination prefix. Defaults to `b/`.

`diff.relative`::
	If set to `true`, `git diff` does not show changes outside of the directory
	and show pathnames relative to the current directory.

`diff.orderFile`::
	File indicating how to order files within a diff.
ifdef::git-diff[]
	See the `-O` option for details.
endif::git-diff[]
ifndef::git-diff[]
	See the `-O` option to linkgit:git-diff[1] for details.
endif::git-diff[]
	If `diff.orderFile` is a relative pathname, it is treated as
	relative to the top of the working tree.

`diff.renameLimit`::
	The number of files to consider in the exhaustive portion of
	copy/rename detection; equivalent to the `git diff` option
	`-l`.  If not set, the default value is currently 1000.  This
	setting has no effect if rename detection is turned off.

`diff.renames`::
	Whether and how Git detects renames.  If set to `false`,
	rename detection is disabled. If set to `true`, basic rename
	detection is enabled.  If set to `copies` or `copy`, Git will
	detect copies, as well.  Defaults to `true`.  Note that this
	affects only `git diff` Porcelain like linkgit:git-diff[1] and
	linkgit:git-log[1], and not lower level commands such as
	linkgit:git-diff-files[1].

`diff.suppressBlankEmpty`::
	A boolean to inhibit the standard behavior of printing a space
	before each empty output line. Defaults to `false`.

`diff.submodule`::
	Specify the format in which differences in submodules are
	shown.  The `short` format just shows the names of the commits
	at the beginning and end of the range. The `log` format lists
	the commits in the range like linkgit:git-submodule[1] `summary`
	does. The `diff` format shows an inline diff of the changed
	contents of the submodule. Defaults to `short`.

`diff.wordRegex`::
	A POSIX Extended Regular Expression used to determine what is a "word"
	when performing word-by-word difference calculations.  Character
	sequences that match the regular expression are "words", all other
	characters are *ignorable* whitespace.

`diff.<driver>.command`::
	The custom diff driver command.  See linkgit:gitattributes[5]
	for details.

`diff.<driver>.trustExitCode`::
	If this boolean value is set to `true` then the
	`diff.<driver>.command` command is expected to return exit code
	0 if it considers the input files to be equal or 1 if it
	considers them to be different, like `diff`(1).
	If it is set to `false`, which is the default, then the command
	is expected to return exit code 0 regardless of equality.
	Any other exit code causes Git to report a fatal error.

`diff.<driver>.xfuncname`::
	The regular expression that the diff driver should use to
	recognize the hunk header.  A built-in pattern may also be used.
	See linkgit:gitattributes[5] for details.

`diff.<driver>.binary`::
	Set this option to `true` to make the diff driver treat files as
	binary.  See linkgit:gitattributes[5] for details.

`diff.<driver>.textconv`::
	The command that the diff driver should call to generate the
	text-converted version of a file.  The result of the
	conversion is used to generate a human-readable diff.  See
	linkgit:gitattributes[5] for details.

`diff.<driver>.wordRegex`::
	The regular expression that the diff driver should use to
	split words in a line.  See linkgit:gitattributes[5] for
	details.

`diff.<driver>.cachetextconv`::
	Set this option to `true` to make the diff driver cache the text
	conversion outputs.  See linkgit:gitattributes[5] for details.

`diff.indentHeuristic`::
	Set this option to `false` to disable the default heuristics
	that shift diff hunk boundaries to make patches easier to read.

`diff.algorithm`::
	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".
--
+

`diff.wsErrorHighlight`::
	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`.  The
	whitespace errors are colored with `color.diff.whitespace`.
	The command line option `--ws-error-highlight=<kind>`
	overrides this setting.

`diff.colorMoved`::
	If set to either a valid _<mode>_ or a `true` value, moved lines
	in a diff are colored differently.
ifdef::git-diff[]
	For details of valid modes see `--color-moved`.
endif::git-diff[]
ifndef::git-diff[]
	For details of valid modes see `--color-moved` in linkgit:git-diff[1].
endif::git-diff[]
	If simply set to `true` the default color mode will be used. When
	set to `false`, moved lines are not colored.

`diff.colorMovedWS`::
	When moved lines are colored using e.g. the `diff.colorMoved` setting,
	this option controls the mode how spaces are treated.
	For details of valid modes see `--color-moved-ws` in linkgit:git-diff[1].
