Hi, The 'git diff <commit> <commit>' form is perfectly fine: I can understand that diff takes two commit^{tree}s to compare. Unfortunately, it also shows off the examples 'git diff A..B' and 'git diff A...B', where A..B and A...B do not correspond to the meaning specified in gitrevisions.txt. There's a note in the documentation saying this, but I'm very unhappy. I can understand that rev-parse parses A..B into ^A B. 'git diff A..B' is the same as 'git diff A B', 'git diff B ^A', and 'git diff ^A B'? (Yeah, I saw the code and found out that it swaps the arguments only if the second argument is UNINTERESTING) rev-parse parses A...B into A B ^$(merge-base --all A B). But 'git diff A...B' means 'git diff $(git merge-base A B) B'? And the merge-base is picked at random (found out that from the code)? What about other things like 'git diff ^A ^B' and 'git diff A^!'? Why is diff so inconsistent with everything else? Why are A..B and A...B almost coded in as special cases? What should we do to improve the situation? Thanks for listening. -- 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