git diff 查看代码差异的常用姿势
改了什么想看清楚?git diff 显示代码差异。本文讲清 diff 的工作区/暂存区/提交对比、看单个文件、分支间差异,以及怎么让 diff 更易读。
场景:想确认自己到底改了哪些行、或对比两个分支差了什么。git diff 是查看代码差异的主力工具。难点在于"比较的到底是哪两个对象",下面讲清。
diff 比较的三种对象
Git 里有三个"快照层":工作区(未 add)、暂存区(已 add)、提交(commit)。diff 比较它们之间任意两者:
| 命令 | 比较内容 |
|---|---|
git diff | 工作区 vs 暂存区(未 add 的改动) |
git diff --staged | 暂存区 vs 上次提交(已 add 的改动) |
git diff HEAD | 工作区 vs 上次提交(全部改动) |
git diff 提交A 提交B | 两个提交之间 |
新手误区:默认 git diff 看不到已 git add 的改动,要加 --staged 才看得到。
常用命令
# 工作区未 add 的改动
git diff
# 已 add 的改动
git diff --staged # 或 --cached
# 看某个文件
git diff -- 文件.js
git diff --staged -- 文件.js
# 只显示改动统计(不改内容)
git diff --stat
对比分支/提交
git diff main feature # 两分支全部差异
git diff main feature -- src/ # 只看某目录差异
git diff abc1234 def5678 # 两提交差异
让 diff 更好读
# 忽略空白差异
git diff -w
# 上下文行数
git diff -U3
# 按词高亮
git diff --word-diff
配合 IDE/工具看更直观
命令行 git diff 用 +/- 显示。若觉得难读,可用:
git diff --color=always | less -R # 终端高亮分页
git diff --color-words # 逐词高亮
图形界面(VSCode/IDE)的 Diff 视图更直观,适合对比复杂改动。
常见问题
- diff 没输出但明明改了:可能改动已被
git add,用git diff --staged看。 - diff 显示整个文件都变了:可能是换行符(CRLF/LF)差异,用
git diff -w忽略后确认。 - 只想看谁改的:用
git blame而非 diff。
一句话速记
git diff 看未 add 的、--staged 看已 add 的、加两个分支名对比分支;加 -- 文件 只看单文件。
?
常见问题 FAQ
git diff 默认比较的是哪两个?
默认比较"工作区 vs 暂存区"(也就是你还没 add 的改动)。已 add 的改动要用 git diff --staged 查看。
git diff --staged 和 git diff 区别?
--staged(或 --cached)比较的是"暂存区 vs 上次提交",即已经 git add 过的改动;不带参数的 diff 看的是未 add 的工作区改动。
怎么对比两个分支的差异?
git diff 分支A 分支B 比较两者所有差异;git diff main...feature 只看 feature 相对 main 独有的改动(三点的合并基点)。
只想看某个文件改了啥?
git diff -- 文件路径 只看该文件的改动。也可配合其他命令如 git diff main -- 目录。