如何对比同一文件在两个提交之间的差异
对比同一文件在不同提交间的差异:git diff <提交1> <提交2> -- <文件路径>。可用标签、HEAD~n 相对引用代替哈希;加 --word-diff 看行内差异,--stat 只看摘要。
命令格式:git diff <提交A> <提交B> -- <文件路径>。 两个提交可以是哈希、标签、分支名或 HEAD~3 这类相对引用。只关心这一个文件时末尾的路径(-- 后面)不能省,否则会输出两个提交间的全部差异。
基本用法
git log --oneline -- src/app.js # 先看这个文件的提交历史,拿到哈希
git diff a1b2c3d e4f5g6h -- src/app.js
# 等价写法:两点语法(比较两个端点)
git diff a1b2c3d..e4f5g6h -- src/app.js
# 相对引用:当前版本 vs 3 个提交前
git diff HEAD~3 HEAD -- src/app.js
实用变体
git diff a1b2c3d e4f5g6h --stat -- src/app.js # 只看改了多少行
git diff --word-diff a1b2c3d e4f5g6h -- src/app.js # 行内差异高亮
git difftool a1b2c3d e4f5g6h -- src/app.js # 调起图形化 diff 工具
顺便对比某文件与当前工作区
git diff a1b2c3d -- src/app.js # 旧提交 vs 当前工作区
查看某提交里这个文件改成什么样
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。
Q:三点 A...B 和两点有什么区别?
A...B(三点)比较的是" merge-base(共同祖先)与 B"的差异——看分支引入了什么改动时常用;两点是直接对比两个端点。查单文件历史一般用两点。