I know you've seen this, but here's are the two snippets from the docs:
git diff [--options] <commit>..<commit> [--] [<path>...]
This is synonymous to the previous form. (git diff [--options] <commit> <commit> [--] [<path>...]
)
git diff [--options] <commit>...<commit> [--] [<path>...]
This form is to view the changes on the branch containing and up to the second , starting at a common ancestor of both . git diff A...B
is equivalent to git diff $(git-merge-base A B) B
.
I can see how this might confuse you - the ..
and ...
notation for git diff don't mean the same thing as they do for revision listing (e.g. for git log).
So suppose our history looks like this:
A - B - C - D - E (master)
\
F - G (lab)
The first snippet tells us that git diff master..lab
is equivalent to git diff master lab
, in other words git diff E G
. This will tell us the direct differences between E
and G
- i.e. we'll see the combination of F
, G
, and the reverse patches of D
and E
.
On the other hand, git diff master...lab
is equivalent to git diff C G
- it shows the changes up to the second commit (lab) starting from the common ancestor of the two (the merge base of master and lab, which is C
). The diff we see will be the combination of F
and G
. It does not include D
and E
.
The use case for the triple dot notation is when you want to see all the work you've done on your topic branch (lab) that's not merged into master yet. You don't care what else has been done on master - you're only interested in the work you're doing on your topic branch.