How to find the most recent common ancestor of two Git branches?
You are looking for git merge-base
. Usage:
$ git merge-base branch2 branch3
050dc022f3a65bdc78d97e2b1ac9b595a924c3f2
git diff master...feature
shows all the new commits of your current (possibly multi-commit) feature branch.
man git-diff
documents that:
git diff A...B
is the same as:
git diff $(git merge-base A B) B
but the ...
is easier to type and remember.
As mentioned by Dave, the special case of HEAD
can be omitted. So:
git diff master...HEAD
is the same as:
git diff master...
which is enough if the current branch is feature
.
Finally, remember that order matters! Doing git diff feature...master
will show changes that are on master
not on feature
.
I wish more git commands would support that syntax, but I don't think they do. And some even have different semantics for ...
: What are the differences between double-dot ".." and triple-dot "..." in Git commit ranges?
git diff master...
in the special case of diffing to HEAD
git diff origin/branchname...
git diff branchA..branchB
and git diff branchA...branchB
?
As noted in a prior answer, although git merge-base
works,
$ git merge-base myfeature develop
050dc022f3a65bdc78d97e2b1ac9b595a924c3f2
If myfeature
is the current branch, as is common, you can use --fork-point
:
$ git merge-base --fork-point develop
050dc022f3a65bdc78d97e2b1ac9b595a924c3f2
This argument works only in sufficiently recent versions of git. Unfortunately it doesn't always work, however, and it is not clear why. Please refer to the limitations noted toward the end of this answer.
For full commit info, consider:
$ git log -1 $(git merge-base --fork-point develop)
git version 2.14.1.windows.1
. Running git merge-base --fork-point branch2
with a branch (with its own commits) that I know has forked from the current branch doesn't yield any result, whereas git merge-base branch1 branch2
correctly shows the fork point. What could be the problem?
branch2
and then run git merge-base --fork-point branch1
.
gitk
, etc. to see what the tree looks like. Maybe you will get your answer.
git merge-base branch1 branch2
. But what's odd is that --fork-point
gives nothing either way. Have you confirmed it works for you as intended?
With gitk
you can view the two branches graphically:
gitk branch1 branch2
And then it's easy to find the common ancestor in the history of the two branches.
Success story sharing
git log master...HEAD
--octopus
flag to get the right result. The obvious-but-wronggit merge-base branch1 branch2 branch3
will give you a commit, but, as described in the Discussion section in the docs, it isn't necessarily a common ancestor of all three branches.