Git
English ▾ 主題 ▾ 最新版本 ▾ git-diff 最後更新於 2.47.0

名稱

git-diff - 顯示提交、提交與工作樹等之間的變更

概要

git diff [<options>] [<commit>] [--] [<path>…​]
git diff [<options>] --cached [--merge-base] [<commit>] [--] [<path>…​]
git diff [<options>] [--merge-base] <commit> [<commit>…​] <commit> [--] [<path>…​]
git diff [<options>] <commit>…​<commit> [--] [<path>…​]
git diff [<options>] <blob> <blob>
git diff [<options>] --no-index [--] <path> <path>

描述

顯示工作樹與索引或樹之間的變更、索引與樹之間的變更、兩個樹之間的變更、合併產生的變更、兩個 blob 物件之間的變更,或磁碟上兩個檔案之間的變更。

git diff [<選項>] [--] [<路徑>…​]

此形式是用來檢視您相對於索引(下一次提交的暫存區)所做的變更。換句話說,差異是您可以告訴 Git 進一步加入索引的內容,但您仍然沒有這麼做。您可以使用 git-add[1] 來暫存這些變更。

git diff [<選項>] --no-index [--] <路徑> <路徑>

此形式是用來比較檔案系統上給定的兩個路徑。當在 Git 控制的工作樹中執行命令且至少其中一個路徑指向工作樹外部時,或者當在 Git 控制的工作樹外部執行命令時,您可以省略 --no-index 選項。此形式表示 --exit-code

git diff [<選項>] --cached [--merge-base] [<提交>] [--] [<路徑>…​]

此形式是用來檢視您相對於指定的 <提交> 為下一次提交所暫存的變更。通常您會想要與最新的提交進行比較,因此如果您沒有給定 <提交>,則預設為 HEAD。如果 HEAD 不存在(例如,未誕生的分支)且沒有給定 <提交>,則會顯示所有已暫存的變更。--staged 是 --cached 的同義詞。

如果給定 --merge-base,則不使用 <提交>,而是使用 <提交> 和 HEAD 的合併基礎。git diff --cached --merge-base A 等同於 git diff --cached $(git merge-base A HEAD)

git diff [<選項>] [--merge-base] <提交> [--] [<路徑>…​]

此形式是用來檢視您在工作樹中相對於指定的 <提交> 所做的變更。您可以使用 HEAD 將其與最新的提交進行比較,或使用分支名稱與不同分支的頂端進行比較。

如果給定 --merge-base,則不使用 <提交>,而是使用 <提交> 和 HEAD 的合併基礎。git diff --merge-base A 等同於 git diff $(git merge-base A HEAD)

git diff [<選項>] [--merge-base] <提交> <提交> [--] [<路徑>…​]

這是用來檢視兩個任意 <提交> 之間的變更。

如果給定 --merge-base,則使用兩個提交的合併基礎作為「之前」的一方。git diff --merge-base A B 等同於 git diff $(git merge-base A B) B

git diff [<選項>] <提交> <提交>…​ <提交> [--] [<路徑>…​]

此形式是用來檢視合併提交的結果。第一個列出的 <提交> 必須是合併本身;其餘的兩個或多個提交應為其父項。產生所需修訂版本集的便捷方式是使用後綴 ^@^!。如果 A 是合併提交,則 git diff A A^@git diff A^!git show A 都會提供相同的組合差異。

git diff [<選項>] <提交>..<<提交> [--] [<路徑>…​]

這與先前的形式(沒有 ..)同義,用於檢視兩個任意 <提交> 之間的變更。如果省略其中一邊的 <提交>,則其效果與改用 HEAD 相同。

git diff [<選項>] <提交>...<提交> [--] [<路徑>…​]

此形式是用來檢視包含並直到第二個 <提交> 的分支上的變更,從兩個 <提交> 的共同祖先開始。git diff A...B 等同於 git diff $(git merge-base A B) B。您可以省略任何一個 <提交>,其效果與改用 HEAD 相同。

為了以防萬一您正在執行一些特殊操作,應注意上述描述中的所有 <提交>,除了在 --merge-base 的情況下以及最後兩個使用 .. 表示法的形式中,都可以是任何 <樹狀結構>。感興趣的樹狀結構是由名為 AUTO_MERGE 的 ref 指向的樹狀結構,當 ort 合併策略遇到合併衝突時會寫入該 ref(請參閱 git-merge[1])。將工作樹與 AUTO_MERGE 進行比較會顯示您到目前為止為了解決文字衝突所做的變更(請參閱以下範例)。

如需更完整列出拼寫 <提交> 的方式,請參閱 gitrevisions[7] 中的「指定修訂版本」章節。但是,「diff」是關於比較兩個端點,而不是範圍,範圍表示法(<提交>..<提交><提交>...<提交>)並不表示 gitrevisions[7] 中「指定範圍」章節中所定義的範圍。

git diff [<選項>] <blob> <blob>

此形式是用來檢視兩個 blob 物件原始內容之間的差異。

選項

-p
-u
--patch

產生修補程式(請參閱 使用 -p 產生修補程式文字)。這是預設值。

-s
--no-patch

抑制來自 diff 機制的所有輸出。適用於 git show 等預設會顯示修補程式以抑制其輸出的命令,或取消別名中較早命令列上的 --patch--stat 等選項的效果。

-U<n>
--unified=<n>

產生具有 <n> 行內容而非一般三行的 diff。表示 --patch

--output=<檔案>

輸出到特定檔案而不是 stdout。

--output-indicator-new=<字元>
--output-indicator-old=<字元>
--output-indicator-context=<字元>

指定用於指示產生修補程式中新行、舊行或上下文行的字元。通常它們分別是+-和' '。

--raw

以原始格式產生差異。

--patch-with-raw

-p --raw 的同義詞。

--indent-heuristic

啟用啟發式演算法,移動差異區塊的邊界,使修補程式更易於閱讀。這是預設行為。

--no-indent-heuristic

停用縮排啟發式演算法。

--minimal

花費額外的時間來確保產生最小的差異。

--patience

使用「耐心差異」演算法產生差異。

--histogram

使用「直方圖差異」演算法產生差異。

--anchored=<文字>

使用「錨定差異」演算法產生差異。

此選項可以指定多次。

如果某行同時存在於來源和目的地中,僅存在一次,並且以該文字開頭,則此演算法會嘗試防止其在輸出中顯示為刪除或新增。它在內部使用「耐心差異」演算法。

--diff-algorithm={patience|minimal|histogram|myers}

選擇差異演算法。變體如下:

defaultmyers

基本的貪婪差異演算法。目前,這是預設值。

minimal

花費額外的時間來確保產生最小的差異。

patience

在產生修補程式時使用「耐心差異」演算法。

histogram

此演算法擴展了耐心演算法以「支援低頻率的常見元素」。

例如,如果您將 diff.algorithm 變數設定為非預設值,並且想要使用預設值,則必須使用 --diff-algorithm=default 選項。

--stat[=<寬度>[,<名稱寬度>[,<計數>]]]

