tags:

views:

533

answers:

3

How do you make git diff only show the difference between 2 commits, that is exclude other commits in between the 2?

+3  A: 

you can simply pass the 2 commits to git diff like :

-> git diff 0da94be..59ff30c > my.patch
OneOfOne
Actually the command is `git diff 0da94be 59ff30c`, the above form (`git diff 0da94be..59ff30c`) is just a convenience for copy'n'paste.
Jakub Narębski
ha, I actually didn't know that, I've always used it that way.
OneOfOne
Doesn't this include all the changes inbetween as well?
bdonlan
+1  A: 

Suppose you want to see the difference between commits 012345 and abcdef. The following should do what you want:

$ git checkout 012345
$ git cherry-pick -n abcdef
$ git diff --cached
William Pursell
A: 

Asking for the difference /between/ two commits without including the commits in-between makes little sense. Commits are just snapshots of the contents of the repository; asking for the difference between two necessarily includes them. So the question then is, what are you really looking for?

As William suggested, cherry-picking can give you the delta of a single commit rebased on top of another. That is:

$ git checkout 012345
$ git cherry-pick -n abcdef
$ git diff --cached

This takes commit 'abcdef', compares it to its immediate ancestor, then applies that difference on top of '012345'. This new difference is then shown - the only change is the context comes from '012345' rather than 'abcdef's immediate ancestor. Of course, you may get conflicts and etc, so it's not a very useful process in most cases.

If you're just interested in abcdef itself, you can do:

$ git log -u -1 abcdef

This compares abcdef to its immediate ancestor, alone, and is usually what you want.

And of course

$ git diff 012345..abcdef

gives you all differences between those two commits.

It would help to get a better idea of what you're trying to achieve - as I mentioned, asking for the difference between two commits without what's in between doesn't actually make sense.

bdonlan