`merge.conflictStyle`::
	Specify the style in which conflicted hunks are written out to
	working tree files upon merge.  The default is "merge", which
	shows a +<<<<<<<+ conflict marker, changes made by one side,
	a `=======` marker, changes made by the other side, and then
	a +>>>>>>>+ marker.  An alternate style, "diff3", adds a +|||||||+
	marker and the original text before the `=======` marker.  The
	"merge" style tends to produce smaller conflict regions than diff3,
	both because of the exclusion of the original text, and because
	when a subset of lines match on the two sides, they are just pulled
	out of the conflict region.  Another alternate style, "zdiff3", is
	similar to diff3 but removes matching lines on the two sides from
	the conflict region when those matching lines appear near either
	the beginning or end of a conflict region.

`merge.defaultToUpstream`::
	If merge is called without any commit argument, merge the upstream
	branches configured for the current branch by using their last
	observed values stored in their remote-tracking branches.
	The values of the `branch.<current branch>.merge` that name the
	branches at the remote named by `branch.<current-branch>.remote`
	are consulted, and then they are mapped via `remote.<remote>.fetch`
	to their corresponding remote-tracking branches, and the tips of
	these tracking branches are merged. Defaults to true.

`merge.ff`::
	By default, Git does not create an extra merge commit when merging
	a commit that is a descendant of the current commit. Instead, the
	tip of the current branch is fast-forwarded. When set to `false`,
	this variable tells Git to create an extra merge commit in such
	a case (equivalent to giving the `--no-ff` option from the command
	line). When set to `only`, only such fast-forward merges are
	allowed (equivalent to giving the `--ff-only` option from the
	command line).

`merge.verifySignatures`::
	If true, this is equivalent to the `--verify-signatures` command
	line option. See linkgit:git-merge[1] for details.

include::fmt-merge-msg.adoc[]

`merge.renameLimit`::
	The number of files to consider in the exhaustive portion of
	rename detection during a merge.  If not specified, defaults
	to the value of `diff.renameLimit`.  If neither
	`merge.renameLimit` nor `diff.renameLimit` are specified,
	currently defaults to 7000.  This setting has no effect if
	rename detection is turned off.

`merge.renames`::
	Whether Git detects renames.  If set to `false`, rename detection
	is disabled. If set to `true`, basic rename detection is enabled.
	Defaults to the value of diff.renames.

`merge.directoryRenames`::
	Whether Git detects directory renames, affecting what happens at
	merge time to new files added to a directory on one side of
	history when that directory was renamed on the other side of
	history. Possible values are:
+
--
`false`;; Directory rename detection is disabled, meaning that such new files will be
	left behind in the old directory.
`true`;; Directory rename detection is enabled, meaning that such new files will be
	moved into the new directory.
`conflict`;; A conflict will be reported for such paths.
--
+
If `merge.renames` is `false`, `merge.directoryRenames` is ignored and treated
as `false`. Defaults to `conflict`.

`merge.renormalize`::
	Tell Git that canonical representation of files in the
	repository has changed over time (e.g. earlier commits record
	text files with _CRLF_ line endings, but recent ones use _LF_ line
	endings).  In such a repository, for each file where a
	three-way content merge is needed, Git can convert the data
	recorded in commits to a canonical form before performing a
	merge to reduce unnecessary conflicts.  For more information,
	see section "Merging branches with differing checkin/checkout
	attributes" in linkgit:gitattributes[5].

`merge.stat`::
	What, if anything, to print between `ORIG_HEAD` and the merge result
	at the end of the merge.  Possible values are:
+
--
`false`;; Show nothing.
`true`;; Show `git diff --diffstat --summary ORIG_HEAD`.
`compact`;; Show `git diff --compact-summary ORIG_HEAD`.
--
+
but any unrecognised value (e.g., a value added by a future version of
Git) is taken as `true` instead of triggering an error.  Defaults to
`true`.

`merge.autoStash`::
	When set to `true`, automatically create a temporary stash entry
	before the operation begins, and apply it after the operation
	ends.  This means that you can run merge on a dirty worktree.
	However, use with care: the final stash application after a
	successful merge might result in non-trivial conflicts.
	This option can be overridden by the `--no-autostash` and
	`--autostash` options of linkgit:git-merge[1].
	Defaults to `false`.

`merge.tool`::
	Controls which merge tool is used by linkgit:git-mergetool[1].
	The list below shows the valid built-in values.
	Any other value is treated as a custom merge tool and requires
	that a corresponding `mergetool.<tool>.cmd` variable is defined.

`merge.guitool`::
	Controls which merge tool is used by linkgit:git-mergetool[1] when the
	`-g`/`--gui` flag is specified. The list below shows the valid built-in values.
	Any other value is treated as a custom merge tool and requires that a
	corresponding `mergetool.<guitool>.cmd` variable is defined.

include::{build_dir}/mergetools-merge.adoc[]

`merge.verbosity`::
	Controls the amount of output shown by the recursive merge
	strategy.  Level 0 outputs nothing except a final error
	message if conflicts were detected. Level 1 outputs only
	conflicts, 2 outputs conflicts and file changes.  Level 5 and
	above outputs debugging information.  The default is level 2.
	Can be overridden by the `GIT_MERGE_VERBOSITY` environment variable.

`merge.<driver>.name`::
	Defines a human-readable name for a custom low-level
	merge driver.  See linkgit:gitattributes[5] for details.

`merge.<driver>.driver`::
	Defines the command that implements a custom low-level
	merge driver.  See linkgit:gitattributes[5] for details.

`merge.<driver>.recursive`::
	Names a low-level merge driver to be used when
	performing an internal merge between common ancestors.
	See linkgit:gitattributes[5] for details.
