在使用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,你能清晰地掌控代碼的每一處變更,避免誤提交、誤合併,讓版本控制更可靠。

小夜