mergetool.<tool>.path::
	Override the path for the given tool.  This is useful in case
	your tool is not in the PATH.

mergetool.<tool>.cmd::
	Specify the command to invoke the specified merge tool.  The
	specified command is evaluated in shell with the following
	variables available: 'BASE' is the name of a temporary file
	containing the common base of the files to be merged, if available;
	'LOCAL' is the name of a temporary file containing the contents of
	the file on the current branch; 'REMOTE' is the name of a temporary
	file containing the contents of the file from the branch being
	merged; 'MERGED' contains the name of the file to which the merge
	tool should write the results of a successful merge.

mergetool.<tool>.hideResolved::
	Allows the user to override the global `mergetool.hideResolved` value
	for a specific tool. See `mergetool.hideResolved` for the full
	description.

mergetool.<tool>.trustExitCode::
	For a custom merge command, specify whether the exit code of
	the merge command can be used to determine whether the merge was
	successful.  If this is not set to true then the merge target file
	timestamp is checked, and the merge is assumed to have been successful
	if the file has been updated; otherwise, the user is prompted to
	indicate the success of the merge.

mergetool.meld.hasOutput::
	Older versions of `meld` do not support the `--output` option.
	Git will attempt to detect whether `meld` supports `--output`
	by inspecting the output of `meld --help`.  Configuring
	`mergetool.meld.hasOutput` will make Git skip these checks and
	use the configured value instead.  Setting `mergetool.meld.hasOutput`
	to `true` tells Git to unconditionally use the `--output` option,
	and `false` avoids using `--output`.

mergetool.meld.useAutoMerge::
	When the `--auto-merge` is given, meld will merge all non-conflicting
	parts automatically, highlight the conflicting parts, and wait for
	user decision.  Setting `mergetool.meld.useAutoMerge` to `true` tells
	Git to unconditionally use the `--auto-merge` option with `meld`.
	Setting this value to `auto` makes git detect whether `--auto-merge`
	is supported and will only use `--auto-merge` when available.  A
	value of `false` avoids using `--auto-merge` altogether, and is the
	default value.

mergetool.<vimdiff variant>.layout::
	Configure the split window layout for vimdiff's `<variant>`, which is any of `vimdiff`,
	`nvimdiff`, `gvimdiff`.
	Upon launching `git mergetool` with `--tool=<variant>` (or without `--tool`
	if `merge.tool` is configured as `<variant>`), Git will consult
	`mergetool.<variant>.layout` to determine the tool's layout. If the
	variant-specific configuration is not available, `vimdiff`'s is used as
	fallback.  If that too is not available, a default layout with 4 windows
	will be used.  To configure the layout, see the `BACKEND SPECIFIC HINTS`
ifdef::git-mergetool[]
	section.
endif::[]
ifndef::git-mergetool[]
	section in linkgit:git-mergetool[1].
endif::[]

mergetool.hideResolved::
	During a merge, Git will automatically resolve as many conflicts as
	possible and write the 'MERGED' file containing conflict markers around
	any conflicts that it cannot resolve; 'LOCAL' and 'REMOTE' normally
	represent the versions of the file from before Git's conflict
	resolution. This flag causes 'LOCAL' and 'REMOTE' to be overwritten so
	that only the unresolved conflicts are presented to the merge tool. Can
	be configured per-tool via the `mergetool.<tool>.hideResolved`
	configuration variable. Defaults to `false`.

mergetool.keepBackup::
	After performing a merge, the original file with conflict markers
	can be saved as a file with a `.orig` extension.  If this variable
	is set to `false` then this file is not preserved.  Defaults to
	`true` (i.e. keep the backup files).

mergetool.keepTemporaries::
	When invoking a custom merge tool, Git uses a set of temporary
	files to pass to the tool. If the tool returns an error and this
	variable is set to `true`, then these temporary files will be
	preserved; otherwise, they will be removed after the tool has
	exited. Defaults to `false`.

mergetool.writeToTemp::
	Git writes temporary 'BASE', 'LOCAL', and 'REMOTE' versions of
	conflicting files in the worktree by default.  Git will attempt
	to use a temporary directory for these files when set `true`.
	Defaults to `false`.

mergetool.prompt::
	Prompt before each invocation of the merge resolution program.

mergetool.guiDefault::
	Set `true` to use the `merge.guitool` by default (equivalent to
	specifying the `--gui` argument), or `auto` to select `merge.guitool`
	or `merge.tool` depending on the presence of a `DISPLAY` environment
	variable value. The default is `false`, where the `--gui` argument
	must be provided explicitly for the `merge.guitool` to be used.
