# Three dot notion used inconsitent?

4 messages from 2015-11-18 to 2015-11-20. Participants: Lars Schneider, Johannes Löthberg, Andreas Schwab, Michael J Gruber.
Thread: https://gitlist.dev/t/40824

## Lars Schneider, 2015-11-18 10:31

Subject: Three dot notion used inconsitent?
Message-ID: <1CDF2D38-B73A-4C49-BC10-1F3BA1873733@gmail.com>
URL: https://gitlist.dev/e/1CDF2D38-B73A-4C49-BC10-1F3BA1873733%40gmail.com

```
Hi,

I just stumbled across the this:

git diff branchA...branchB
--> gives me the diff between (the common ancestor of A and B) and B. That means I never see changes on branchA.

git log branchA...branchB
--> gives me the commits reachable from A and B. That includes changes from branchA.

Is this because of a design decision that I do not (yet) understand or is this inconsistent for historical reasons?

Thanks,
Lars
```

## Johannes Löthberg, 2015-11-18 11:02

Subject: Re: Three dot notion used inconsitent?
Message-ID: <20151118110213.GA24055@zorg.kyriasis.com>
URL: https://gitlist.dev/e/20151118110213.GA24055%40zorg.kyriasis.com
In-Reply-To: <1CDF2D38-B73A-4C49-BC10-1F3BA1873733@gmail.com>

```
On 18/11, Lars Schneider wrote:
>git diff branchA...branchB
>--> gives me the diff between (the common ancestor of A and B) and B. That means I never see changes on branchA.
>
>git log branchA...branchB
>--> gives me the commits reachable from A and B. That includes changes from branchA.
>
>Is this because of a design decision that I do not (yet) understand or is this inconsistent for historical reasons?
>

The standard meaning of A...B is all the commits reachable from A or B, 
but not from both. (See gitrevisions(7) for more info.)

git-diff has its own nonstandard definition, where A...B is defined as 
all the commits from a comman ancestor of A and B, up to B.

-- 
Sincerely,
  Johannes Löthberg
  PGP Key ID: 0x50FB9B273A9D0BB5
  https://theos.kyriasis.com/~kyrias/

```

## Andreas Schwab, 2015-11-18 17:49

Subject: Re: Three dot notion used inconsitent?
Message-ID: <87lh9vp59u.fsf@igel.home>
URL: https://gitlist.dev/e/87lh9vp59u.fsf%40igel.home
In-Reply-To: <1CDF2D38-B73A-4C49-BC10-1F3BA1873733@gmail.com>

```
Lars Schneider <larsxschneider@gmail.com> writes:

> git diff branchA...branchB
> --> gives me the diff between (the common ancestor of A and B) and B. That means I never see changes on branchA.
>
> git log branchA...branchB
> --> gives me the commits reachable from A and B. That includes changes from branchA.
>
> Is this because of a design decision that I do not (yet) understand or is this inconsistent for historical reasons?

git diff operates on two revisions.  That is inherently incompatible
with the usual meaning of A...B and A..B, which are set operations on
the revision history.  That git diff accepts this syntax is only for
convenience.

Andreas.

-- 
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 58CA 54C7 6D53 942B 1756  01D3 44D5 214B 8276 4ED5
"And now for something completely different."

```

## Michael J Gruber, 2015-11-20 09:53

Subject: Re: Three dot notion used inconsitent?
Message-ID: <564EED85.3080706@drmicha.warpmail.net>
URL: https://gitlist.dev/e/564EED85.3080706%40drmicha.warpmail.net
In-Reply-To: <87lh9vp59u.fsf@igel.home>

```
Andreas Schwab venit, vidit, dixit 18.11.2015 18:49:
> Lars Schneider <larsxschneider@gmail.com> writes:
> 
>> git diff branchA...branchB
>> --> gives me the diff between (the common ancestor of A and B) and B. That means I never see changes on branchA.
>>
>> git log branchA...branchB
>> --> gives me the commits reachable from A and B. That includes changes from branchA.
>>
>> Is this because of a design decision that I do not (yet) understand or is this inconsistent for historical reasons?
> 
> git diff operates on two revisions.  That is inherently incompatible
> with the usual meaning of A...B and A..B, which are set operations on
> the revision history.  That git diff accepts this syntax is only for
> convenience.

That convenience can be a bit misleading, though, as the OP points out.
Just to spell this out because the other response (not the one I'm
replying to) could be misunderstood:

git diff A..B is the diff between (the trees in commits) A and B. It
will show you the "changes" that are only in A with "-", the changes
that are only in B with "+" - that is, if you want to think about diffs
as "positive changes" to a "virtual common base tree".

[ If p are the plus lines and m the minus lines, the diff says
    B = A + p - m = (A-m) + p
<=> A = B - p + m = (B-p) + m
<=> B-p = A-m (virtual common base tree) ]

git log A..B will show you all commits that are in (=reachable from) B
but not in A. That is, it will show you all commits between the "most
recent" common ancestor (let's call it C) and B (including B), but not
those between C and A (and not A either).

git log A...B will show you all commits "specific to A and B", i.e.
those between C and B and those between C and A (including A and B,
excluding C).

git diff A...B will show you the diff between C and B.

So, both "diff A..B" and "log A...B" show changes/commits introduced by
A only or B only.

"diff A...B" and "log A..B" show changes/commits introduced by B only.

Maybe there's a way to think about these that makes them actually look
consistent - the only one that I can think of is the actual
implementation (we need to compute the merge base for both "..."
commands), but that's a really bad argument for a user facing notation.

Michael

```
