Git分支与公共祖先差异对比及master...branch语法疑问
优雅查看Git分支分叉后的变更差异 & 三点语法的歧义解惑
核心需求:快速对比分支与合并基准的差异
你想要的对比B(master和branch的合并基准)和H(branch最新提交)之间的差异,最优雅的写法就是你发现的git diff master...branch——这完全符合你的需求,而且比手动计算merge base的命令简洁太多。
先明确下你的提交图:
---A---B---C---D---E <== master \ F---G---H <== branch
这里B就是git merge-base master branch的结果,而git diff master...branch在diff命令里的作用,就是只显示branch从合并基准B到H的所有变更,完全不会包含master上B之后的C、D、E这些提交的差异,正好解决了你用git diff ..branch(等价于git diff master branch)时混入master变更的问题。
为什么master...branch和rev-parse手册描述不一样?
这是Git里一个很容易混淆的点:不同命令对...(三点语法)的语义定义是不同的!
- 在
git rev-parse、git log这类处理提交集合的命令里,master...branch表示的是两个分支的「对称差」——也就是所有不在对方分支上的提交,对应到你的提交图里就是master的C-D-E,加上branch的F-G-H,这也是rev-parse手册里描述的“包含master的提交”的场景。 - 但在
git diff命令里,...的语义被专门重载了!它的作用是直接对比「分支的最新提交」和「两个分支的合并基准」,等价于git diff $(git merge-base master branch)..branch。Git这么设计就是为了方便开发者快速查看某分支独有的变更,不用手动计算merge base,非常贴合你遇到的场景。
验证方法(可选)
你可以自己验证一下:
- 先获取合并基准的哈希:
git merge-base master branch,得到B的哈希值(假设是abc123) - 分别执行
git diff abc123..branch和git diff master...branch,你会发现输出完全一致,这就证明了后者确实是前者的简洁写法。
额外补充:两点 vs 三点在diff里的区别
再帮你理清楚diff命令里两种语法的差异:
git diff master..branch:等价于git diff master branch,对比的是master最新提交E和branch最新提交H的直接差异,所以会包含master从B到E的变更,这就是你说“效果不佳”的原因。git diff master...branch:对比的是合并基准B和branch最新提交H的差异,只显示branch独有的变更,完美匹配你的需求。
内容的提问来源于stack exchange,提问作者Boldewyn




