如何对比同一文件在两个提交之间的差异

对比同一文件在不同提交间的差异:git diff <提交1> <提交2> -- <文件路径>。可用标签、HEAD~n 相对引用代替哈希;加 --word-diff 看行内差异,--stat 只看摘要。

最佳实践
Git 提交历史与版本恢复示意

命令格式:git diff <提交A> <提交B> -- <文件路径>。 两个提交可以是哈希、标签、分支名或 HEAD~3 这类相对引用。只关心这一个文件时末尾的路径(-- 后面)不能省,否则会输出两个提交间的全部差异。

基本用法

git log --oneline -- src/app.js        # 先看这个文件的提交历史,拿到哈希

git diff a1b2c3d e4f5a6b -- src/app.js

# 等价写法:两点语法(比较两个端点)
git diff a1b2c3d..e4f5a6b -- src/app.js

# 相对引用:当前版本 vs 沿第一父提交链回溯 3 步
git diff HEAD~3 HEAD -- src/app.js

实用变体

git diff a1b2c3d e4f5a6b --stat -- src/app.js    # 只看改了多少行
git diff --word-diff a1b2c3d e4f5a6b -- src/app.js  # 行内差异高亮
git difftool a1b2c3d e4f5a6b -- src/app.js       # 调起图形化 diff 工具

顺便对比某文件与当前工作区

git diff a1b2c3d -- src/app.js      # 旧提交 vs 当前工作区

查看某提交里这个文件改成什么样

git show a1b2c3d -- src/app.js      # 该提交对这个文件的具体改动

上面的 git show 展示提交补丁;若要查看该版本的完整文件,用 git show a1b2c3d:src/app.js。示例哈希须替换为仓库中的实际提交。

常见问题(FAQ)

Q:两个参数顺序有讲究吗?

有。git diff A B 展示的是"从 A 到 B 的变化":减号是 A 有而 B 没有的,加号是 B 新增的。顺序反了,加减也反过来。

Q:文件中途改过名,diff 还跟得上吗?

git diff 对重命名的检测有限。可追溯历史用 git log --follow -- 新路径 找全链条,再对相应提交做 diff。跨重命名可用 git diff 提交A:旧路径 提交B:新路径 直接比较两个 blob,只过滤新路径可能看不到完整重命名差异。

Q:三点 A...B 和两点有什么区别?

A...B(三点)比较的是" merge-base(共同祖先)与 B"的差异——看分支引入了什么改动时常用;两点是直接对比两个端点。查单文件历史一般用两点。

参考资料

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台