簡體中文 ▾ 主題 ▾ 最新版本 ▾ git-diff 上次更新於 2.49.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 [<options>] [--] [<path>...]

此形式用於檢視相對於索引(下一個提交的暫存區)所做的更改。換句話說,這些差異是你可以進一步告訴 Git 新增到索引但你尚未新增的。你可以使用 git-add[1] 暫存這些更改。

git diff [<options>] --no-index [--] <path> <path>

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

git diff [<options>] --cached [--merge-base] [<commit>] [--] [<path>...]

此形式用於檢視你為下一次提交暫存的相對於指定 <commit> 的更改。通常你會希望與最新提交進行比較,因此如果你不提供 <commit>,它將預設為 HEAD。如果 HEAD 不存在(例如,未建立的分支)且未提供 <commit>,它將顯示所有暫存的更改。--staged--cached 的同義詞。

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

git diff [<options>] [--merge-base] <commit> [--] [<path>...]

此形式用於檢視你的工作區中相對於指定 <commit> 的更改。你可以使用 HEAD 與最新提交進行比較,或使用分支名稱與不同分支的最新提交進行比較。

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

git diff [<options>] [--merge-base] <commit> <commit> [--] [<path>...]

此形式用於檢視兩個任意 <commit> 之間的更改。

如果給定了 --merge-base,則將兩個提交的合併基準用作“之前”的一方。git diff --merge-base A B 等同於 git diff $(git merge-base A B) B

git diff [<options>] <commit> <commit>...<commit> [--] [<path>...]

此形式用於檢視合併提交的結果。第一個列出的 <commit> 必須是合併本身;其餘兩個或更多提交應該是其父級。生成所需修訂集的便捷方法是使用字尾 @^!。如果 A 是合併提交,則 git diff A A^@git diff A^!git show A 都會給出相同的合併差異。

git diff [<options>] <commit>..<commit> [--] [<path>...]

這與前面用於檢視兩個任意 <commit> 之間更改的形式(沒有 ..)是同義的。如果省略一側的 <commit>,則效果與使用 HEAD 相同。

git diff [<options>] <commit>...<commit> [--] [<path>...]

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

如果你正在進行一些特殊操作,應注意上述描述中除 --merge-base 情況和使用 .. 符號的最後兩種形式外,所有 <commit> 都可以是任意 <tree>。一個重要的樹是由名為 AUTO_MERGE 的引用指向的樹,它由 ort 合併策略在遇到合併衝突時寫入(參見 git-merge[1])。將工作樹與 AUTO_MERGE 進行比較會顯示你到目前為止為解決文字衝突所做的更改(參見下面的示例)。

有關拼寫 <commit> 的更完整列表,請參閱 gitrevisions[7] 中的“SPECIFYING REVISIONS”部分。然而,diff 是關於比較兩個端點,而不是範圍,並且範圍符號(<commit>..<commit><commit>...<commit>)不表示 gitrevisions[7] 中“SPECIFYING RANGES”部分定義的範圍。

git diff [<options>] <blob> <blob>

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

選項

-p
-u
--patch

生成補丁(參見 使用 -p 生成補丁文字)。這是預設值。

-s
--no-patch

禁止來自 diff 機制的所有輸出。對於像 git show 這樣預設顯示補丁的命令,這很有用,可以抑制其輸出,或者取消別名中命令列上早期 --patch--stat 等選項的效果。

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

生成包含 <n> 行上下文(而不是通常的三行)的 diff。隱含 --patch

--output=<file>

輸出到特定檔案而不是標準輸出。

--output-indicator-new=<char>
--output-indicator-old=<char>
--output-indicator-context=<char>

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

--raw

以原始格式生成差異。

--patch-with-raw

-p --raw 的同義詞。

--indent-heuristic

啟用啟發式演算法,該演算法會移動差異塊邊界,使補丁更易於閱讀。這是預設設定。

--no-indent-heuristic

停用縮排啟發式演算法。

--minimal

花費額外時間以確保生成最小的差異。

--patience

使用“patience diff”演算法生成差異。

--histogram

使用“histogram diff”演算法生成差異。

--anchored=<text>

使用“anchored diff”演算法生成差異。

此選項可以多次指定。

如果一行在源和目標中都存在,只存在一次,並且以 <text> 開頭,則此演算法會嘗試阻止其在輸出中顯示為刪除或新增。它內部使用“patience diff”演算法。

--diff-algorithm=(patience|minimal|histogram|myers)

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

default
myers

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

minimal

花費額外時間以確保生成最小的差異。

patience

生成補丁時使用“patience diff”演算法。

histogram

此演算法擴充套件了 patience 演算法以“支援低出現率的常見元素”。

例如,如果您將 diff.algorithm 變數配置為非預設值,但希望使用預設值,則必須使用 --diff-algorithm=default 選項。

--stat[=<width>[,<name-width>[,<count>]]]

生成差異統計。預設情況下,檔名部分將佔用必要的最大空間,其餘部分用於圖表部分。最大寬度預設為終端寬度,如果未連線到終端則為 80 列,並且可以透過 <width> 覆蓋。檔名部分的寬度可以透過在逗號後給出另一個寬度 <name-width> 或透過設定 diff.statNameWidth=<name-width> 來限制。圖表部分的寬度可以透過使用 --stat-graph-width=<graph-width> 或透過設定 diff.statGraphWidth=<graph-width> 來限制。使用 --stat--stat-graph-width 會影響所有生成統計圖表的命令,而設定 diff.statNameWidthdiff.statGraphWidth 不會影響 git format-patch。透過給出第三個引數 <count>,你可以將輸出限制為前 <count> 行,如果還有更多行,則後面會跟上 ...

這些引數也可以透過 --stat-width=<width>--stat-name-width=<name-width>--stat-count=<count> 單獨設定。

--compact-summary

輸出擴充套件頭資訊的精簡摘要,例如檔案建立或刪除(“new”或“gone”,可選 +l 如果是符號連結)和模式更改(+x-x 分別用於新增或移除可執行位)在 diffstat 中。資訊放在檔名部分和圖表部分之間。隱含 --stat

--numstat

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

--shortstat

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

-X [<param>,...]
--dirstat[=<param>,...]

輸出每個子目錄中相對變化量的分佈。--dirstat 的行為可以透過傳遞逗號分隔的引數列表來自定義。預設值由 diff.dirstat 配置變數控制(參見 git-config[1])。以下引數可用:

changes

透過計算從原始檔刪除或新增到目標檔案的行數來計算 dirstat 數字。這會忽略檔案內純程式碼移動的數量。換句話說,檔案內行的重新排列不會像其他更改那樣被大量計算。當未給出引數時,這是預設行為。

lines

透過執行常規的基於行的差異分析並彙總已刪除/已新增的行數來計算 dirstat 數字。(對於二進位制檔案,改為計算 64 位元組塊,因為二進位制檔案沒有自然的行概念)。這是一種比 changes 行為更昂貴的 --dirstat 行為,但它會將檔案內重新排列的行與其他更改一樣計算。結果輸出與你從其他 --*stat 選項獲得的輸出一致。

files

透過計算更改檔案的數量來計算 dirstat 數字。在 dirstat 分析中,每個更改的檔案都等同計算。這是計算成本最低的 --dirstat 行為,因為它根本不需要檢視檔案內容。

cumulative

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

<limit>

一個整數引數,指定一個截止百分比(預設為 3%)。對更改貢獻低於此百分比的目錄不會顯示在輸出中。

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

--cumulative

--dirstat=cumulative 的同義詞。

--dirstat-by-file[=<param>,...]

--dirstat=files,<param>,... 的同義詞。

--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[=<format>]

指定如何顯示子模組中的差異。當指定 --submodule=short 時,使用 short 格式。此格式僅顯示範圍開頭和結尾的提交名稱。當指定 --submodule--submodule=log 時,使用 log 格式。此格式像 git-submodule[1] summary 一樣列出範圍內的提交。當指定 --submodule=diff 時,使用 diff 格式。此格式顯示子模組內容在提交範圍內的更改的內聯差異。預設為 diff.submodule,如果未設定配置選項,則預設為 short 格式。

--color[=<when>]

顯示彩色差異。--color(即沒有 =<when>)與 --color=always 相同。<when> 可以是 alwaysneverauto 之一。它可以透過 color.uicolor.diff 配置設定更改。

--no-color

關閉彩色差異。這可以用來覆蓋配置設定。它與 --color=never 相同。

--color-moved[=<mode>]

移動的程式碼行會以不同的顏色顯示。它可以透過 diff.colorMoved 配置設定更改。如果未給出選項,<mode> 預設為 no;如果給出無模式的選項,則預設為 zebra。模式必須是以下之一:

no

移動的行不進行高亮顯示。

default

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

plain

在某個位置新增並在另一個位置刪除的任何行將以 color.diff.newMoved 著色。類似地,color.diff.oldMoved 將用於在差異中其他地方新增的已刪除行。此模式會檢測任何移動的行,但在審查中判斷程式碼塊是否未經過排列就被移動時,它並不是很有用。

blocks

至少 20 個字母數字字元的移動文字塊會被貪婪地檢測。檢測到的塊使用 color.diff.(old|new)Moved 顏色進行繪製。相鄰的塊無法區分。

zebra

移動文字塊的檢測方式與 blocks 模式相同。這些塊使用 color.diff.(old|new)Moved 顏色或 color.diff.(old|new)MovedAlternative 進行著色。兩種顏色之間的變化表示檢測到一個新塊。

dimmed-zebra

類似於 zebra,但對移動程式碼中不重要的部分進行了額外的調暗處理。兩個相鄰塊的邊界行被認為是重要的,其餘部分不重要。dimmed_zebra 是一個已棄用的同義詞。

--no-color-moved

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

--color-moved-ws=<mode>,...

這配置了在對 --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[=<mode>]

預設情況下,單詞由空白分隔;參見下面的 --word-diff-regex<mode> 預設為 plain,並且必須是以下之一:

color

僅使用顏色高亮顯示更改的單詞。隱含 --color

plain

將單詞顯示為 [-removed-]{added}。如果分隔符出現在輸入中,則不會嘗試轉義,因此輸出可能不明確。

porcelain

使用一種特殊的基於行的格式,旨在供指令碼消費。新增/刪除/未更改的執行以通常的統一差異格式列印,行首以 +/-/` ` 字元開頭並延伸到行尾。輸入中的換行符由其單獨一行上的波浪號 ~ 表示。

none

再次停用單詞 diff。

請注意,儘管第一個模式的名稱如此,如果啟用,所有模式都使用顏色高亮顯示更改的部分。

--word-diff-regex=<regex>

使用 <regex> 來決定什麼是單詞,而不是將非空白字元的連續序列視為一個單詞。除非已啟用,否則這也隱含 --word-diff

<regex> 的每個不重疊匹配都被視為一個單詞。這些匹配之間的任何內容都被視為空白並被忽略(!)以用於查詢差異的目的。你可能需要將 |[^[:space:]] 附加到你的正則表示式,以確保它匹配所有非空白字元。包含換行符的匹配在換行符處會被靜默截斷(!)。

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

正則表示式也可以透過 diff 驅動程式或配置選項設定,參見 gitattributes[5]git-config[1]。顯式給定它會覆蓋任何 diff 驅動程式或配置設定。Diff 驅動程式會覆蓋配置設定。

--color-words[=<regex>]

相當於 --word-diff=color 加上(如果指定了正則表示式)--word-diff-regex=<regex>

--no-renames

關閉重新命名檢測,即使配置檔案預設開啟。

--[no-]rename-empty

是否使用空 blob 作為重新命名源。

--check

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

--ws-error-highlight=<kind>