產生 diffstat。預設情況下,檔案名稱部分將使用盡可能多的空間,其餘部分用於圖形部分。最大寬度預設為終端寬度,如果未連接到終端,則預設為 80 個字元,並且可以被 <寬度> 覆寫。檔案名稱部分的寬度可以通過在逗號後給定另一個寬度 <名稱寬度> 或設定 diff.statNameWidth=<寬度> 來限制。圖形部分的寬度可以使用 --stat-graph-width=<寬度> 或設定 diff.statGraphWidth=<寬度> 來限制。使用 --stat--stat-graph-width 會影響產生 stat 圖形的所有指令,而設定 diff.statNameWidthdiff.statGraphWidth 不會影響 git format-patch。通過給定第三個參數 <計數>,您可以將輸出限制為前 <計數> 行,如果還有更多行,則後面跟著 ...

這些參數也可以使用 --stat-width=<寬度>--stat-name-width=<名稱寬度>--stat-count=<計數> 單獨設定。

--compact-summary

在 diffstat 中輸出擴展標頭資訊的精簡摘要,例如檔案建立或刪除(「new」或「gone」,如果它是符號連結則可選 "+l")和模式變更(分別用於新增或刪除可執行位的 "+x" 或 "-x")。該資訊放置在檔案名稱部分和圖形部分之間。暗示 --stat

--numstat

類似於 --stat,但以十進制表示法顯示新增和刪除的行數,以及沒有縮寫的路徑名稱,使其更易於機器處理。對於二進位檔案,輸出兩個 - 而不是說 0 0

--shortstat

僅輸出包含修改檔案總數以及新增和刪除行數的 --stat 格式的最後一行。

-X[<參數1,參數2,…​>]
--dirstat[=<參數1,參數2,…​>]

輸出每個子目錄相對變更量的分佈。 --dirstat 的行為可以通過傳遞以逗號分隔的參數列表來自訂。預設值由 diff.dirstat 組態變數控制(請參閱 git-config[1])。以下參數可用:

changes

通過計算從來源刪除或新增到目的地的行來計算 dirstat 數。這會忽略檔案中純程式碼移動的量。換句話說,重新排列檔案中的行與其他變更的計數相同。當未給定參數時,這是預設行為。

lines

通過執行常規的基於行的差異分析並求和刪除/新增的行數來計算 dirstat 數。(對於二進位檔案,請計算 64 位元組的區塊,因為二進位檔案沒有自然的行概念)。這是一個比 changes 行為更昂貴的 --dirstat 行為,但它確實會將檔案中重新排列的行與其他變更計數相同。產生的輸出與您從其他 --*stat 選項獲得的輸出一致。

files

通過計算已變更檔案的數量來計算 dirstat 數。每個變更的檔案在 dirstat 分析中計數相同。這是計算成本最低的 --dirstat 行為,因為它根本不必查看檔案內容。

cumulative

同時計算父目錄中子目錄的變更。請注意,當使用 cumulative 時,報告的百分比總和可能超過 100%。可以使用 noncumulative 參數指定預設(非累計)行為。

<限制>

整數參數指定截止百分比(預設為 3%)。變更量少於此百分比的目錄不會顯示在輸出中。

範例:以下將計算已變更的檔案,同時忽略變更檔案總數少於 10% 的目錄,並在父目錄中累計子目錄計數:--dirstat=files,10,cumulative

--cumulative

--dirstat=cumulative 的同義詞。

--dirstat-by-file[=<參數1,參數2>…​]

--dirstat=files,<參數1>,<參數2>…​ 的同義詞。

--summary

輸出擴展標頭資訊(例如建立、重新命名和模式變更)的精簡摘要。

--patch-with-stat

-p --stat 的同義詞。

-z

當給定 --raw--numstat--name-only--name-status 時,請勿修改路徑名稱並使用 NUL 作為輸出欄位終止符。

如果沒有此選項,則會引用具有「不尋常」字元的路徑名稱,如組態變數 core.quotePath 中所述(請參閱 git-config[1])。

--name-only

僅顯示後映像樹中每個變更檔案的名稱。檔案名稱通常以 UTF-8 編碼。有關更多資訊,請參閱 git-log[1] 手冊頁中關於編碼的討論。

--name-status

僅顯示每個變更檔案的名稱和狀態。請參閱 --diff-filter 選項中關於狀態字母含義的說明。與 --name-only 一樣,檔案名稱通常以 UTF-8 編碼。

--submodule[=<格式>]

指定如何顯示子模組中的差異。當指定 --submodule=short 時,使用 *short* 格式。此格式僅顯示範圍開頭和結尾的提交名稱。當指定 --submodule--submodule=log 時,使用 *log* 格式。此格式會像 git-submodule[1] summary 一樣列出範圍中的提交。當指定 --submodule=diff 時,使用 *diff* 格式。此格式顯示提交範圍之間子模組內容變更的內嵌差異。預設為 diff.submodule 或 *short* 格式(如果未設定組態選項)。

--color[=<何時>]

顯示彩色差異。 --color (即沒有 *=<何時>*)與 --color=always 相同。*<何時>* 可以是 alwaysneverauto 之一。它可以通過 color.uicolor.diff 組態設定進行變更。

--no-color

關閉彩色差異。這可用於覆寫組態設定。它與 --color=never 相同。

--color-moved[=<模式>]

移動的程式碼行會以不同的顏色顯示。它可以通過 diff.colorMoved 組態設定進行變更。如果未給定選項,則 <模式> 預設為 *no*,如果給定選項且沒有模式,則預設為 *zebra*。模式必須是下列之一:

no

移動的行不會被突出顯示。

default

zebra 的同義詞。將來可能會變更為更合理的模式。

plain

任何在一個位置新增,而在另一個位置移除的行,將會以 color.diff.newMoved 顏色標示。同樣地,color.diff.oldMoved 將會用於在差異中某處移除但在其他地方新增的行。這種模式會捕捉任何移動的行,但在檢閱中判斷程式碼區塊是否在沒有排列變動的情況下移動時,並不是很實用。

區塊

至少 20 個字母數字字元的移動文字區塊會被貪婪地偵測。偵測到的區塊會使用 color.diff.{old,new}Moved 顏色繪製。相鄰的區塊無法區分。

斑馬紋

移動文字區塊的偵測方式與 區塊 模式相同。這些區塊會使用 color.diff.{old,new}Moved 顏色或 color.diff.{old,new}MovedAlternative 顏色繪製。兩種顏色之間的變化表示偵測到新的區塊。

淡化斑馬紋

斑馬紋 類似,但會對移動程式碼中不重要的部分進行額外的淡化處理。兩個相鄰區塊的邊界行被認為是重要的,其餘則是不重要的。dimmed_zebra 是一個已棄用的同義詞。

--no-color-moved

關閉移動偵測。這可以用來覆蓋配置設定。它與 --color-moved=no 相同。

--color-moved-ws=<模式>

此選項設定在執行 --color-moved 的移動偵測時,如何忽略空白字元。它可以使用 diff.colorMovedWS 配置設定來設定。這些模式可以用逗號分隔的列表形式給定。

no

在執行移動偵測時,不要忽略空白字元。

ignore-space-at-eol

忽略行尾空白字元的變更。

ignore-space-change

忽略空白字元數量的變更。這會忽略行尾的空白字元,並將所有其他一個或多個空白字元的序列視為等效。

ignore-all-space

在比較行時忽略空白字元。即使一行有空白字元而另一行沒有,也會忽略差異。

allow-indentation-change

最初在移動偵測中忽略任何空白字元,然後僅當每行空白字元的變更相同時,才將移動的程式碼區塊分組為一個區塊。這與其他模式不相容。

--no-color-moved-ws

在執行移動偵測時,不要忽略空白字元。這可以用來覆蓋配置設定。它與 --color-moved-ws=no 相同。

--word-diff[=<模式>]

顯示單字差異,使用 <模式> 來分隔已變更的單字。預設情況下,單字以空白字元分隔;請參閱下面的 --word-diff-regex。 <模式> 預設為 plain,且必須是下列之一:

color

僅使用顏色標示已變更的單字。表示使用 --color

plain

將單字顯示為 [-移除-]{+新增+}。如果分隔符號出現在輸入中,則不會嘗試逸出分隔符號,因此輸出可能不明確。

porcelain

使用特殊的基於行的格式,旨在供腳本使用。新增/移除/未變更的執行會以通常的統一差異格式列印,在行的開頭以 +/-/` ` 字元開始,並延伸到行的末尾。輸入中的換行符號以自己一行上的波浪號 ~ 表示。

none

再次停用單字差異。

請注意,儘管第一個模式的名稱如此,但如果啟用,則所有模式都會使用顏色來標示已變更的部分。

--word-diff-regex=<regex>

使用 <regex> 來決定什麼是單字,而不是將非空白字元的執行視為單字。除非已經啟用,否則也表示使用 --word-diff

每個不重疊的 <regex> 比對都視為一個單字。這些比對之間的任何內容都被視為空白字元,並且在尋找差異時會被忽略 (!)。您可能想要將 |[^[:space:]] 附加到您的正規表示式,以確保它比對所有非空白字元。包含換行符號的比對會在換行符號處被靜默截斷 (!)。

例如,--word-diff-regex=. 會將每個字元視為一個單字,並相應地逐個字元顯示差異。

正規表示式也可以透過差異驅動程式或配置選項設定,請參閱 gitattributes[5]git-config[1]。明確給定它會覆蓋任何差異驅動程式或配置設定。差異驅動程式會覆蓋配置設定。

--color-words[=<regex>]

等效於 --word-diff=color 加上(如果指定了正規表示式)--word-diff-regex=<regex>

--no-renames

關閉重新命名偵測,即使配置檔案預設為啟用。

--[no-]rename-empty

是否將空的 blob 作為重新命名的來源。

--check

如果變更引入衝突標記或空白字元錯誤,則發出警告。哪些被視為空白字元錯誤由 core.whitespace 配置控制。預設情況下,尾隨空白字元(包括僅由空白字元組成的行)以及緊隨行初始縮排內的定位字元之後的空白字元會被視為空白字元錯誤。如果發現問題,則以非零狀態退出。與 --exit-code 不相容。

--ws-error-highlight=<種類>

在差異的 contextoldnew 行中標示空白字元錯誤。多個值以逗號分隔,none 重設先前的值,default 將清單重設為 newallold,new,context 的簡寫。如果未給定此選項,且未設定配置變數 diff.wsErrorHighlight,則只會標示 new 行中的空白字元錯誤。空白字元錯誤會以 color.diff.whitespace 著色。

--full-index

在產生修補程式格式輸出時,不要顯示前幾個字元,而是在「索引」行上顯示完整的前後影像 blob 物件名稱。

--binary

除了 --full-index 之外,還輸出可以使用 git-apply 應用的二進位差異。表示使用 --patch

--abbrev[=<n>]

在 diff-raw 格式輸出和 diff-tree 標頭行中,不要顯示完整的 40 位元組十六進位物件名稱,而是顯示至少 <n> 位數長且唯一參照該物件的最短前綴。在 diff-patch 輸出格式中,--full-index 具有較高的優先權,即如果指定了 --full-index,則無論 --abbrev 如何,都會顯示完整的 blob 名稱。可以使用 --abbrev=<n> 指定非預設的位數。

-B[<n>][/<m>]
--break-rewrites[=[<n>][/<m>]]

將完整的重寫變更分成刪除和建立的配對。這有兩個目的

它會影響對檔案進行完全重寫的變更方式,不會將其視為一系列刪除和插入混合在一起,只有極少數幾行恰好在文字上與上下文匹配,而是將其視為一次刪除所有舊內容,然後一次插入所有新內容,而數字 m 控制 -B 選項的這一方面(預設為 60%)。-B/70% 指定原始檔案中少於 30% 的內容保留在結果中,Git 才會將其視為完全重寫(即,否則結果修補程式將是一系列刪除和插入與上下文行混合在一起)。

與 -M 一起使用時,完全重寫的檔案也會被視為重新命名的來源(通常 -M 只會將消失的檔案視為重新命名的來源),而數字 n 控制 -B 選項的這一方面(預設為 50%)。-B20% 指定與檔案大小的 20% 或更多相比,具有新增和刪除的變更符合被視為重新命名到另一個檔案的可能來源的條件。

-M[<n>]
--find-renames[=<n>]

偵測重新命名。如果指定了 n,則它是相似度索引的閾值(即與檔案大小相比的新增/刪除量)。例如,-M90% 表示如果檔案的 90% 以上沒有變更,則 Git 應將刪除/新增配對視為重新命名。如果沒有 % 符號,則數字應讀作分數,其前有小數點。即,-M5 變成 0.5,因此與 -M50% 相同。同樣地,-M05-M5% 相同。若要限制偵測到精確的重新命名,請使用 -M100%。預設的相似度索引為 50%。

-C[<n>]
--find-copies[=<n>]

同時偵測複製和重新命名。另請參閱 --find-copies-harder。如果指定了 n,則其含義與 -M<n> 相同。

--find-copies-harder

由於效能原因,預設情況下,只有在複製的原始檔案在同一個變更集中被修改時,-C 選項才會尋找複製。此標記會使命令檢查未修改的檔案作為複製來源的候選者。對於大型專案而言,這是一個非常昂貴的操作,因此請謹慎使用。給定一個以上的 -C 選項具有相同的效果。

-D
--irreversible-delete

省略刪除的前影像,即只列印標頭,而不列印前影像和 /dev/null 之間的差異。結果修補程式不應使用 patchgit apply 應用;這僅適用於只想專注於檢閱變更後文字的人員。此外,輸出顯然缺乏足夠的資訊來反向套用此類修補程式,即使是手動套用,因此該選項才如此命名。

-B 一起使用時,也會省略刪除/建立配對的刪除部分中的前影像。

-l<num>

-M-C 選項涉及一些初步步驟,這些步驟可以廉價地偵測重新命名/複製的子集,然後是一個詳盡的回退部分,將所有剩餘的未配對目的地與所有相關來源進行比較。(對於重新命名,只有剩餘的未配對來源是相關的;對於複製,所有原始來源都是相關的。)對於 N 個來源和目的地,此詳盡檢查為 O(N^2)。如果所涉及的來源/目的地檔案數量超過指定的數字,則此選項會阻止執行重新命名/複製偵測的詳盡部分。預設值為 diff.renameLimit。請注意,值 0 會被視為無限制。

--diff-filter=[(A|C|D|M|R|T|U|X|B)…​[*]]

僅選取已新增 (A)、複製 (C)、刪除 (D)、修改 (M)、重新命名 (R)、其類型(即一般檔案、符號連結、子模組、…)已變更 (T)、未合併 (U)、未知 (X) 或其配對已中斷 (B) 的檔案。可以使用篩選字元的任何組合(包括無)。當 *(全選或全不選)新增到組合時,如果比較中存在任何符合其他條件的檔案,則會選取所有路徑;如果沒有任何檔案符合其他條件,則不會選取任何內容。

此外,這些大寫字母可以轉換為小寫字母以排除。例如,--diff-filter=ad 會排除已新增和已刪除的路徑。

請注意,並非所有差異都可能包含所有類型。例如,如果停用了這些類型的偵測,則複製和重新命名的項目不會出現。

-S<字串>

尋找變更檔案中指定字串出現次數的差異(即新增/刪除)。適用於腳本編寫者使用。

當您尋找確切的程式碼區塊(例如結構)時,這很有用,並且想知道該區塊從首次出現以來的歷史記錄:迭代使用此功能將前影像中感興趣的區塊回饋到 -S 中,並持續執行直到您獲得該區塊的最初版本。

也會搜尋二進位檔案。

-G<正規表示式>

尋找補丁文字中包含符合 <正規表示式> 的新增/刪除行的差異。

為了說明 -S<正規表示式> --pickaxe-regex-G<正規表示式> 之間的差異,請考慮在同一個檔案中有以下差異的提交

+    return frotz(nitfol, two->ptr, 1, 0);
...
-    hit = frotz(nitfol, mf2.ptr, 1, 0);

雖然 git log -G"frotz\(nitfol" 會顯示此提交,但 git log -S"frotz\(nitfol" --pickaxe-regex 不會顯示(因為該字串的出現次數沒有改變)。

除非提供 --text,否則將會忽略沒有 textconv 過濾器的二進位檔案的補丁。

有關更多資訊,請參閱 gitdiffcore[7] 中的 *pickaxe* 條目。

--find-object=<物件 ID>

尋找變更指定物件出現次數的差異。與 -S 類似,只是參數不同,它不是搜尋特定字串,而是搜尋特定物件 ID。

物件可以是 blob 或子模組提交。它隱含了 git-log 中的 -t 選項,也會尋找樹狀結構。

--pickaxe-all

-S-G 找到變更時,顯示該變更集中所有變更,而不僅僅是包含 <字串> 中變更的檔案。

--pickaxe-regex

將提供給 -S 的 <字串> 視為要比對的擴充 POSIX 正規表示式。

-O<排序檔>

控制檔案在輸出中出現的順序。這會覆寫 diff.orderFile 組態變數(請參閱 git-config[1])。若要取消 diff.orderFile,請使用 -O/dev/null

輸出順序由 <排序檔> 中 glob 模式的順序決定。首先輸出所有路徑名稱符合第一個模式的檔案,接著輸出所有路徑名稱符合第二個模式(但不是第一個)的檔案,依此類推。最後輸出所有路徑名稱不符合任何模式的檔案,就像檔案結尾有一個隱含的比對所有模式。如果多個路徑名稱具有相同的排名(它們符合相同的模式但沒有更早的模式),它們彼此之間的輸出順序將是正常順序。

