Re: my git problem

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




On Mon, 28 Apr 2008, Andrew Morton wrote:
> 
> hm, weirdness.
> 
> y:/usr/src/git26> git-diff origin...git-ia64   
> y:/usr/src/git26> git-log origin...git-ia64 | wc -l
> 15574
> 
> I'd have expected git-log to operate on the same patches as git-diff.

No, not at all.

 - "git log" shows each commit in a range.

 - "git diff" shows just the difference between two states.

The two have nothing in common. One operates on lots of individual commits 
(git log) individually, while the other one fundamentally operates on just 
two end-points (git diff).

And "a..b" and "a...b" means two totally different things for the two 
totally different operations.

When doing "a..b" and looking at individual commits, it means "show all 
commits that are in b but *not* in a". And when doing "a..b" when asking 
for a "diff", it means "show the difference from 'a' to 'b'".

They are *very* different operations indeed. The log can be empty, even if 
the diff is not empty (example: b is _before_ a, so there is nothing in 
'b' that isn't in 'a', but that doesn't mean that 'b' is *equal* to 'a', 
so there is still a diff!). And the log can be non-empty, even if the diff 
is empty (example: 'b' and 'a' have the same actual tree, but two 
different ways of gettign there: the diff is empty, but the log of commits 
in between them is not).

So anybody who thinks that 'diff' and 'log' have *anything* to do with 
each other is fundamentally confused. Not just about git, btw. It's true 
in any model - it's fundamental.

As to 'a...b', it also means somethign different for diff (two endpoints!) 
and log (set of commits). For diff, it means "show the difference between 
the common commit and 'b'", while for log it means "show all commits that 
are in either 'a' or 'b' but *not* in both".

So you should do

	# generate the diff from the common point
	git diff -p --stat a...b

	# show the commits that are in b but not in a
	git log a..b

where the difference between two dots and three dots is important, and 
stems directly from the fact that 'diff' and 'log' are two totally 
different operations that cannot _possibly_ have semantics that mean the 
same thing - because a "set of commits" is fundamentally different from 
"difference betwen two endpoints".

So both "a..b" and "a...b" have meaning for both diff and log, but which 
you want to use depends on what you are looking for.

They do have some relationship, of course. If you want to have a simple 
way to know which is which, then

 - "a..b" is a plain difference. Think of it as a subtraction. For "diff", 
   it is simply the diff between a and b, and for log it is the "set 
   difference" (shown as either just "-" or as "\" in set theory math) 
   between the commits that are in b and not in a.

 - "a...b" is a more complex difference. For log, it's no longer the 
   regular set difference, but a "symmetric difference" (usually shown as 
   a greek capital "Delta" in set theory math). And for "diff", it's no 
   longer just the diff between two states, it's the diff from a third 
   state (the nearest common state) to the second state.

In short: It's easy to think that "log" and "diff" are related, but they 
really are very fundamnetally different. 

		Linus
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux