I want a diff of all changes in a branch that is not merged to master yet.
git diff master
git diff branch..master
git diff branch...master
However, in each of these cases the diff contains content in master that has not been merged into my branch yet.
Is there a way to do a diff between my branch and master that excludes changes in master that have not been merged into my branch yet?
git diff `git merge-base master branch`..branch
Merge base is the point where
branch diverged from
Git diff supports a special syntax for this:
git diff master...branch
You must not swap the sides because then you would get the other branch. You want to know what changed in
branch since it diverged from
master, not the other way round.
You may want to replace
branch in this syntax with
HEAD or even delete it completely -- both the following display the content of the current branch since it diverged from master:
git diff master...HEAD
git diff master...
... syntax does not have the same semantics as in other Git tools. It differs from the meaning specified in
git diff [--options] <commit> <commit> [--] [<path>…]
This is to view the changes between two arbitrary
git diff [--options] <commit>..<commit> [--] [<path>…]
This is synonymous to the previous form. If
<commit> on one side is omitted, it will have the same effect as using
git diff [--options] <commit>...<commit> [--] [<path>…]
This form is to view the changes on the branch containing and up to the second
<commit>, starting at a common ancestor of both
git diff A...B" is equivalent to "
git diff $(git-merge-base A B) B". You can omit any one of
<commit>, which has the same effect as using
Just in case you are doing something exotic, it should be noted that all of the
<commit> in the above description, except in the last two forms that use ".." notations, can be any
For a more complete list of ways to spell
<commit>, see "SPECIFYING REVISIONS" section in
gitrevisions. However, "diff" is about comparing two endpoints, not ranges, and the range notations ("
<commit>..<commit>" and "
<commit>...<commit>") do not mean a range as defined in the "SPECIFYING RANGES" section in