<排序檔> 的剖析方式如下

  • 會忽略空白行,因此它們可用作分隔符號以提高可讀性。

  • 會忽略以井字號("#")開頭的行,因此它們可用於註解。如果在模式開頭加上井字號,請在模式開頭新增反斜線("\")。

  • 其他每一行都包含單一模式。

模式具有與用於 fnmatch(3) 的模式相同的語法和語意,但沒有 FNM_PATHNAME 標誌,除非移除任何數量的最終路徑名稱元件符合模式,否則路徑名稱也符合模式。例如,模式 "foo*bar" 符合 "fooasdfbar" 和 "foo/bar/baz/asdf",但不符合 "foobarx"。

--skip-to=<檔案>
--rotate-to=<檔案>

從輸出中捨棄已命名的 <檔案> 之前的檔案(即 *跳到*),或將它們移動到輸出的結尾(即 *旋轉到*)。這些選項主要是為了 git difftool 命令的使用而發明的,否則可能不太有用。

-R

交換兩個輸入;也就是說,顯示從索引或磁碟上的檔案到樹狀結構內容的差異。

--relative[=<路徑>]
--no-relative

當從專案的子目錄執行時,可以告知它排除目錄外部的變更,並使用此選項顯示相對於它的路徑名稱。當您不在子目錄中時(例如在裸儲存庫中),您可以透過提供 <路徑> 作為引數來指定要使輸出相對於哪個子目錄。可以使用 --no-relative 來反駁 diff.relative 組態選項和先前的 --relative

-a
--text

將所有檔案視為文字。

--ignore-cr-at-eol

在進行比較時,忽略行尾的回車符。

--ignore-space-at-eol

忽略行尾空白字元的變更。

-b
--ignore-space-change

忽略空白字元數量的變更。這會忽略行尾的空白字元,並將所有其他一個或多個空白字元的序列視為等效。

-w
--ignore-all-space

在比較行時忽略空白字元。即使一行有空白字元而另一行沒有,也會忽略差異。

--ignore-blank-lines

忽略所有行皆為空白的變更。

-I<正規表示式>
--ignore-matching-lines=<正規表示式>

忽略所有行皆符合 <正規表示式> 的變更。可以多次指定此選項。

--inter-hunk-context=<行數>

顯示差異區塊之間的上下文,最多為指定的行數,從而合併彼此接近的區塊。預設為 diff.interHunkContext,如果未設定組態選項,則為 0。

-W
--function-context

將整個函式顯示為每個變更的上下文行。函式名稱的決定方式與 git diff 計算補丁區塊標頭的方式相同(請參閱 gitattributes[5] 中的 *定義自訂區塊標頭*)。

--exit-code

使程式以類似 diff(1) 的程式碼結束。也就是說,如果有差異則以 1 結束,而 0 表示沒有差異。

--quiet

停用程式的所有輸出。隱含 --exit-code。停用不信任其結束程式碼的外部差異輔助程式的執行,即它們各自的組態選項 diff.trustExitCodediff.<驅動程式>.trustExitCode 或環境變數 GIT_EXTERNAL_DIFF_TRUST_EXIT_CODE 為 false。

--ext-diff

允許執行外部差異輔助程式。如果您使用 gitattributes[5] 設定外部差異驅動程式,則需要將此選項與 git-log[1] 和相關命令搭配使用。

--no-ext-diff

不允許使用外部差異驅動程式。

--textconv
--no-textconv

允許(或不允許)在比較二進位檔案時執行外部文字轉換過濾器。有關詳細資訊,請參閱 gitattributes[5]。因為 textconv 過濾器通常是單向轉換,因此產生的差異適合人類閱讀,但無法套用。因此,textconv 過濾器預設僅針對 git-diff[1]git-log[1] 啟用,但不會針對 git-format-patch[1] 或差異管線命令啟用。

--ignore-submodules[=<when>]

忽略差異產生中子模組的變更。 <when> 可以是 "none"、"untracked"、"dirty" 或 "all",這是預設值。當子模組包含未追蹤或已修改的檔案時,或其 HEAD 與超專案中記錄的提交不同時,使用 "none" 會將子模組視為已修改,並且可以用來覆寫 git-config[1]gitmodules[5] 中 *ignore* 選項的任何設定。使用 "untracked" 時,子模組僅包含未追蹤的內容時,不會視為 dirty(但仍會掃描已修改的內容)。使用 "dirty" 會忽略對子模組工作樹狀結構的所有變更,只會顯示儲存在超專案中的提交變更(這是 1.7.0 之前的行為)。使用 "all" 會隱藏對子模組的所有變更。

--src-prefix=<字首>

顯示給定的來源字首,而不是 "a/"。

--dst-prefix=<字首>

顯示給定的目的地字首,而不是 "b/"。

--no-prefix

不顯示任何來源或目的地字首。

--default-prefix

使用預設的來源和目的地字首("a/" 和 "b/")。這會覆寫組態變數,例如 diff.noprefixdiff.srcPrefixdiff.dstPrefixdiff.mnemonicPrefix(請參閱 git-config(1))。

--line-prefix=<字首>

在每行輸出前面加上額外的字首。

--ita-invisible-in-index

預設情況下,由 "git add -N" 新增的項目會在 "git diff" 中顯示為現有的空白檔案,在 "git diff --cached" 中顯示為新檔案。此選項會使項目在 "git diff" 中顯示為新檔案,在 "git diff --cached" 中顯示為不存在。此選項可以使用 --ita-visible-in-index 還原。這兩個選項都是實驗性的,未來可能會移除。

有關這些常見選項的更詳細說明,另請參閱 gitdiffcore[7]

-1 --base
-2 --ours
-3 --theirs

將工作目錄與「基礎」版本(stage #1)、「我們的分支」(stage #2)或「他們的分支」(stage #3)進行比較。索引僅針對未合併的條目包含這些 stage,也就是在解決衝突時。詳情請參閱 git-read-tree[1] 的「三向合併」章節。

-0

省略未合併條目的差異輸出,僅顯示「Unmerged」(未合併)。僅當比較工作目錄與索引時才能使用。

<路徑>…​

指定的 <路徑> 參數用於將差異限制在指定的路徑(您可以提供目錄名稱,並取得其下所有檔案的差異)。

原始輸出格式

"git-diff-index"、"git-diff-tree"、"git-diff-files" 和 "git diff --raw" 的原始輸出格式非常相似。

這些命令都會比較兩組事物;比較的內容各不相同

git-diff-index <tree-ish>

比較 <tree-ish> 與檔案系統上的檔案。

git-diff-index --cached <tree-ish>

比較 <tree-ish> 與索引。

git-diff-tree [-r] <tree-ish-1> <tree-ish-2> [<模式>…​]

比較由兩個引數命名的樹。

git-diff-files [<模式>…​]

比較索引和檔案系統上的檔案。

"git-diff-tree" 命令會先印出比較的雜湊值。之後,所有命令都會針對每個變更的檔案印出一行輸出。

輸出行的格式如下

in-place edit  :100644 100644 bcd1234 0123456 M file0
copy-edit      :100644 100644 abcd123 1234567 C68 file1 file2
rename-edit    :100644 100644 abcd123 1234567 R86 file1 file3
create         :000000 100644 0000000 1234567 A file4
delete         :100644 000000 1234567 0000000 D file5
unmerged       :000000 000000 0000000 0000000 U file6

也就是從左到右依序為:

  1. 一個冒號。

  2. "src" 的模式;如果是建立或未合併則為 000000。

  3. 一個空格。

  4. "dst" 的模式;如果是刪除或未合併則為 000000。

  5. 一個空格。

  6. "src" 的 SHA1;如果是建立或未合併則為 0{40}。

  7. 一個空格。

  8. "dst" 的 SHA1;如果是刪除、未合併或「工作目錄與索引不同步」則為 0{40}。

  9. 一個空格。

  10. 狀態,後面可選擇性地加上「分數」數字。

  11. 一個 tab 或 NUL 字元,當使用 -z 選項時。

  12. "src" 的路徑

  13. 一個 tab 或 NUL 字元,當使用 -z 選項時;僅存在於 C 或 R。

  14. "dst" 的路徑;僅存在於 C 或 R。

  15. 一個 LF 或 NUL 字元,當使用 -z 選項時,用來終止紀錄。

可能的狀態字母為:

  • A:新增檔案

  • C:將檔案複製到新的檔案

  • D:刪除檔案

  • M:修改檔案的內容或模式

  • R:重新命名檔案

  • T:變更檔案類型(一般檔案、符號連結或子模組)

  • U:檔案未合併(您必須完成合併才能提交)

  • X:「未知」的變更類型(很可能是錯誤,請回報)

狀態字母 C 和 R 後面總是會加上分數(表示移動或複製的來源和目標之間的相似百分比)。狀態字母 M 後面可能會加上分數(表示檔案重寫的不相似百分比)。

如果檔案系統上的檔案與索引不同步,則 "dst" 的 SHA1 會顯示為全 0。

範例

:100644 100644 5be4a4a 0000000 M file.c

在沒有 -z 選項的情況下,具有「不常見」字元的路徑名稱會如配置變數 core.quotePath 所解釋的那樣被引用(請參閱 git-config[1])。使用 -z 時,檔案名稱會逐字輸出,並且行會以 NUL 位元組終止。

合併的差異格式

"git-diff-tree"、"git-diff-files" 和 "git-diff --raw" 可以使用 -c--cc 選項來產生合併提交的差異輸出。此輸出與上述格式的差異如下:

  1. 每個父節點都有一個冒號

  2. 有更多的 "src" 模式和 "src" SHA1

  3. 狀態是每個父節點串接的狀態字元

  4. 沒有可選擇的「分數」數字

  5. 以 tab 分隔的檔案路徑

對於 -c--cc,即使檔案在歷史記錄的任何一方被重新命名,也只會顯示目標或最終路徑。使用 --combined-all-paths 時,會顯示每個父節點中的路徑名稱,後面接著合併提交中的路徑名稱。

沒有 --combined-all-paths-c--cc 範例

::100644 100644 100644 fabadb8 cc95eb0 4866510 MM	desc.c
::100755 100755 100755 52b7a2d 6d1ac04 d2ac7d7 RM	bar.sh
::100644 100644 100644 e07d6c5 9042e82 ee91881 RR	phooey.c

--combined-all-paths 新增到 -c--cc 時的範例

::100644 100644 100644 fabadb8 cc95eb0 4866510 MM	desc.c	desc.c	desc.c
::100755 100755 100755 52b7a2d 6d1ac04 d2ac7d7 RM	foo.sh	bar.sh	bar.sh
::100644 100644 100644 e07d6c5 9042e82 ee91881 RR	fooey.c	fuey.c	phooey.c

請注意,合併差異僅列出從所有父節點修改過的檔案。

使用 -p 產生修補程式文字

使用 -p 選項執行 git-diff[1]git-log[1]git-show[1]git-diff-index[1]git-diff-tree[1]git-diff-files[1] 會產生修補程式文字。您可以透過 GIT_EXTERNAL_DIFFGIT_DIFF_OPTS 環境變數(請參閱 git[1])以及 diff 屬性(請參閱 gitattributes[5])來自訂修補程式文字的建立。

-p 選項產生的內容與傳統的 diff 格式略有不同

  1. 它前面會有一個「git diff」標頭,如下所示

    diff --git a/file1 b/file2

    除非涉及重新命名/複製,否則 a/b/ 檔案名稱是相同的。特別是,即使是建立或刪除,也不會在 a/b/ 檔案名稱的位置使用 /dev/null

    當涉及重新命名/複製時,file1file2 會分別顯示重新命名/複製的來源檔案名稱和重新命名/複製產生的檔案名稱。

  2. 後面會接著一或多個擴充標頭行

    old mode <mode>
    new mode <mode>
    deleted file mode <mode>
    new file mode <mode>
    copy from <path>
    copy to <path>
    rename from <path>
    rename to <path>
    similarity index <number>
    dissimilarity index <number>
    index <hash>..<hash> <mode>

    檔案模式會以包含檔案類型和檔案權限位元的 6 位八進位數字列印。

    擴充標頭中的路徑名稱不包含 a/b/ 前綴。

    相似性索引是不變行的百分比,不相似性索引是變更行的百分比。它是一個四捨五入的整數,後面跟著一個百分比符號。因此,100% 的相似性索引值保留給兩個相等的檔案,而 100% 的不相似性表示舊檔案中沒有任何一行進入到新檔案中。

    索引行包含變更前後的 blob 物件名稱。如果檔案模式沒有變更,則會包含 <模式>;否則,會使用單獨的行來表示舊模式和新模式。

  3. 具有「不常見」字元的路徑名稱會如配置變數 core.quotePath 所解釋的那樣被引用(請參閱 git-config[1])。

  4. 輸出中的所有 file1 檔案都指向提交之前的檔案,而所有 file2 檔案都指向提交之後的檔案。依序將每個變更套用到每個檔案是不正確的。例如,此修補程式會交換 a 和 b

    diff --git a/a b/b
    rename from a
    rename to b
    diff --git a/b b/a
    rename from b
    rename to a
  5. Hunk 標頭會提及 hunk 所屬的函式名稱。有關如何針對特定語言量身訂製此資訊的詳細資訊,請參閱 gitattributes[5] 中的「定義自訂 hunk 標頭」。

合併差異格式

任何產生差異的命令都可以使用 -c--cc 選項,在顯示合併時產生合併差異。這是使用 git-diff[1]git-show[1] 顯示合併時的預設格式。另請注意,您可以為任何這些命令提供合適的 --diff-merges 選項,以強制以特定格式產生差異。

「合併差異」格式如下

diff --combined describe.c
index fabadb8,cc95eb0..4866510
--- a/describe.c
+++ b/describe.c
@@@ -98,20 -98,12 +98,20 @@@
	return (a_date > b_date) ? -1 : (a_date == b_date) ? 0 : 1;
  }

- static void describe(char *arg)
 -static void describe(struct commit *cmit, int last_one)
++static void describe(char *arg, int last_one)
  {
 +	unsigned char sha1[20];
 +	struct commit *cmit;
	struct commit_list *list;
	static int initialized = 0;
	struct commit_name *n;

 +	if (get_sha1(arg, sha1) < 0)
 +		usage(describe_usage);
 +	cmit = lookup_commit_reference(sha1);
 +	if (!cmit)
 +		usage(describe_usage);
 +
	if (!initialized) {
		initialized = 1;
		for_each_ref(get_name);
  1. 前面會有一個「git diff」標頭,如下所示(當使用 -c 選項時)

    diff --combined file

    或如下所示(當使用 --cc 選項時)

    diff --cc file
  2. 後面會接著一或多個擴充標頭行(此範例顯示具有兩個父節點的合併)

    index <hash>,<hash>..<hash>
    mode <mode>,<mode>..<mode>
    new file mode <mode>
    deleted file mode <mode>,<mode>

    只有在至少有一個 <mode> 與其他不同時,才會出現 mode <mode>,<mode>..<mode> 行。具有有關偵測到的內容移動(重新命名和複製偵測)資訊的擴充標頭旨在與兩個 <tree-ish> 的差異一起使用,並且不被合併差異格式使用。

  3. 後面會接著一個兩行的 from-file/to-file 標頭

    --- a/file
    +++ b/file

    與傳統的統一差異格式的兩行標頭類似,/dev/null 用來表示建立或刪除的檔案。

    但是,如果提供了 --combined-all-paths 選項,您會得到一個 N+1 行的 from-file/to-file 標頭,而不是兩行的 from-file/to-file,其中 N 是合併提交中父節點的數量

    --- a/file
    --- a/file
    --- a/file
    +++ b/file

    如果重新命名或複製偵測處於活動狀態,此擴充格式會很有用,讓您可以查看不同父節點中檔案的原始名稱。

  4. Chunk 標頭格式已修改,以防止人們意外地將其饋送到 patch -p1。合併差異格式是為審查合併提交變更而建立的,並非旨在套用。此變更與擴充的索引標頭中的變更類似

    @@@ <from-file-range> <from-file-range> <to-file-range> @@@

    在合併差異格式的 Chunk 標頭中,有(父節點數量 + 1)個 @ 字元。

與傳統的統一差異格式不同,後者會顯示具有單一欄的兩個檔案 A 和 B,其中包含 -(減號 — 出現在 A 中但在 B 中移除)、+(加號 — 在 A 中遺失但新增到 B)或 " "(空格 — 未變更)前綴,此格式會比較兩個或多個檔案 file1、file2、…​ 與一個檔案 X,並顯示 X 與每個 fileN 的差異。在輸出行的前面會加上每個 fileN 的一欄,以指出 X 的行與它有何不同。

欄 N 中的 - 字元表示該行出現在 fileN 中,但不顯示在結果中。欄 N 中的 + 字元表示該行出現在結果中,而 fileN 沒有該行(換句話說,從該父節點的角度來看,該行是新增的)。

在上述範例輸出中,函式簽名已從兩個檔案變更(因此,從 file1 和 file2 中刪除了兩個 -,加上 ++ 表示新增的一行不會出現在 file1 或 file2 中)。此外,其他八行與 file1 相同,但未出現在 file2 中(因此以 + 作為前綴)。

當由 git diff-tree -c 顯示時,它會比較合併提交的父節點與合併結果(即 file1..fileN 是父節點)。當由 git diff-files -c 顯示時,它會比較兩個未解析的合併父節點與工作目錄檔案(即 file1 是 stage 2,也就是「我們的版本」,file2 是 stage 3,也就是「他們的版本」)。

其他差異格式

--summary 選項會描述新加入、刪除、重新命名和複製的檔案。--stat 選項會在輸出中加入 diffstat(1) 圖形。這些選項可以與其他選項(例如 -p)組合使用,並且是供人閱讀的。

當顯示涉及重新命名或複製的變更時,--stat 輸出會透過合併路徑名稱的常見前綴和後綴來簡潔地格式化路徑名稱。例如,將 arch/i386/Makefile 移動到 arch/x86/Makefile 並同時修改 4 行的變更會顯示如下:

arch/{i386 => x86}/Makefile    |   4 +--

--numstat 選項提供 diffstat(1) 資訊,但設計為更易於機器解析。--numstat 輸出的項目看起來像這樣

1	2	README
3	1	arch/{i386 => x86}/Makefile

也就是說,從左到右依序為

  1. 新增的行數;

  2. 一個 tab 字元;

  3. 刪除的行數;

  4. 一個 tab 字元;

  5. 路徑名稱 (可能包含重新命名/複製資訊);

  6. 一個換行符號。

-z 輸出選項生效時,輸出格式如下

1	2	README NUL
3	1	NUL arch/i386/Makefile NUL arch/x86/Makefile NUL

也就是說

  1. 新增的行數;

  2. 一個 tab 字元;

  3. 刪除的行數;

  4. 一個 tab 字元;

  5. 一個 NUL 字元 (僅在重新命名/複製時存在);

  6. 前映像中的路徑名稱;

  7. 一個 NUL 字元 (僅在重新命名/複製時存在);

  8. 後映像中的路徑名稱 (僅在重新命名/複製時存在);

  9. 一個 NUL 字元。

重新命名情況下,前映像路徑之前的額外 NUL 字元是為了讓讀取輸出的腳本能夠判斷目前讀取的記錄是單一路徑記錄還是重新命名/複製記錄,而無需事先讀取。在讀取新增和刪除的行之後,讀取直到 NUL 字元會產生路徑名稱,但如果該字元是 NUL,則該記錄會顯示兩個路徑。

範例

檢查工作目錄的各種方式
$ git diff            (1)
$ git diff --cached   (2)
$ git diff HEAD       (3)
$ git diff AUTO_MERGE (4)
  1. 工作目錄中尚未暫存以供下次 commit 的變更。

  2. 索引和您上次 commit 之間的變更;如果您在沒有 -a 選項的情況下執行 git commit,您將 commit 的內容。

  3. 自上次 commit 以來,工作目錄中的變更;如果您執行 git commit -a,您將 commit 的內容。

  4. 您為了解決文字衝突而在工作目錄中所做的變更。

與任意 commit 進行比較
$ git diff test            (1)
$ git diff HEAD -- ./test  (2)
$ git diff HEAD^ HEAD      (3)
  1. 與其使用目前分支的頂端,不如與 "test" 分支的頂端進行比較。

  2. 與其與 "test" 分支的頂端進行比較,不如與目前分支的頂端進行比較,但將比較限制在 "test" 檔案。

  3. 比較上次 commit 之前的版本和上次 commit。

比較分支
$ git diff topic master    (1)
$ git diff topic..master   (2)
$ git diff topic...master  (3)
  1. 主題分支和 master 分支頂端之間的變更。

  2. 與上述相同。

  3. 自主題分支從 master 分支開始以來,master 分支上發生的變更。

限制 diff 輸出
$ git diff --diff-filter=MRC            (1)
$ git diff --name-status                (2)
$ git diff arch/i386 include/asm-i386   (3)
  1. 僅顯示修改、重新命名和複製,但不顯示新增或刪除。

  2. 僅顯示名稱和變更的性質,而不顯示實際的 diff 輸出。

  3. 將 diff 輸出限制為指定子樹。

處理 diff 輸出
$ git diff --find-copies-harder -B -C  (1)
$ git diff -R                          (2)
  1. 花費額外時間來尋找重新命名、複製和完整重寫 (非常耗時)。

  2. 反向輸出 diff。

組態

本節中此行以下的所有內容均選自 git-config[1] 文件。內容與那裡找到的相同

diff.autoRefreshIndex

當使用 git diff 與工作目錄檔案進行比較時,請勿將僅限 stat 的變更視為已變更。而是靜默執行 git update-index --refresh 以更新路徑的快取 stat 資訊,這些路徑在工作目錄中的內容與索引中的內容相符。此選項預設為 true。請注意,這僅影響 git diff Porcelain,而不影響較低層級的 diff 命令 (例如 git diff-files)。

diff.dirstat

一個以逗號分隔的 --dirstat 參數列表,指定 git-diff[1] 和相關命令的 --dirstat 選項的預設行為。預設值可以在命令列上覆寫 (使用 --dirstat=<param1,param2,...>)。後備預設值 (當未由 diff.dirstat 變更時) 為 changes,noncumulative,3。以下參數可用

changes

通過計算從來源刪除或新增到目的地的行來計算 dirstat 數。這會忽略檔案中純程式碼移動的量。換句話說,重新排列檔案中的行與其他變更的計數相同。當未給定參數時,這是預設行為。

lines

通過執行常規的基於行的差異分析並求和刪除/新增的行數來計算 dirstat 數。(對於二進位檔案,請計算 64 位元組的區塊,因為二進位檔案沒有自然的行概念)。這是一個比 changes 行為更昂貴的 --dirstat 行為,但它確實會將檔案中重新排列的行與其他變更計數相同。產生的輸出與您從其他 --*stat 選項獲得的輸出一致。

files

通過計算已變更檔案的數量來計算 dirstat 數。每個變更的檔案在 dirstat 分析中計數相同。這是計算成本最低的 --dirstat 行為,因為它根本不必查看檔案內容。

cumulative

同時計算父目錄中子目錄的變更。請注意,當使用 cumulative 時,報告的百分比總和可能超過 100%。可以使用 noncumulative 參數指定預設(非累計)行為。

<limit>

整數參數指定截止百分比(預設為 3%)。變更量少於此百分比的目錄不會顯示在輸出中。

範例:以下將計算已變更的檔案,同時忽略變更檔案總數少於 10% 的目錄,並在父目錄中累積子目錄計數:files,10,cumulative

diff.statNameWidth

限制 --stat 輸出中檔案名稱部分的寬度。如果設定,則適用於除 format-patch 之外的所有產生 --stat 輸出的命令。

diff.statGraphWidth

限制 --stat 輸出中圖形部分的寬度。如果設定,則適用於除 format-patch 之外的所有產生 --stat 輸出的命令。

diff.context

產生具有 <n> 行內容的 diff,而不是預設的 3 行。此值會被 -U 選項覆寫。

diff.interHunkContext

顯示 diff 區塊之間的內容,最多顯示指定行數,從而融合彼此靠近的區塊。此值用作 --inter-hunk-context 命令列選項的預設值。

diff.external

如果設定此組態變數,則不會使用內部 diff 機制執行 diff 產生,而是使用給定的命令。可以使用 'GIT_EXTERNAL_DIFF' 環境變數覆寫。該命令會使用 git[1] 中 "git Diffs" 下所述的參數來呼叫。注意:如果只想在檔案的子集中使用外部 diff 程式,您可能需要改用 gitattributes[5]

diff.trustExitCode

如果此布林值設定為 true,則 diff.external 命令預期在它認為輸入檔案相等時傳回結束代碼 0,或者在它認為輸入檔案不同時傳回 1,就像 diff(1) 一樣。如果設定為 false,這是預設值,則預期命令無論是否相等都會傳回結束代碼 0。任何其他結束代碼都會導致 Git 回報嚴重錯誤。

diff.ignoreSubmodules

設定 --ignore-submodules 的預設值。請注意,這僅影響 git diff Porcelain,而不影響較低層級的 diff 命令 (例如 git diff-files)。當回報未 commit 的變更時,git checkoutgit switch 也會遵循此設定。將其設定為 *all* 會停用通常由 git commitgit status 在設定 status.submoduleSummary 時顯示的子模組摘要,除非使用 --ignore-submodules 命令列選項覆寫。此設定不會影響 git submodule 命令。預設情況下,此設定會設定為 untracked,以便忽略任何未追蹤的子模組。

diff.mnemonicPrefix

如果設定,git diff 會根據比較的內容,使用與標準 "a/" 和 "b/" 不同的前綴對。當此組態生效時,反向 diff 輸出也會交換前綴的順序

git diff

比較 (i)ndex 和 (w)ork tree;

git diff HEAD

比較 (c)ommit 和 (w)ork tree;

git diff --cached

比較 (c)ommit 和 (i)ndex;

git diff HEAD:file1 file2

比較 (o)bject 和 (w)ork tree 實體;

git diff --no-index a b

比較兩個非 git 物件 (1) 和 (2)。

diff.noPrefix

如果設定,git diff 不會顯示任何來源或目的地前綴。

diff.srcPrefix

如果設定,git diff 會使用此來源前綴。預設為 "a/"。

diff.dstPrefix

如果設定,git diff 會使用此目的地前綴。預設為 "b/"。

diff.relative

如果設定為 true,則 git diff 不會顯示目錄外的變更,並且會顯示相對於目前目錄的路徑名稱。

diff.orderFile

指示如何排序 diff 中檔案的檔案。有關詳細資訊,請參閱 git-diff[1]-O 選項。如果 diff.orderFile 是相對路徑名稱,則會將其視為相對於工作目錄頂端。

diff.renameLimit

在複製/重新命名偵測的詳盡部分中要考慮的檔案數;相當於 git diff 選項 -l。如果未設定,則預設值目前為 1000。如果關閉重新命名偵測,則此設定無效。

diff.renames

Git 是否以及如何偵測重新命名。如果設定為 "false",則會停用重新命名偵測。如果設定為 "true",則會啟用基本重新命名偵測。如果設定為 "copies" 或 "copy",Git 也會偵測複製。預設為 true。請注意,這僅影響 git diff Porcelain,例如 git-diff[1]git-log[1],而不影響較低層級的命令,例如 git-diff-files[1]

diff.suppressBlankEmpty

一個布林值,用於禁止在每個空白輸出行的前面列印空格的標準行為。預設值為 false。

diff.submodule

指定子模組差異的顯示格式。"short" 格式只顯示範圍開始和結尾的 commit 名稱。"log" 格式會像 git-submodule[1] summary 一樣列出範圍中的 commit。"diff" 格式會顯示子模組變更內容的內嵌 diff。預設為 "short"。

diff.wordRegex

一個 POSIX Extended Regular Expression,用於決定在執行逐字差異計算時什麼是「字」。與正則表達式匹配的字元序列是「字」,所有其他字元都是可忽略的空格。

diff.<driver>.command

自訂 diff 驅動程式命令。有關詳細資訊,請參閱 gitattributes[5]

diff.<driver>.trustExitCode

如果此布林值設定為 true,則 diff.<driver>.command 命令預期在它認為輸入檔案相等時傳回結束代碼 0,或者在它認為輸入檔案不同時傳回 1,就像 diff(1) 一樣。如果設定為 false,這是預設值,則預期命令無論是否相等都會傳回結束代碼 0。任何其他結束代碼都會導致 Git 回報嚴重錯誤。

diff.<driver>.xfuncname

diff 驅動程式應使用的正則表達式,以識別區塊標頭。也可以使用內建模式。有關詳細資訊,請參閱 gitattributes[5]

diff.<driver>.binary

將此選項設定為 true,使 diff 驅動程式將檔案視為二進位檔。有關詳細資訊,請參閱 gitattributes[5]

diff.<driver>.textconv

diff 驅動程式應呼叫以產生檔案文字轉換版本的命令。轉換結果用於產生人類可讀的 diff。有關詳細資訊,請參閱 gitattributes[5]

diff.<driver>.wordRegex

diff 驅動程式應該用來分割行中單字的正規表示式。詳細資訊請參閱 gitattributes[5]

diff.<driver>.cachetextconv

設定此選項為 true,使 diff 驅動程式快取文字轉換的輸出。詳細資訊請參閱 gitattributes[5]

  • araxis

  • bc

  • codecompare

  • deltawalker

  • diffmerge

  • diffuse

  • ecmerge

  • emerge

  • examdiff

  • guiffy

  • gvimdiff

  • kdiff3

  • kompare

  • meld

  • nvimdiff

  • opendiff

  • p4merge

  • smerge

  • tkdiff

  • vimdiff

  • vscode

  • winmerge

  • xxdiff

diff.indentHeuristic

設定此選項為 false,以停用預設的啟發式演算法,該演算法會移動差異區塊的邊界,以使修補程式更容易閱讀。

diff.algorithm

選擇差異演算法。變體如下:

default, myers

基本的貪婪差異演算法。目前,這是預設值。

minimal

花費額外的時間來確保產生最小的差異。

patience

在產生修補程式時使用「耐心差異」演算法。

histogram

此演算法擴展了耐心演算法以「支援低頻率的常見元素」。

diff.wsErrorHighlight

在 diff 的 contextoldnew 行中高亮顯示空白錯誤。多個值以逗號分隔,none 重設先前的值,default 將列表重設為 new,而 allold,new,context 的簡寫。空白錯誤以 color.diff.whitespace 著色。命令行選項 --ws-error-highlight=<kind> 會覆蓋此設定。

diff.colorMoved

如果設定為有效的 <mode> 或 true 值,則 diff 中移動的行會以不同顏色顯示,有關有效模式的詳細資訊,請參閱 git-diff[1] 中的 *--color-moved*。如果僅設定為 true,則將使用預設顏色模式。如果設定為 false,則移動的行不會著色。

diff.colorMovedWS

當使用例如 diff.colorMoved 設定為移動的行著色時,此選項控制處理空格的 <mode>。有關有效模式的詳細資訊,請參閱 git-diff[1] 中的 *--color-moved-ws*。

GIT

屬於 git[1] 套件的一部分

scroll-to-top