在使用Git进行版本控制时,我们经常需要查看不同版本之间的代码变化——比如修改了哪些内容、新增了哪些代码、删除了哪些部分。这时候,diff命令就派上用场了。它能帮我们清晰地展示文件的变更细节,是Git中最基础也最实用的工具之一。

一、为什么需要diff?

想象你正在修改一个项目,过了几天回头看,想知道自己上次改了什么;或者团队合作时,想确认队友提交的代码是否正确。diff命令能帮你:
- 对比工作区(你正在编辑的文件)和暂存区(准备提交的文件)的差异;
- 对比暂存区历史提交(比如上一次提交的版本)的差异;
- 对比两个历史版本(比如两个不同的提交)之间的代码变化;
- 甚至对比不同分支(比如dev分支和main分支)的代码差异。

二、基本diff命令与场景

Git的diff命令有多种用法,核心是通过不同参数区分对比的对象。以下是最常用的场景:

场景1:查看「工作区」与「暂存区」差异

工作区:你正在本地编辑的文件(未执行git add);
暂存区:执行git add后准备提交的文件(未执行git commit)。

输入命令:

git diff <文件名>  # 查看指定文件的差异
# 或省略文件名,查看所有修改的文件

示例
假设你修改了一个main.py文件,内容从:

print("Hello, Git!")

改为:

print("Hello, Git!")
print("This is a test.")  # 新增一行

执行git diff main.py,输出会显示:

diff --git a/main.py b/main.py
index 1234567..8765432 100644
--- a/main.py
+++ b/main.py
@@ -1,1 +1,2 @@
 print("Hello, Git!")
+print("This is a test.")

解读
- --- a/main.py:表示原文件(工作区未暂存的版本);
- +++ b/main.py:表示新文件(修改后的内容);
- @@ -1,1 +1,2 @@:表示原文件从第1行开始,共1行;新文件从第1行开始,共2行;
- +开头的行:新增的内容(print("This is a test."))。

场景2:查看「暂存区」与「历史提交」差异

如果已经执行git add暂存了修改,但还没提交,想看看暂存的内容和上一次提交的差异?用--staged(或--cached)参数:

git diff --staged <文件名>  # 查看暂存区与上一次提交的差异

示例
假设你已执行git add main.py,此时用git diff --staged main.py,输出会显示暂存区内容与HEAD(上一次提交版本)的差异。

场景3:查看「两个历史提交」的差异

如果你想对比两个历史版本(比如两个不同的提交),可以用提交哈希(如a1b2c3d)作为参数:

git diff <提交哈希1> <提交哈希2>  # 对比两个历史提交

示例
执行git log找到两个提交的哈希(比如abc123def456),输入:

git diff abc123 def456

就能看到这两个版本之间的代码变化。

场景4:查看「分支」间的差异

对比不同分支的代码差异(比如dev分支和main分支):

git diff <分支1> <分支2>  # 对比分支1和分支2

示例

git diff dev main

输出会显示两个分支中文件的所有差异。

三、实用技巧:让diff更精准

diff命令的参数能帮你过滤掉不需要的差异,解决常见问题(比如代码格式调整导致的误报差异)。以下是最实用的参数:

1. 忽略空格/空行变化(解决格式调整问题)

如果代码只是格式调整(比如空格、换行符变化),但实际逻辑没变,diff会显示大量无关差异。用这两个参数忽略:
- -w(或--ignore-all-space):忽略所有空格(包括空格、制表符);
- -b(或--ignore-space-change):忽略空格变化(但保留换行符差异)。

示例

git diff -w main.py  # 忽略所有空格变化

2. 只显示文件名,不显示内容

如果只想知道哪些文件变了,不想看具体内容,用--name-only

git diff --name-only  # 只显示变化的文件名

输出

main.py
utils.py

3. 显示变化的统计信息

--stat参数,快速查看每个文件的修改行数(新增/删除):

git diff --stat  # 显示统计信息

输出

 main.py | 2 +-
 utils.py | 1 +
 2 files changed, 2 insertions(+), 1 deletion(-)

4. 比较二进制文件(如图片、视频)

默认diff不支持二进制文件(会显示“Binary files differ”),但用--binary参数可以强制显示差异:

git diff --binary image.png  # 对比两张图片的差异

四、如何解读diff输出?

输出中最关键的是+-符号:
- +:新增的内容(新行);
- -:删除的内容(旧行);
- (空格):无变化的内容。

比如:

@@ -1,3 +1,4 @@
 这是第一行
-这是第二行(已删除)
+这是修改后的第二行(新增)
+这是新增的第三行(新增)
 这是第四行(无变化)

五、总结

diff是Git中最基础也最强大的工具之一,掌握它能帮你高效管理代码变更。核心场景和参数:
- 工作区 vs 暂存区:git diff
- 暂存区 vs 历史提交:git diff --staged
- 两个历史提交:git diff <哈希1> <哈希2>
- 实用参数:-w(忽略空格)、--stat(统计行数)、--name-only(只显示文件名)。

练习:创建一个本地仓库,新建文件,修改内容,用diff查看变化,试试不同参数的效果吧!

通过diff,你能清晰地掌控代码的每一处变更,避免误提交、误合并,让版本控制更可靠。

小夜