在使用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找到两个提交的哈希(比如abc123和def456),输入:
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,你能清晰地掌控代码的每一处变更,避免误提交、误合并,让版本控制更可靠。