Home Explore Blog CI



git

1st chunk of `Documentation/git-merge-tree.adoc`
b9e4bfd617b56705833b10746e955e8eea2b0b78f819dc840000000100000fa0
git-merge-tree(1)
=================

NAME
----
git-merge-tree - Perform merge without touching index or working tree


SYNOPSIS
--------
[verse]
'git merge-tree' [--write-tree] [<options>] <branch1> <branch2>
'git merge-tree' [--trivial-merge] <base-tree> <branch1> <branch2> (deprecated)

[[NEWMERGE]]
DESCRIPTION
-----------

This command has a modern `--write-tree` mode and a deprecated
`--trivial-merge` mode.  With the exception of the
<<DEPMERGE,DEPRECATED DESCRIPTION>> section at the end, the rest of
this documentation describes the modern `--write-tree` mode.

Performs a merge, but does not make any new commits and does not read
from or write to either the working tree or index.

The performed merge will use the same features as the "real"
linkgit:git-merge[1], including:

  * three way content merges of individual files
  * rename detection
  * proper directory/file conflict handling
  * recursive ancestor consolidation (i.e. when there is more than one
    merge base, creating a virtual merge base by merging the merge bases)
  * etc.

After the merge completes, a new toplevel tree object is created.  See
`OUTPUT` below for details.

OPTIONS
-------

--stdin::
	Read the commits to merge from the standard input rather than
	the command-line. See <<INPUT,INPUT FORMAT>> below for more
	information.  Implies `-z`.

-z::
	Do not quote filenames in the <Conflicted file info> section,
	and end each filename with a NUL character rather than
	newline.  Also begin the messages section with a NUL character
	instead of a newline.  See <<OUTPUT,OUTPUT>> below for more
	information.

--name-only::
	In the Conflicted file info section, instead of writing a list
	of (mode, oid, stage, path) tuples to output for conflicted
	files, just provide a list of filenames with conflicts (and
	do not list filenames multiple times if they have multiple
	conflicting stages).

--[no-]messages::
	Write any informational messages such as "Auto-merging <path>"
	or CONFLICT notices to the end of stdout.  If unspecified, the
	default is to include these messages if there are merge
	conflicts, and to omit them otherwise.

--quiet::
	Disable all output from the program.  Useful when you are only
	interested in the exit status.  Allows merge-tree to exit
	early when it finds a conflict, and allows it to avoid writing
	most objects created by merges.

--allow-unrelated-histories::
	merge-tree will by default error out if the two branches specified
	share no common history.  This flag can be given to override that
	check and make the merge proceed anyway.

--merge-base=<tree-ish>::
	Instead of finding the merge-bases for <branch1> and <branch2>,
	specify a merge-base for the merge, and specifying multiple bases is
	currently not supported. This option is incompatible with `--stdin`.
+
As the merge-base is provided directly, <branch1> and <branch2> do not need
to specify commits; trees are enough.

-X<option>::
--strategy-option=<option>::
	Pass the merge strategy-specific option through to the merge strategy.
	See linkgit:git-merge[1] for details.

[[OUTPUT]]
OUTPUT
------

For a successful merge, the output from git-merge-tree is simply one
line:

	<OID of toplevel tree>

Whereas for a conflicted merge, the output is by default of the form:

	<OID of toplevel tree>
	<Conflicted file info>
	<Informational messages>

These are discussed individually below.

However, there is an exception.  If `--stdin` is passed, then there is
an extra section at the beginning, a NUL character at the end, and then
all the sections repeat for each line of input.  Thus, if the first merge
is conflicted and the second is clean, the output would be of the form:

	<Merge status>
	<OID of toplevel tree>
	<Conflicted file info>
	<Informational messages>
	NUL
	<Merge status>
	<OID of toplevel tree>
	NUL

[[MS]]
Merge status
~~~~~~~~~~~~

This is an integer status followed by a NUL character.  The integer status is:

     0: merge had conflicts
     1: merge was clean

[[OIDTLT]]
OID of

Title: Git Merge Tree Documentation
Summary
The git-merge-tree command performs a merge without modifying the index or working tree, using features like three-way content merges, rename detection, and conflict handling, and creates a new toplevel tree object upon completion.