高亮顯示差異的 contextoldnew 行中的空白錯誤。多個值用逗號分隔,none 重置以前的值,default 將列表重置為 newallold,new,context 的簡寫。如果未給定此選項,且配置變數 diff.wsErrorHighlight 未設定,則僅高亮顯示 new 行中的空白錯誤。空白錯誤將以 color.diff.whitespace 著色。

--full-index

在生成補丁格式輸出時,不在“index”行上顯示前幾個字元,而是顯示完整的原影像和後圖像 blob 物件名稱。

--binary

除了 --full-index 之外,還輸出一個二進位制 diff,該 diff 可以用 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 會排除已新增和已刪除的路徑。

請注意,並非所有 diff 都能包含所有型別。例如,如果停用對這些型別的檢測,則不會出現已複製和已重新命名條目。

-S<string>

查詢更改檔案中指定 <string> 出現次數(即新增/刪除)的差異。供指令碼編寫者使用。

當您正在尋找一段精確的程式碼塊(例如一個結構體),並想知道該程式碼塊自首次出現以來的歷史記錄時,這很有用:迭代使用此功能,將原始影像中有趣的程式碼塊重新輸入到 -S 中,並一直進行下去,直到您獲得該程式碼塊的最初版本。

二進位制檔案也會被搜尋。

-G<regex>

查詢其補丁文字包含與 <regex> 匹配的新增/刪除行的差異。

為了說明 -S<regex> --pickaxe-regex-G<regex> 之間的區別,考慮一個在同一檔案中具有以下差異的提交:

+    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=<object-id>

查詢更改指定物件出現次數的差異。類似於 -S,只是引數不同,它不搜尋特定字串,而是搜尋特定物件 ID。

該物件可以是 blob 或子模組提交。它隱含了 git-log 中的 -t 選項,以也查詢樹。

--pickaxe-all

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

--pickaxe-regex

將提供給 -S<string> 視為擴充套件的 POSIX 正則表示式進行匹配。

-O<orderfile>

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

輸出順序由 <orderfile> 中 glob 模式的順序決定。路徑名匹配第一個模式的所有檔案首先輸出,路徑名匹配第二個模式(但不匹配第一個)的所有檔案接下來輸出,依此類推。路徑名不匹配任何模式的所有檔案最後輸出,就像檔案末尾有一個隱式匹配所有模式一樣。如果多個路徑名具有相同的優先順序(它們匹配相同的模式但沒有更早的模式),則它們相對於彼此的輸出順序是正常順序。

<orderfile> 解析如下:

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

  • 以井號("#")開頭的行被忽略,因此它們可以用作註釋。如果模式以井號開頭,請在模式開頭新增反斜槓("\")。

  • 其他每行包含一個模式。

模式具有與 fnmatch(3) 使用的模式相同的語法和語義,但沒有 FNM_PATHNAME 標誌,例外是如果移除任意數量的最終路徑名元件匹配模式,則路徑名也匹配模式。例如,模式“foo*bar”匹配“fooasdfbar”和“foo/bar/baz/asdf”但不匹配“foobarx”。

--skip-to=<file>
--rotate-to=<file>

從輸出中丟棄命名 <file> 之前的檔案(即跳到),或將其移到輸出的末尾(即旋轉到)。這些選項主要用於 git difftool 命令,否則可能不太有用。

-R

交換兩個輸入;即,顯示從索引或磁碟檔案到樹內容的差異。

--relative[=<path>]
--no-relative

當從專案的子目錄執行此選項時,可以告訴它排除目錄外部的更改並顯示相對於該目錄的路徑名。當您不在子目錄中(例如,在一個裸倉庫中),您可以透過提供 <path> 作為引數來指定輸出相對於哪個子目錄。--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<regex>
--ignore-matching-lines=<regex>

忽略所有行都匹配 <regex> 的更改。此選項可以多次指定。

--inter-hunk-context=<number>

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

-W
--function-context

為每個更改顯示整個函式作為上下文行。函式名稱的確定方式與 git diff 計算補丁塊頭的方式相同(參見 gitattributes[5] 中“Defining a custom hunk-header”)。

--exit-code

使程式以類似於 diff(1) 的程式碼退出。也就是說,如果存在差異,則以 1 退出,0 表示無差異。

--quiet

停用程式的所有輸出。隱含 --exit-code。停用外部差異助手的執行,其退出程式碼不受信任,即其各自的配置選項 diff.trustExitCodediff.<driver>.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] 或 diff 底層命令啟用。

