#pragma section-numbers 2 = Merge Tool Configuration = How to customize which merge tools Mercurial chooses. <> == Introduction == Mercurial delegates most non-trivial file-level merging operations to an external program, called a merge tool. In most installations, Mercurial will automatically search your system for the 'best' available tool, based on a set of known tools in its [[Source:contrib/mergetools.hgrc|global configuration]]. This tool choice can be extensively customized based on various properties like filename, binary data, running in a GUI, etc. == Defining a merge tool == To define a merge tool, add something like the following in [[.hgrc]]: {{{ [merge-tools] mymergetool.something = something }}} which will define ''mymergetool'' (the left hand side until the first dot). The option values defines the behaviour of the tool. For each file changed in both parents Mercurial chooses a merge tool. The merge tool is chosen from the list of file pattern matches in the `[merge-patterns]` section followed by all tools sorted by decreasing `priority` order. The list is filtered for whether the `executable` (defaulting to ''mymergetool'') can be found, whether it supports symlinks or binary files, and whether a GUI is available. To bypass the priority scheme and set the default tool directly, specify the merge tool in `[ui]` section `merge` option. For backwards compatibility, the tool `hgmerge` is implicitly added with lowest priority. If the chosen merge tool's `premerge` setting is True then an internal merge is attempted. If the premerge reports no conflicts, then the result will silently be used without running the actual merge tool. The merge tool is run with an argument list from `args` with the following variables expanded: * `$output` expands to the existing ''file'' which already contains the version from the first parent - and this is also where the result of the merge ends up / must end up * `$local` expands to ''file.orig'' which is created as a copy of ''file'' in the working directory version - it thus contains the unmerged version from the first parent * `$base` expands to a temporary file which is created with the version from the merge ancestor * `$other` expands to a temporary file which is created with the version from the new second parent revision which the first parent is merged with Example configuration: {{{ [merge-tools] mymergetool.priority = 100 mymergetool.premerge = False mymergetool.args = $local $other $base -o $output myimgmerge = [merge-patterns] **.jpg = myimgmerge **.exe = internal:fail }}} Tool options include: * args - the arguments to pass (defaults to $local $base $other) * premerge - whether to attempt internal merge first (defaults to True) * executable - executable name or path (defaults to ) * binary - supports binary files (False) * symlink - supports symlinks (False) * gui - requires a GUI (False) * priority - priority of this tool (0) executable can also be specified using a python script and function. example: {{{ mymergetool.executable=python:c:\somepython.py:mergefn }}} where somepython.py contains a function with signature: {{{ def mergefn(ui, repo, args, **kwargs): }}} where args is list of args passed to merge tool. (by default, expanded: $local $base $other) == Internal merge with conflict markers == Mercurial has a selection of "internal" tools for various purposes (see [[Topic:merge-tools]] for full details). The most interesting of these is `internal:merge3`, which provides a traditional merge with conflict markers. To set this as your default tool, add the following to you config: {{{ [ui] merge = internal:merge3 }}} Rather than relying on a dedicated merge tool, care will be needed to manually edit the text. The good news is that many code editors provide hints and UI support for fixing conflicts. After manually resolving the conflict, follow the instructions from hg [[Cmd:status]] and use the [[Cmd:resolve]] command to keep the manually resolve the conflicts. == See also == * [[Cmd:merge]] and [[Cmd:update]] - command that may merge files * [[Cmd:resolve]] - reattempting file merges and making manual merges * [[Topic:merge-tools]] * [[TipsAndTricks#mergemineortheir|How to keep "My" or "Their" files when doing merge]] * [[Topic:config]] ---- CategoryHowTo