git diff 看不到修改是因为默认只对比工作区和暂存区;已暂存的修改需用 git diff --cached,全部变更用 git diff HEAD,分支比较注意 A..B 与 A...B 区别。

git diff 看不到修改?检查工作区和暂存区状态
默认 git diff 只对比工作区(working directory)和暂存区(index),如果文件已 git add 进暂存区,它就“看不见”这次修改了。这是最常被卡住的地方。
- 想看未暂存的修改:直接运行
git diff - 想看已暂存但未提交的修改:用
git diff --cached(或git diff --staged) - 想看工作区 + 暂存区 全部相对于上次提交的变化:用
git diff HEAD - 执行
git status前先看一眼,能快速判断当前修改落在哪一层
对比两个分支或提交时,注意方向和含义
git diff A..B 和 git diff A...B 看似只差一个点,行为完全不同——前者是“B 相对于 A 的变更”,后者是“B 相对于 A 和 B 共同祖先的变更”,也就是 B 的独有改动。
- 常用场景:检查 feature 分支比 main 多改了什么 → 用
git diff main...feature - 误用
main..feature可能包含大量无关合并历史,尤其在 rebase 后容易混乱 - 对比单个文件时加路径,比如
git diff main...feature -- src/utils.js,避免刷屏 - 输出可能很长,建议加
--stat先看改动分布:git diff --stat main...feature
diff 输出里“a/”“b/”前缀和模式变化是什么意思
默认 git diff 显示类似 diff --git a/src/index.js b/src/index.js,这里的 a/ 和 b/ 不是真实路径,而是 Git 内部用来区分“变更前”和“变更后”的符号标记;真正影响阅读的是后面的实际文件名。
- 如果看到
old mode 100644 / new mode 100755,说明只是文件权限变了(比如加了可执行位),不是内容差异 - 遇到
Binary files a/image.png and b/image.png differ,Git 默认不展示二进制文件内容,加--text强制当文本处理(慎用)或换工具如xxd - 行首的
-和+表示删除/新增,但要注意:重命名、复制、chmod 都可能触发“相似度检测”,显示为similarity index 95%,此时实际是移动而非纯增删
中文文件名乱码或 diff 不生效?查 core.quotePath 和系统编码
Windows 或某些 Linux 终端下,git diff 输出中文路径变成 "\344\270\255\346\226\207.js",本质是 Git 把非 ASCII 路径做了转义保护,不是真乱码。
- 临时关闭转义:设置
git config --global core.quotePath false(仅推荐终端支持 UTF-8 时用) - 更稳妥的方式是让 Git 正确识别系统编码:Windows 上加
git config --global core.precomposeUnicode true - 如果 diff 完全不显示中文文件变更,先确认该文件是否被
.gitignore忽略,或执行过git update-index --assume-unchanged - Mac 用户注意:HFS+ 文件系统对大小写不敏感,但 Git 默认敏感,可能导致
git diff漏掉重命名类变更
事情说清了就结束。diff 的复杂性不在命令本身,而在你到底想问 Git “什么和什么比”“比的是内容还是状态”“路径算不算在内”——这三个问题没理清,参数再熟也容易出偏差。


















