threads / discuss / 40824

Three dot notion used inconsitent?

Subject: Three dot notion used inconsitent?

## tl;dr

4 messages between Nov 18, 2015 and Nov 20, 2015.

replies: 3people: 4as markdown or json

Lars Schneider· Nov 18, 2015, 10:31 UTC · lore
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· Nov 18, 2015, 11:02 UTC · re: Lars Schneider · lore

Re: Three dot notion used inconsitent?

On 18/11, Lars Schneider wrote:
Show 8 quoted lines
>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· Nov 18, 2015, 17:49 UTC · re: Lars Schneider · lore

Re: Three dot notion used inconsitent?

Lars Schneider <larsxschneider@gmail.com> writes:
Show 7 quoted lines
> 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· Nov 20, 2015, 09:53 UTC · re: Andreas Schwab · lore

Re: Three dot notion used inconsitent?

Andreas Schwab venit, vidit, dixit 18.11.2015 18:49:
Show 14 quoted lines
> 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

← back to recent threads