git diff 不加参数时对比工作区和暂存区,即显示已修改但未 git add 的内容;不显示已暂存的变更、未跟踪的新文件及已删除未 git rm 的文件,且受 Git 跟踪状态和 .gitignore 限制。

git diff 不加参数:只看工作区和暂存区的差异
默认执行 git diff,它比对的是工作区(Working Directory)和暂存区(Index / Staging Area)之间的文件内容差异。这是最常用的场景——你想知道“我改了哪些还没 git add 的东西”。
它不显示已 git add 进暂存区的修改,也不管远程或本地分支历史。
- 只对已跟踪(tracked)文件生效;新增但未
git add的文件不会出现在输出里(想看这类文件用git status) - 如果暂存区为空,
git diff输出为空——不代表没改,只是所有改动都还没暂存 - 输出是统一 diff 格式,能直接看出增删行、函数上下文(配合
-p更清晰,但默认已含基本定位)
git diff --cached:对比暂存区和 HEAD
当你已经 git add 了一些修改,想确认“这些暂存起来的内容,跟上一次提交(HEAD)到底差在哪”,就用 git diff --cached(git diff --staged 是等价写法)。
这个命令的关键作用是:在 git commit 前做最终核对,避免误提交不该进版本的历史。
部署一个包含 4 个智能体(agent)的数字孪生平台。在以下情况下使用该技能: 1. 用户希望为物理资产监控与预测性维护等场景搭建数字孪生系统……
- 如果暂存区没东西,会提示
fatal: No changes added to commit - 它不关心工作区当前改了什么——哪怕你又改了同一行,只要没
git add,就不影响--cached的输出 - 注意别漏掉
--cached;输成git diff cached(没双横线)会当成比较工作区和名为 “cached” 的分支,报错
git diff HEAD:一次性看到所有未提交的变更
git diff HEAD 是工作区 + 暂存区 对比 HEAD 的“合并视图”,相当于把前两个命令的结果叠加起来。它适合快速通览本次提交打算包含的所有改动。
但要注意:它不能区分哪些改了还没暂存、哪些已暂存——信息被扁平化了,不利于精细检查。
- 新增未跟踪文件仍不会显示(
git status -s才能看到??行) - 如果暂存区有修改、工作区又有额外修改,
git diff HEAD会同时显示两处,但不会标注来源 - 性能上比
git diff或git diff --cached略慢,因为要多走一次对象解析
常见误操作和隐藏坑
很多人卡在“为什么 git diff 没输出?”或者“明明改了却看不到差异”,问题往往不在命令本身,而在 Git 的状态模型理解偏差。
- 编辑了新文件但没
git add?git diff默认忽略它——用git status或git ls-files --others --exclude-standard查未跟踪文件 - 文件权限变了(比如
chmod),Git 默认不追踪,除非配置了core.filemode=true(Linux/macOS 默认开,Windows 默认关) - 换行符自动转换(
core.autocrlf)可能导致git diff显示大量看似无意义的行尾变化,先确认该配置值再排查逻辑改动 -
git diff不受.gitignore影响——已被 Git 跟踪的文件,即使后来加进 ignore,diff 依然照常显示
git diff 前,心里默念一遍当前想比对的两端,比死记参数有用得多。

















