How to get the changes on a branch in git
| url: | http://stackoverflow.com/questions/53569/how-to-get-the-changes-on-a-branch-in-git |
|---|
What is the best way to get a log of commits on a branch since the time it was branched from the current branch? My solution so far is:
git log $(git merge-base HEAD branch)..branch
The documentation for git-diff indicates that "git diff A...B" is equivalent to "git diff $(git-merge-base A B) B". On the other hand, the documentation for git-rev-parse indicates that "r1...r2" is defined as "r1 r2 --not $(git merge-base --all r1 r2)". Why are these different? Note that "git diff HEAD...branch" gives me the diffs I want, but the corresponding git log command gives me more than what I want.
In pictures, suppose this:
x---y---z---branch
/
---a---b---c---d---e---HEAD
I would like to get a log containing commits x, y, z. "git diff HEAD...branch" gives these commits. However, "git log HEAD...branch" gives x, y, z, c, d, e. git branch flag
In the context of a revision list, A...B is how git-rev-parse defines it. git-log takes a revision list. git-diff does not take a list of revisions - it takes one or two revisions, and has defined the A...B syntax to mean how it's defined in the git-diff manpage. If git-diff did not explicitly define A...B, then that syntax would be invalid. Note that the git-rev-parse manpage describes A...B in the "Specifying Ranges" section, and everything in that section is only valid in situations where a revision range is valid (i.e. when a revision list is desired).
To get a log containing just x, y, and z, try git log HEAD..branch (two dots, not three). This is identical to git log branch --not HEAD, and means all commits on branch that aren't on HEAD. link|flag
Wow, that's confusing. It turns out that using git diff HEAD..branch shows all commits (x, y, z, c, d, e), but git log HEAD..branch does exactly what I want and only shows x, y, z! This is the exact opposite of using .... – Greg Hewgill Sep 10 '08 at 7:59
git diff HEAD..branch is identical to git diff HEAD branch. The key thing to remember here is that log takes a list/range of revisions, while diff doesn't. That's why they treat their args differently. – Kevin Ballard Sep 11 '08 at 7:52
