description of merge variable expansion
converted to 1.6 markup
|Deletions are marked like this.||Additions are marked like this.|
|Line 1:||Line 1:|
|To define a merge tool, add something like the following in [:.hgrc]:||To define a merge tool, add something like the following in [[.hgrc]]:|
|Line 52:||Line 52:|
|* [:MergeProgram]||* [[MergeProgram]]|
|Line 56:||Line 56:|
|In February 2008, [:mpm:Matt Mackall] contributed this new [:Merge:merge] tool configuration feature. This feature is available in version 1.0 (see [:WhatsNew]).||In February 2008, [[mpm|Matt Mackall]] contributed this new [[Merge|merge]] tool configuration feature. This feature is available in version 1.0 (see [[WhatsNew]]).|
|Line 58:||Line 58:|
| * "[http://selenic.com/repo/hg/rev/5af5f0f9d724 merge: allow smarter tool configuration]" in [http://selenic.com/repo/hg/shortlog main Mercurial repository] (changesets starting with 5af5f0f9d724)
* "[http://selenic.com/pipermail/mercurial/2008-February/016923.html New merge tool system in mainline]", posting by Matt Mackall, Feb 3, 2008, [http://selenic.com/pipermail/mercurial/ Mercurial mailing list]
| * "[[http://selenic.com/repo/hg/rev/5af5f0f9d724|merge: allow smarter tool configuration]]" in [[http://selenic.com/repo/hg/shortlog|main Mercurial repository]] (changesets starting with 5af5f0f9d724)
* "[[http://selenic.com/pipermail/mercurial/2008-February/016923.html|New merge tool system in mainline]]", posting by Matt Mackall, Feb 3, 2008, [[http://selenic.com/pipermail/mercurial/|Mercurial mailing list]]
|Line 62:||Line 62:|
|To have the internal merge with the conflict markers for example in [:TortoiseHg] set||To have the internal merge with the conflict markers for example in [[TortoiseHg]] set|
|Line 70:||Line 70:|
|See [:TipsAndTricks#mergemineortheir:How to keep "My" or "Their" files when doing merge] for an example on how you can override merge configuration on the command line.||See [[TipsAndTricks#mergemineortheir|How to keep "My" or "Their" files when doing merge]] for an example on how you can override merge configuration on the command line.|
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 gui is available. To bypass the priority scheme and set the default tool directly, specify the merge tool in [ui] sections merge option. For backwards compatibility the tool hgmerge is implicitly added with lowest priority.
If the chosen merge tools premerge is True then an internal merge is attempted, and if it seems successful then the result it will silently be used without running the actual merge tool.
The merge tool is run with an argument list of 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 /tmp/file~base.* which is created with the version from the common ancestor revision (see hg debugancestor)
$other expands to /tmp/file~other.* which is created with the version from the new second parent revision which the first parent is merged with
[merge-tools] mymergetool.priority = 100 mymergetool.premerge = False mymergetool.args = $local $other $base -o $output myimgmerge = [merge-patterns] **.jpg = myimgmerge **.exe = internal:fail
Further tool options include:
<tool>.args - the arguments to pass (defaults to $local $base $other) <tool>.executable - executable name or path (defaults to <tool>) <tool>.binary - supports binary files (False) <tool>.symlinks - supports symlinks (False) <tool>.gui - requires a GUI (False) <tool>.priority - priority of this tool (0) ..etc.
If no mergetool is found then the internal simplemerge tool internal:merge is used. There are also three other internal tools: internal:local, internal:other, and internal:fail.
Merge tool settings suitable for a global configuration file (and roughly equivalent to the ugly old hgmerge script) can be found in contrib/mergetools.hgrc. People building binary packages will want to use this.
1. Choosing internal merge with conflict markers
To have the internal merge with the conflict markers for example in TortoiseHg set
[ui] merge = internal:merge
2. Overriding merge.ui configuration from the command line
See How to keep "My" or "Their" files when doing merge for an example on how you can override merge configuration on the command line.