如何比较两个 Git 分支的差异
比较两个分支:git diff 分支A 分支B 看代码差异;git log 分支A..分支B 看 B 独有的提交;git diff A...B(三点)看 B 自分岔点起引入的改动。三点用于查看B相对merge-base的改动,不预测合并结果。
看代码差异:git diff 分支A 分支B。看提交差异:git log 分支A..分支B(B 有 A 没有的提交)。 合并前想精确看"这个分支引入了什么",用三点语法 git diff A...B——它从两分支的共同祖先比起,过滤掉 A 后来新增的无关改动。
代码差异
git diff main feature-x # 两分支当前状态的完整差异
git diff main feature-x --stat # 只看文件统计
git diff main feature-x -- src/api/ # 只看某个目录
git diff main...feature-x # 三点:feature-x 自分岔以来引入的改动
提交差异
git log main..feature-x --oneline # feature-x 独有的提交
git log --left-right --oneline main...feature-x # 双向独有提交对比
两点 vs 三点怎么选
下面是 git diff 的语义;git log 的两点表示可达提交差集,三点表示双方独有提交集合,不能混用。
- 两点
A..B/git diff A B:直接对比两个端点的最终状态——A 侧新加的、B 侧没有的都会显示为"差异"; - 三点
A...B:从共同祖先(merge-base)到 B——只反映 B 这条线上做的改动。
评审 PR 时常用三点,但它不模拟实际合并结果或冲突;回答"两个分支现在长什么样不同"用两点。
常见问题(FAQ)
Q:不切换分支能比较吗?
能,diff/log 直接接受分支名参数,无需 checkout。这也正是推荐方式。
Q:想生成两个分支差异的补丁文件?
git diff --binary main..feature-x > changes.patch;对端工作区须与 main 基线兼容,先 git apply --check changes.patch 再应用。补丁包含内容差异,不包含原提交身份和历史。
Q:IDE 里怎么看?
VS Code 装 GitLens 后有 Branch Compare 视图;JetBrains 的 Git 工具窗选分支 → Compare。本质都是封装的上述命令。