What are the differences between double-dot ".." and triple-dot "…" in Git commit ranges?

Issue

Some Git commands take commit ranges and one valid syntax is to separate two commit names with two dots .., and another syntax uses three dots ....

What are the differences between the two?

Solution

It depends on whether you’re using a log command or a diff command. In the log case, it’s in the man git-rev-parse documentation:

To exclude commits reachable from a commit, a prefix ^ notation is used. E.g. ^r1 r2 means commits reachable from r2 but exclude the ones reachable from r1.

This set operation appears so often
that there is a shorthand for it. When
you have two commits r1 and r2 (named according to the syntax explained in
SPECIFYING REVISIONS above), you can
ask for commits that are reachable
from r2 excluding those that are
reachable from r1 by “^r1 r2” and it
can be written as “r1..r2”.

A similar notation “r1…r2” is
called symmetric difference of r1 and
r2 and is defined as “r1 r2 –not
$(git merge-base –all r1 r2)”. It is
the set of commits that are
reachable from either one of r1 or r2
but not from both.

Which basically means that you’ll get all commits that are in either of the two branches, but not in both.

In the diff case, it’s in the man git-diff documentation:

  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
      <commit>. "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 HEAD instead.

Which is a bit fuzzy. Basically it means it shows only the differences in that branch compared to another branch: it looks for the last common commit with the first committish you gave it, and then diffs the second committish to that. It’s an easy way to see what changes are made in that branch, compared to this branch, without taking notice of changes in this branch only.

The .. is somewhat simpler: In the git-diff case, it’s the same as a git diff A B and just diffs A against B. In the log case, it shows all commits that are in B but not in A.

Answered By – Pieter

This Answer collected from stackoverflow, is licensed under cc by-sa 2.5 , cc by-sa 3.0 and cc by-sa 4.0

Leave a Reply

(*) Required, Your email will not be published