You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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-parsegit 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,非常贴合你遇到的场景。

验证方法(可选)

你可以自己验证一下:

  1. 先获取合并基准的哈希:git merge-base master branch,得到B的哈希值(假设是abc123
  2. 分别执行git diff abc123..branchgit 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

火山引擎 最新活动