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