--ignore-submodules[=(none|untracked|dirty|all)]

在生成差異時忽略對子模組的更改。all 是預設值。使用 none 將在子模組包含未跟蹤或已修改檔案,或其 HEAD 與超專案中記錄的提交不同時,將其視為已修改,並可用於覆蓋 git-config[1]gitmodules[5]ignore 選項的任何設定。當使用 untracked 時,如果子模組僅包含未跟蹤內容,則不會將其視為髒(但仍會掃描其已修改內容)。使用 dirty 會忽略對子模組工作樹的所有更改,僅顯示超專案中儲存的提交更改(這是直到 1.7.0 的行為)。使用 all 會隱藏對子模組的所有更改。

--src-prefix=<prefix>

顯示給定的源字首 <prefix> 而不是 "a/"。

--dst-prefix=<prefix>

顯示給定的目標字首 <prefix> 而不是 "b/"。

--no-prefix

不顯示任何源或目標字首。

--default-prefix

使用預設的源和目標字首(“a/”和“b/”)。這會覆蓋配置變數,例如 diff.noprefixdiff.srcPrefixdiff.dstPrefixdiff.mnemonicPrefix(參見 git-config[1])。

--line-prefix=<prefix>

在每行輸出前面新增一個額外的 <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

將工作區與

  • 使用 -1--base 時的“基礎”版本(階段 #1),

  • 使用 -2--ours 時的“我們的分支”(階段 #2),或

  • 使用 -3--theirs 時的“他們的分支”(階段 #3)。

索引僅包含未合併條目的這些階段,即在解決衝突時。有關詳細資訊,請參見 git-read-tree[1] 的“3-Way Merge”部分。

-0

省略未合併條目的差異輸出,僅顯示“Unmerged”。僅在比較工作樹與索引時可使用。

<path>...

如果給定 <path> 引數,它們將用於將差異限制為指定的路徑(可以給定目錄名稱並獲取其下所有檔案的差異)。

原始輸出格式

來自 git-diff-indexgit-diff-treegit-diff-filesgit 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> [<pattern>...]

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

git-diff-files [<pattern>...]

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

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. 當使用 -z 選項時,一個製表符或一個 NUL。

  12. "src" 的路徑。

  13. 當使用 -z 選項時,一個製表符或一個 NUL;僅在 C 或 R 狀態下存在。

  14. "dst" 的路徑;僅在 C 或 R 狀態下存在。

  15. 當使用 -z 選項時,一個 LF 或一個 NUL,用於終止記錄。

可能的狀態字母是:

  • A:新增檔案

  • C:將檔案複製為新檔案

  • D:刪除檔案

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

  • R:檔案重新命名

  • T:檔案型別(常規檔案、符號連結或子模組)的更改

  • U:檔案未合併(您必須在提交之前完成合並)

  • X:“未知”更改型別(很可能是一個 bug,請報告)

狀態字母 CR 後面總是跟著一個分數(表示移動或複製的原始檔和目標檔案之間的相似度百分比)。對於檔案重寫,狀態字母 M 後面可能跟著一個分數(表示不同度百分比)。

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

示例

:100644 100644 5be4a4a 0000000 M file.c

如果沒有 -z 選項,帶有“不尋常”字元的路徑名將按照配置變數 core.quotePath 的說明進行引用(參見 git-config[1])。使用 -z 時,檔名將原樣輸出,行以 NUL 位元組終止。

合併的 diff 格式

git-diff-treegit-diff-filesgit-diff --raw 可以使用 -c--cc 選項來生成合並提交的差異輸出。輸出格式與上述描述的格式不同,如下所示:

  1. 每個父級都有一個冒號

  2. 有更多的“src”模式和“src”SHA1

  3. 狀態是每個父級的狀態字元的連線

  4. 沒有可選的“分數”數字

  5. 以製表符分隔的檔案路徑名

對於 -c--cc,即使檔案在歷史的任何一側被重新命名,也只顯示目標或最終路徑。使用 --combined-all-paths,將顯示每個父級中的路徑名稱,然後是合併提交中的路徑名稱。

-c--cc 不帶 --combined-all-paths 的示例:

::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

請注意,combined diff 僅列出從所有父級修改過的檔案。

使用 -p 生成補丁文字

執行 git-diff[1]git-log[1]git-show[1]git-diff-index[1]git-diff-tree[1]git-diff-files[1] 並帶上 -p 選項會生成補丁文字。您可以透過 GIT_EXTERNAL_DIFFGIT_DIFF_OPTS 環境變數(參見 git[1])以及 diff 屬性(參見 gitattributes[5])自定義補丁文字的建立。

-p 選項生成的輸出與傳統的 diff 格式略有不同:

  1. 它前面是“git diff”頭,看起來像這樣:

    diff --git a/file1 b/file2

    除非涉及重新命名/複製,否則 a/b/ 檔名相同。特別是,即使是建立或刪除,也不會使用 /dev/null 來代替 a/b/ 檔名。

    當涉及重新命名/複製時,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>

    檔案模式 <mode> 以 6 位八進位制數字列印,包括檔案型別和檔案許可權位。

    擴充套件頭中的路徑名不包含 a/b/ 字首。

    相似度指數是未更改行的百分比,而不同度指數是更改行的百分比。它是一個四捨五入的整數,後跟百分號。因此,100% 的相似度值保留給兩個相同的檔案,而 100% 的不同度意味著舊檔案中的任何行都沒有進入新檔案。

    索引行包括更改前後的 blob 物件名稱。如果檔案模式沒有更改,則包含 <mode>;否則,單獨的行指示舊模式和新模式。

  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-header”。

組合 diff 格式

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

“組合 diff”格式如下所示:

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. 後面跟著一個兩行的“原始檔/目標檔案”頭:

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

    類似於傳統 unified diff 格式的兩行頭,/dev/null 用於指示已建立或已刪除的檔案。

    然而,如果提供了 --combined-all-paths 選項,您將得到一個 N+1 行的“原始檔/目標檔案”頭,而不是兩行的“原始檔/目標檔案”頭,其中 N 是合併提交中父級的數量:

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

    如果重新命名或複製檢測處於活動狀態,這種擴充套件格式會很有用,可以讓您檢視不同父級中檔案的原始名稱。

  4. 塊頭格式已被修改,以防止人們意外地將其饋送給 patch -p1。組合差異格式是為審查合併提交更改而建立的,並非旨在應用。更改類似於擴充套件 索引 頭中的更改:

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

    組合 diff 格式的塊頭中有(父級數量 + 1)個 @ 字元。

與傳統的“統一”差異格式(顯示兩個檔案 A 和 B,以及一個單列,其中包含 -(減號——出現在 A 中但從 B 中刪除)、+(加號——A 中缺失但新增到 B 中)或 " "(空格——未更改)字首)不同,此格式比較兩個或更多檔案 file1、file2 等與一個檔案 X,並顯示 X 與每個 fileN 的差異。每行輸出前面都添加了一列,用於說明 X 的行與 fileN 有何不同。

N 列中的 - 字元表示該行出現在 fileN 中,但未出現在結果中。N 列中的 + 字元表示該行出現在結果中,但 fileN 中沒有該行(換句話說,該行是從該父級角度新增的)。

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

當由 git diff-tree -c 顯示時,它會比較合併提交的父級與合併結果(即 file1..fileN 是父級)。當由 git diff-files -c 顯示時,它會比較兩個未解決的合併父級與工作樹檔案(即 file1 是階段 2,也稱為“我們的版本”,file2 是階段 3,也稱為“他們的版本”)。

其他 diff 格式

--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. 一個製表符;

  3. 刪除的行數;

  4. 一個製表符;

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

  6. 一個換行符。

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

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

即:

  1. 新增的行數;

  2. 一個製表符;

  3. 刪除的行數;

  4. 一個製表符;

  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. 工作樹中尚未暫存用於下一次提交的更改。

  2. 索引與你上次提交之間的更改;如果你執行 git commit 而不帶 -a 選項,你將提交的內容。

  3. 工作樹中自上次提交以來的更改;如果你執行 git commit -a,你將提交的內容。

  4. 你到目前為止為解決文字衝突所做的工作區更改。

與任意提交進行比較
$ git diff test            (1)
$ git diff HEAD -- ./test  (2)
$ git diff HEAD^ HEAD      (3)
  1. 不是使用當前分支的尖端,而是與“test”分支的尖端進行比較。

  2. 不是與“test”分支的尖端進行比較,而是與當前分支的尖端進行比較,但將比較限制在檔案“test”。

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

比較分支
$ git diff topic master    (1)
$ git diff topic..master   (2)
$ git diff topic...master  (3)
  1. 主題分支和 master 分支的最新提交之間的更改。

  2. 同上。

  3. 自主題分支從 master 分支建立以來,master 分支上發生的更改。

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

  2. 只顯示名稱和更改性質,不顯示實際差異輸出。

  3. 將差異輸出限制為命名子樹。

修改差異輸出
$ git diff --find-copies-harder -B -C  (1)
$ git diff -R                          (2)
  1. 花費額外的週期來查詢重新命名、複製和完全重寫(非常昂貴)。

  2. 以相反順序輸出差異。

配置

本節中以下所有內容均從 git-config[1] 文件中選擇性地包含。內容與彼處相同:

diff.autoRefreshIndex

當使用 git diff 比較工作樹檔案時,不要將僅狀態更改視為已更改。相反,靜默執行 git update-index --refresh 以更新工作樹內容與索引內容匹配的路徑的快取狀態資訊。此選項預設為 true。請注意,這僅影響 git diff Porcelain,而不影響較低級別的 diff 命令,例如 git diff-files

diff.dirstat

一個逗號分隔的 --dirstat 引數列表,指定 git diff 及相關命令的 --dirstat 選項的預設行為。預設值可以在命令列上覆蓋(使用 --dirstat=<param>,...)。回退預設值(當 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> 行上下文,而不是預設的 3 行。此值會被 -U 選項覆蓋。

diff.interHunkContext

顯示差異塊之間的上下文,最多指定行數,從而將彼此接近的塊合併。此值作為 --inter-hunk-context 命令列選項的預設值。

diff.external

如果設定了此配置變數,則差異生成不使用內部差異機制,而是使用給定的命令。可以使用 GIT_EXTERNAL_DIFF 環境變數覆蓋。該命令將使用 git[1] 中“git Diffs”下描述的引數進行呼叫。注意:如果您只想在部分檔案上使用外部差異程式,您可能希望改用 gitattributes[5]

diff.trustExitCode

如果此布林值設定為 true,則 diff.external 命令預期在輸入檔案被認為是相等時返回退出程式碼 0,或在它們被認為不同時返回 1,就像 diff(1) 一樣。如果設定為 false(預設值),則該命令預期無論是否相等都返回退出程式碼 0。任何其他退出程式碼都會導致 Git 報告致命錯誤。

diff.ignoreSubmodules

設定 --ignore-submodules 的預設值。請注意,這僅影響 git diff Porcelain,而不影響較低級別的 diff 命令,例如 git diff-filesgit checkoutgit switch 在報告未提交的更改時也會遵守此設定。將其設定為 all 會停用 git commitgit status 通常顯示的子模組摘要,除非透過使用 --ignore-submodules 命令列選項來覆蓋。git submodule 命令不受此設定影響。預設情況下,此設定為 untracked,以便忽略任何未跟蹤的子模組。

diff.mnemonicPrefix

如果設定,git diff 會根據比較內容使用與標準 a/b/ 不同的字首對。當此配置生效時,反向差異輸出也會交換字首的順序。

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 物件 <a><b>

diff.noPrefix

如果設定,git diff 不顯示任何源或目標字首。

diff.srcPrefix

如果設定,git diff 會使用此原始檔字首。預設為 a/

diff.dstPrefix

如果設定,git diff 會使用此目標檔案字首。預設為 b/

diff.relative

如果設定為 truegit diff 不會顯示目錄之外的更改,並顯示相對於當前目錄的路徑名。

diff.orderFile

指定在 diff 中檔案排序方式的檔案。詳情請參閱 -O 選項。如果 diff.orderFile 是相對路徑名,則其被視為相對於工作樹的根目錄。

diff.renameLimit

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

diff.renames

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

diff.suppressBlankEmpty

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

diff.submodule

指定子模組差異的顯示格式。short 格式僅顯示範圍開頭和結尾的提交名稱。log 格式像 git-submodule[1] summary 一樣列出範圍內的提交。diff 格式顯示子模組更改內容的內聯差異。預設為 short

diff.wordRegex

一個 POSIX 擴充套件正則表示式,用於在執行逐字差異計算時確定什麼是“單詞”。匹配正則表示式的字元序列是“單詞”,所有其他字元都是**可忽略**的空白字元。

diff.<驅動器>.command

自定義差異驅動命令。詳情請參閱 gitattributes[5]

diff.<驅動器>.trustExitCode

如果此布林值設定為 true,則 diff.<驅動器>.command 命令應在認為輸入檔案相等時返回退出程式碼 0,或在認為它們不同時返回 1,類似於 diff(1)。如果設定為 false(預設值),則命令應返回退出程式碼 0,無論是否相等。任何其他退出程式碼都會導致 Git 報告致命錯誤。

diff.<驅動器>.xfuncname

差異驅動器應使用的正則表示式以識別 hunk 標題。也可以使用內建模式。詳情請參閱 gitattributes[5]

diff.<驅動器>.binary

將此選項設定為 true 可使差異驅動器將檔案視為二進位制。詳情請參閱 gitattributes[5]

diff.<驅動器>.textconv

差異驅動器應呼叫以生成檔案文字轉換版本的命令。轉換結果用於生成人類可讀的差異。詳情請參閱 gitattributes[5]

diff.<驅動器>.wordRegex

差異驅動器應使用的正則表示式以分割行中的單詞。詳情請參閱 gitattributes[5]

diff.<驅動器>.cachetextconv

將此選項設定為 true 可使差異驅動器快取文字轉換輸出。詳情請參閱 gitattributes[5]

diff.indentHeuristic

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

diff.algorithm

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

default
myers

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

minimal

花費額外時間以確保生成最小的差異。

patience

生成補丁時使用“patience diff”演算法。

histogram

此演算法擴充套件了 patience 演算法以“支援低出現率的常見元素”。

diff.wsErrorHighlight

高亮顯示差異的 context(上下文)、old(舊)或 new(新)行中的空白錯誤。多個值用逗號分隔,none 重置先前的值,default 將列表重置為 newallold,new,context 的簡寫。空白錯誤使用 color.diff.whitespace 顏色著色。命令列選項 --ws-error-highlight=<型別> 會覆蓋此設定。

diff.colorMoved

如果設定為有效的 <模式>true 值,差異中移動的行會以不同的顏色顯示。有關有效模式的詳細資訊,請參閱 --color-moved。如果僅設定為 true,則將使用預設顏色模式。當設定為 false 時,移動的行不著色。

diff.colorMovedWS

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

GIT

Git[1] 套件的一部分

scroll-to-top