git-merge-base(1)
=================

NAME
----
git-merge-base - Find as good common ancestors as possible for a merge


SYNOPSIS
--------
[verse]
'git merge-base' [-a|--all] <commit> <commit>...
'git merge-base' [-a|--all] --octopus <commit>...
'git merge-base' --is-ancestor <commit> <commit>
'git merge-base' --independent <commit>...
'git merge-base' --fork-point <ref> [<commit>]

DESCRIPTION
-----------

'git merge-base' finds best common ancestor(s) between two commits to use
in a three-way merge.  One common ancestor is 'better' than another common
ancestor if the latter is an ancestor of the former.  A common ancestor
that does not have any better common ancestor is a 'best common
ancestor', i.e. a 'merge base'.  Note that there can be more than one
merge base for a pair of commits.

OPERATION MODES
---------------

As the most common special case, specifying only two commits on the
command line means computing the merge base between the given two commits.

More generally, among the two commits to compute the merge base from,
one is specified by the first commit argument on the command line;
the other commit is a (possibly hypothetical) commit that is a merge
across all the remaining commits on the command line.

As a consequence, the 'merge base' is not necessarily contained in each of the
commit arguments if more than two commits are specified. This is different
from linkgit:git-show-branch[1] when used with the `--merge-base` option.

--octopus::
	Compute the best common ancestors of all supplied commits,
	in preparation for an n-way merge.  This mimics the behavior
	of 'git show-branch --merge-base'.

--independent::
	Instead of printing merge bases, print a minimal subset of
	the supplied commits with the same ancestors.  In other words,
	among the commits given, list those which cannot be reached
	from any other.  This mimics the behavior of 'git show-branch
	--independent'.

--is-ancestor::
	Check if the first <commit> is an ancestor of the second <commit>,
	and exit with status 0 if true, or with status 1 if not.
	Errors are signaled by a non-zero status that is not 1.

--fork-point::
	Find the point at which a branch (or any history that leads
	to <commit>) forked from another branch (or any reference)
	<ref>. This does not just look for the common ancestor of
	the two commits, but also takes into account the reflog of
	<ref> to see if the history leading to <commit> forked from
	an earlier incarnation of the branch <ref> (see discussion
	on this mode below).

OPTIONS
-------
-a::
--all::
	Output all merge bases for the commits, instead of just one.

DISCUSSION
----------

Given two commits 'A' and 'B', `git merge-base A B` will output a commit
which is reachable from both 'A' and 'B' through the parent relationship.

For example, with this topology:

	         o---o---o---B
	        /
	---o---1---o---o---o---A

the merge base between 'A' and 'B' is '1'.

Given three commits 'A', 'B' and 'C', `git merge-base A B C` will compute the
merge base between 'A' and a hypothetical commit 'M', which is a merge
between 'B' and 'C'.  For example, with this topology:

	       o---o---o---o---C
	      /
	     /   o---o---o---B
	    /   /
	---2---1---o---o---o---A

the result of `git merge-base A B C` is '1'.  This is because the
equivalent topology with a merge commit 'M' between 'B' and 'C' is:


	       o---o---o---o---o
	      /                 \
	     /   o---o---o---o---M
	    /   /
	---2---1---o---o---o---A

and the result of `git merge-base A M` is '1'.  Commit '2' is also a
common ancestor between 'A' and 'M', but '1' is a better common ancestor,
because '2' is an ancestor of '1'.  Hence, '2' is not a merge base.

The result of `git merge-base --octopus A B C` is '2', because '2' is
the best common ancestor of all commits.

When the history involves criss-cross merges, there can be more than one
'best' common ancestor for two commits.  For example, with this topology:

	---1---o---A
	    \ /
	     X
	    / \
	---2---o---o---B

both '1' and '2' are merge-bases of A and B.  Neither one is better than
the other (both are 'best' merge bases).  When the `--all` option is not given,
it is unspecified which best one is output.

A common idiom to check "fast-forward-ness" between two commits A
and B is (or at least used to be) to compute the merge base between
A and B, and check if it is the same as A, in which case, A is an
ancestor of B.  You will see this idiom used often in older scripts.

	A=$(git rev-parse --verify A)
	if test "$A" = "$(git merge-base A B)"
	then
		... A is an ancestor of B ...
	fi

In modern git, you can say this in a more direct way:

	if git merge-base --is-ancestor A B
	then
		... A is an ancestor of B ...
	fi

instead.

Discussion on fork-point mode
-----------------------------

After working on the `topic` branch created with `git checkout -b
topic origin/master`, the history of remote-tracking branch
`origin/master` may have been rewound and rebuilt, leading to a
history of this shape:

			 o---B2
	                /
	---o---o---B1--o---o---o---B (origin/master)
	        \
		 B0
	          \
		   D0---D1---D (topic)

where `origin/master` used to point at commits B0, B1, B2 and now it
points at B, and your `topic` branch was started on top of it back
when `origin/master` was at B0, and you built three commits, D0, D1,
and D, on top of it.  Imagine that you now want to rebase the work
you did on the topic on top of the updated origin/master.

In such a case, `git merge-base origin/master topic` would return the
parent of B0 in the above picture, but B0^..D is *not* the range of
commits you would want to replay on top of B (it includes B0, which
is not what you wrote; it is a commit the other side discarded when
it moved its tip from B0 to B1).

`git merge-base --fork-point origin/master topic` is designed to
help in such a case.  It takes not only B but also B0, B1, and B2
(i.e. old tips of the remote-tracking branches your repository's
reflog knows about) into account to see on which commit your topic
branch was built and finds B0, allowing you to replay only the
commits on your topic, excluding the commits the other side later
discarded.

Hence

    $ fork_point=$(git merge-base --fork-point origin/master topic)

will find B0, and

    $ git rebase --onto origin/master $fork_point topic

will replay D0, D1 and D on top of B to create a new history of this
shape:

			 o---B2
			/
	---o---o---B1--o---o---o---B (origin/master)
		\                   \
		 B0                  D0'--D1'--D' (topic - updated)
		  \
		   D0---D1---D (topic - old)

A caveat is that older reflog entries in your repository may be
expired by `git gc`.  If B0 no longer appears in the reflog of the
remote-tracking branch `origin/master`, the `--fork-point` mode
obviously cannot find it and fails, avoiding to give a random and
useless result (such as the parent of B0, like the same command
without the `--fork-point` option gives).

Also, the remote-tracking branch you use the `--fork-point` mode
with must be the one your topic forked from its tip.  If you forked
from an older commit than the tip, this mode would not find the fork
point (imagine in the above sample history B0 did not exist,
origin/master started at B1, moved to B2 and then B, and you forked
your topic at origin/master^ when origin/master was B1; the shape of
the history would be the same as above, without B0, and the parent
of B1 is what `git merge-base origin/master topic` correctly finds,
but the `--fork-point` mode will not, because it is not one of the
commits that used to be at the tip of origin/master).


See also
--------
linkgit:git-rev-list[1],
linkgit:git-show-branch[1],
linkgit:git-merge[1]

GIT
---
Part of the linkgit:git[1] suite
