What are the differences between the following commands?:
git diff foo master # a
git diff foo..master # b
git diff foo...master # c
$ git diff topic master <1>
$ git diff topic..master <2>
$ git diff topic...master <3>
- Changes between the tips of the topic and the master branches.
- Same as above.
- Changes that occurred on the master branch since when the topic branch was started off it.
Since I'd already created these images, I thought it might be worth using them in another answer, although the description of the difference between
.. (dot-dot) and
... (dot-dot-dot) is essentially the same as in manojlds's answer.
git diff typically¹ only shows you the difference between the states of the tree between exactly two points in the commit graph. The
... notations in
git diff have the following meanings:
In other words,
git diff foo..bar is exactly the same as
git diff foo bar; both will show you the difference between the tips of the two branches
bar. On the other hand,
git diff foo...bar will show you the difference between the "merge base" of the two branches and the tip of
bar. The "merge base" is usually the last commit in common between those two branches, so this command will show you the changes that your work on
bar has introduced, while ignoring everything that has been done on
foo in the mean time.
That's all you need to know about the
... notations in
git diff. However...
... a common source of confusion here is that
... mean subtly different things when used in a command such as
git log that expects a set of commits as one or more arguments. (These commands all end up using
git rev-list to parse a list of commits from their arguments.)
The meaning of
git log can be shown graphically as below:
git rev-list foo..bar shows you everything on branch
bar that isn't also on branch
foo. On the other hand,
git rev-list foo...bar shows you all the commits that are in either
bar, but not both. The third diagram just shows that if you list the two branches, you get the commits that are in either one or both of them.
Well, I find that all a bit confusing, anyway, and I think the commit graph diagrams help :)
¹ I only say "typically" since when resolving merge conflicts, for example,
git diff will show you a three-way merge.