git diff不加参数时对比工作区与暂存区的差异,即已修改但未git add的内容;它不与HEAD或远程比较,常见无输出是因为文件已被暂存或为未跟踪状态。

git diff 不加参数时到底比什么
它只对比工作区和暂存区(index)的差异,也就是你改了但还没 git add 的内容。不是和 HEAD 比,也不是和远程比——这点最容易误解。
常见错误现象:git diff 没输出,但你确定改过文件。可能原因包括:
- 你已经
git add了该文件,它现在在暂存区,和工作区一致 - 你改完又手动还原了,工作区和暂存区实际没差别
- 文件是新创建的、未跟踪状态(untracked),
git diff默认不显示它(要用git status或git add -N先声明)
怎么准确查看“已 add 但未 commit”的改动
用 git diff --cached(或等价的 git diff --staged),它严格对比暂存区和最近一次提交(HEAD)的内容。
这个命令的关键用途是:确认你即将提交的东西到底是什么,避免 git commit 后才发现漏了某处修改或加错了文件。
容易踩的坑:
-
git diff --cached没输出?先检查是否真执行了git add;如果刚commit完就立刻运行,那自然没差异 - 想看某个特定文件的暂存差异,必须加路径:
git diff --cached path/to/file.js,否则它列出所有已暂存文件的变动 - Windows 用户在 Git Bash 里遇到中文路径乱码,建议临时用
git config --global core.quotepath false
git diff HEAD 和 git diff --cached 有什么区别
git diff HEAD 是工作区 + 暂存区 vs HEAD 的“合并视图”,相当于把未暂存和已暂存的改动一起拉出来跟你最后一次提交比。而 git diff --cached 只关心已暂存部分。
举个典型场景:你改了 a.js 并 git add a.js,又改了 b.js 但没 add:
-
git diff --cached→ 只显示a.js的改动 -
git diff HEAD→ 显示a.js和b.js的全部改动 -
git diff(无参数)→ 只显示b.js的改动
性能上没差别,但语义完全不同。误用会导致你对“这次要提交什么”产生错误判断。
用 difftool 打开图形化对比却只开了一个文件
Git 不自动推断范围,git difftool 的行为完全取决于你传的参数:
-
git difftool(无参数)→ 默认比工作区 vs 暂存区,只打开有差异的文件(一个或多个) -
git difftool --staged→ 比暂存区 vs HEAD,打开所有已暂存文件的差异 -
git difftool HEAD~1→ 比工作区 vs 上一版提交,可能打开几十个文件 -
git difftool file.js→ 强制只比这一个文件,不管它是否在暂存区
macOS 上用 VS Code 配置后卡住不动,大概率缺 --wait;Windows 上 WinMerge 找不到命令,八成是路径含空格没用双引号包裹,或没加 .exe 后缀。这些细节不处理,工具就启动失败,Git 会停住不继续。


















