git diff 不加参数时默认对比工作区与暂存区的差异,即已修改但尚未执行 git add 的文件内容;若暂存区为空,则等价于工作区与 head 的差异。

git diff 不加参数时对比的是什么
默认情况下 git diff 只比较工作区(working directory)和暂存区(staging area / index)之间的差异,也就是你修改了但还没 git add 的文件。它不涉及 HEAD 或远程分支——这点很多人误以为是在看“最新提交的改动”。
- 如果刚改完一个文件但没
git add,git diff会显示这些改动 - 如果已经
git add过,再运行git diff就不会输出任何内容(除非又改了) - 想看已暂存但未提交的改动,得用
git diff --cached(或git diff --staged)
对比两个提交或分支要用明确的 commit 范围
要看某次提交引入了哪些变更,必须显式指定起点和终点,比如 git diff HEAD~1 HEAD 表示“上一次提交到当前提交”的差异。省略任一端,Git 就按默认规则推断,容易出错。
-
git diff main..feature:从main到feature分支顶端的差异(注意双点) -
git diff main...feature:只显示feature分支独有的、不在main共同祖先之后的改动(三点,常用于 PR 前检查) -
git diff abc123 def456:直接比两个 commit hash,适合定位某次修复是否包含某行代码
常见错误:git diff 显示空白或“no changes”
不是 Git 坏了,大概率是没搞清对比范围。比如在干净的工作区执行 git diff,自然没输出;又或者用了 git diff origin/main 却忘了先 git fetch,本地根本没有 origin/main 的最新信息,Git 就按空提交处理,结果可能意外显示整个文件。
- 先确认当前分支状态:
git status看有没有未暂存/未提交的修改 - 查远程分支是否存在:
git ls-remote --heads origin main - 同步远程引用:
git fetch origin main,再 diff 才可靠 - 对单个文件限制输出:
git diff HEAD~1 -- src/utils.js,避免被大量无关改动干扰
diff 输出里那些符号和颜色代表什么
默认终端中,git diff 用颜色区分增删:红色是删除(以 - 开头),绿色是新增(以 + 开头)。但要注意,这不等于“删除代码”或“添加功能”,而是行级文本变化——比如重命名变量可能表现为整块删除+整块新增。
- 每块差异前的
@@ -a,b +c,d @@表示原文件从第 a 行开始共 b 行,新文件从第 c 行开始共 d 行 - 空格变化默认不显示,如需查看含空格变更:
git diff -w(忽略空格)或git diff --ignore-space-change - 二进制文件(如图片)只会提示
Binary files a/image.png and b/image.png differ,无法看到具体内容
实际用的时候,别依赖记忆哪条命令对应哪个场景,遇到不确定就先 git diff --help | grep -A5 "staged|cached|range" 快速瞄一眼文档片段。真正容易漏掉的是 fetch 同步和三点语法的语义差别——这两处一旦出错,看到的“差异”可能根本不是你想分析的那个版本。











