Git
英文 ▾ 主題 ▾ 最新版本 ▾ git-diff-tree 最後更新於 2.46.1

名稱

git-diff-tree - 比較透過兩個 tree 物件找到的 blob 的內容和模式

概要

git diff-tree [--stdin] [-m] [-s] [-v] [--no-commit-id] [--pretty]
	      [-t] [-r] [-c | --cc] [--combined-all-paths] [--root] [--merge-base]
	      [<common-diff-options>] <tree-ish> [<tree-ish>] [<path>…​]

描述

比較透過兩個 tree 物件找到的 blob 的內容和模式。

如果只給定一個 <tree-ish>,則會將該提交與其父系進行比較(請參閱下面的 --stdin)。

請注意,git diff-tree 可以使用封裝在提交物件中的 tree。

選項

-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

以原始格式產生 diff。這是預設值。

--patch-with-raw

-p --raw 的同義詞。

--indent-heuristic

啟用啟發式方法,它會移動 diff 塊邊界以使修補程式更易於閱讀。這是預設值。

--no-indent-heuristic

停用縮排啟發式方法。

--minimal

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

--patience

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

--histogram

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

--anchored=<文字>

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

此選項可以指定多次。

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

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

選擇 diff 演算法。變體如下

default, myers

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

minimal

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

patience

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

histogram

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

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

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

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

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

--compact-summary

在 diffstat 中輸出擴充標頭資訊的精簡摘要,例如檔案建立或刪除(「新增」或「已消失」,如果它是符號連結,則選擇性地為「+l」)和模式變更(分別針對新增或移除可執行位元的「+x」或「-x」)。該資訊會放在檔案名稱部分和圖表部分之間。暗示 --stat

--numstat

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

--shortstat

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

-X[<param1,param2,…​>]
--dirstat[=<param1,param2,…​>]

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

changes

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

lines

透過執行常規的基於行的 diff 分析並加總移除/新增的行數來計算 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[=<param1,param2>…​]

與 --dirstat=files,<param1>,<param2>…​ 同義。

--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* 格式。 此格式僅顯示範圍開頭和結尾的 commit 名稱。 當指定 --submodule--submodule=log 時,會使用 *log* 格式。 此格式會列出範圍內的 commit,就像 git-submodule[1] summary 所做的那樣。 當指定 --submodule=diff 時,會使用 *diff* 格式。 此格式會顯示 commit 範圍之間子模組內容變更的內嵌差異。 預設為 diff.submodule,如果未設定配置選項,則預設為 *short* 格式。

--color[=<when>]

顯示彩色差異。 --color (即沒有 *=<when>*) 與 --color=always 相同。 *<when>* 可以是 alwaysneverauto 其中之一。

--no-color

關閉彩色差異。 它與 --color=never 相同。

--color-moved[=<mode>]

移動的程式碼行會以不同的顏色顯示。 如果未給定選項,則 <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=<modes>

這會設定在對 --color-moved 執行移動偵測時如何忽略空格。 這些模式可以以逗號分隔的列表形式給定

no

在執行移動偵測時,不忽略空格。

ignore-space-at-eol

忽略 EOL 中的空格變更。

ignore-space-change

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

ignore-all-space

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

allow-indentation-change

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

--no-color-moved-ws

在執行移動偵測時,不忽略空格。 這可用於覆寫配置設定。 它與 --color-moved-ws=no 相同。

--word-diff[=<mode>]

顯示單字差異,使用 <mode> 來分隔變更的單字。 預設情況下,單字以空格分隔;請參閱下面的 --word-diff-regex。 <mode> 預設為 *plain*,且必須是以下其中之一

color

僅使用顏色突出顯示變更的單字。 隱含 --color

plain

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

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=<kind>

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

--full-index

在產生修補程式格式輸出時,不是顯示前幾個字元,而是在「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<string>

尋找會變更檔案中指定字串出現次數的差異(也就是說,新增/刪除)。旨在供腳本編寫者使用。

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

也會搜尋二進位檔案。

-G<regex>

尋找其修補程式文字包含符合 <regex> 的已新增/移除行的差異。

為了說明 -S<regex> --pickaxe-regex-G<regex> 之間的差異,請考慮一個 commit,其中在同一個檔案中有以下差異

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

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

除非提供了 --text,否則會忽略沒有 textconv 篩選器的二進位檔案修補程式。

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

--find-object=<object-id>

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

該物件可以是 Blob 或子模組 Commit。它會隱含 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

忽略 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.<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] 或差異管道命令啟用。

--ignore-submodules[=<when>]

在產生差異時忽略對子模組的變更。 <when> 可以是 "none"、"untracked"、"dirty" 或 "all",預設為 "all"。使用 "none" 會將子模組視為已修改,當其包含未追蹤或已修改的檔案,或其 HEAD 與超專案中記錄的提交不同時,並且可用於覆蓋 git-config[1]gitmodules[5] 中 *ignore* 選項的任何設定。使用 "untracked" 時,子模組僅包含未追蹤的內容時不會被視為髒的(但仍會掃描已修改的內容)。使用 "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]

<tree-ish>

樹狀物件的 ID。

<路徑>…​

若有提供,結果會被限制為符合提供的路徑規格的檔案子集。

-r

遞迴進入子樹。

-t

顯示樹狀項目本身以及子樹。隱含 -r。

--root

當指定 --root 時,初始提交將顯示為一個大型的建立事件。這相當於與 NULL 樹進行差異比較。

--merge-base

不直接比較 <tree-ish>,而是使用兩個 <tree-ish> 之間的合併基礎作為「之前」的一方。必須提供兩個 <tree-ish>,而且它們都必須是提交。

--stdin

當指定 --stdin 時,命令不會從命令列接收 <tree-ish> 引數。相反地,它會從其標準輸入讀取包含兩個 <tree>、一個 <commit> 或 <commit> 清單的行。(使用單一空格作為分隔符號。)

當提供兩個樹狀結構時,它會將第一個樹狀結構與第二個樹狀結構進行比較。當提供單一提交時,它會將該提交與其父提交進行比較。剩餘的提交(若有提供)會被用作第一個提交的父提交。

在比較兩個樹狀結構時,會在差異之前列印兩個樹狀結構的 ID(以空格分隔並以換行符號結束)。在比較提交時,會列印第一個(或唯一)提交的 ID,然後是換行符號。

以下旗標會進一步影響比較提交(而不是樹狀結構)時的行為。

-m

預設情況下,git diff-tree --stdin 不會顯示合併提交的差異。使用此旗標,它會顯示該提交與其所有父提交的差異。另請參閱 -c

-s

預設情況下,git diff-tree --stdin 會顯示差異,以機器可讀取的格式(不含 -p)或修補程式格式(含 -p)。此輸出可以被抑制。它僅在搭配 -v 旗標時有用。

-v

此旗標會使 git diff-tree --stdin 也會在差異之前顯示提交訊息。

--pretty[=<格式>]
--format=<格式>

以給定的格式漂亮地列印提交日誌的內容,其中 <格式> 可以是 onelineshortmediumfullfullerreferenceemailrawformat:<字串>tformat:<字串> 之一。當 <格式> 不是上述任何一個,且其中有 %佔位符號 時,其行為就如同指定了 --pretty=tformat:<格式>

請參閱「PRETTY FORMATS」章節,了解每個格式的一些其他詳細資訊。當省略 =<格式> 部分時,預設為 medium

注意:您可以在儲存庫配置中指定預設的漂亮格式(請參閱 git-config[1])。

--abbrev-commit

不顯示完整的 40 位元組十六進位提交物件名稱,而是顯示唯一命名物件的前綴。"--abbrev=<n>"(若有顯示差異輸出,也會修改差異輸出)選項可用於指定前綴的最小長度。

這應該會讓使用 80 欄終端機的人更方便閱讀 "--pretty=oneline"。

--no-abbrev-commit

顯示完整的 40 位元組十六進位提交物件名稱。這會否定 --abbrev-commit,無論是明確指定還是其他選項(例如 "--oneline")隱含指定。它也會覆蓋 log.abbrevCommit 變數。

--oneline

這是將 "--pretty=oneline --abbrev-commit" 一起使用的簡寫。

--encoding=<編碼>

提交物件會在其編碼標頭中記錄用於日誌訊息的字元編碼;可以使用此選項來告知命令以使用者偏好的編碼重新編碼提交日誌訊息。對於非管道命令,預設值為 UTF-8。請注意,如果物件聲稱以 X 編碼,而我們以 X 輸出,我們將逐字輸出該物件;這表示原始提交中的無效序列可能會複製到輸出中。同樣地,如果 iconv(3) 無法轉換提交,我們會靜靜地逐字輸出原始物件。

--expand-tabs=<n>
--expand-tabs
--no-expand-tabs

在輸出中顯示之前,在日誌訊息中執行 tab 擴展(將每個 tab 替換為足夠的空格,以填滿下一個顯示欄,該欄是 <n> 的倍數)。--expand-tabs--expand-tabs=8 的簡寫,而 --no-expand-tabs--expand-tabs=0 的簡寫,這會停用 tab 擴展。

預設情況下,tab 會在以 4 個空格縮排日誌訊息的漂亮格式中擴展(即 medium,這是預設值,fullfuller)。

--notes[=<ref>]

在顯示提交日誌訊息時,顯示註解提交的註解(請參閱 git-notes[1])。當命令列上未提供 --pretty--format--oneline 選項時,這是 git loggit showgit whatchanged 命令的預設行為。

預設情況下,顯示的註解來自 core.notesRefnotes.displayRef 變數(或相應的環境覆蓋)中列出的註解 ref。請參閱 git-config[1] 了解詳細資訊。

透過可選的 <ref> 引數,使用 ref 來尋找要顯示的註解。當 ref 以 refs/notes/ 開頭時,可以指定完整的 ref 名稱;當 ref 以 notes/ 開頭時,會在前面加上 refs/;否則,會在前面加上 refs/notes/ 來組成完整的 ref 名稱。

可以組合多個 --notes 選項來控制要顯示哪些註解。例如:「--notes=foo」將只顯示來自「refs/notes/foo」的註解;「--notes=foo --notes」將顯示來自「refs/notes/foo」和預設註解 ref 的註解。

--no-notes

不顯示註解。此選項會重置顯示註解的 ref 列表,進而抵消上述的 --notes 選項。選項會按照命令列上的順序解析,例如「--notes --notes=foo --no-notes --notes=bar」將只顯示來自「refs/notes/bar」的註解。

--show-notes-by-default

除非給定顯示特定註解的選項,否則顯示預設註解。

--show-notes[=<ref>]
--[no-]standard-notes

這些選項已被棄用。請改用上述的 --notes/--no-notes 選項。

--show-signature

透過將簽章傳遞給 gpg --verify 來檢查簽署的提交物件的有效性,並顯示輸出。

--no-commit-id

當適用時,git diff-tree 會輸出一行包含提交 ID 的訊息。此旗標會抑制提交 ID 的輸出。

-c

此旗標會改變顯示合併提交的方式(這表示只有在命令只給定一個 <tree-ish> 或 --stdin 時才有用)。它會同時顯示每個父提交與合併結果之間的差異,而不是一次顯示一個父提交與結果之間的成對差異(這是 -m 選項的作用)。此外,它只會列出所有父提交都修改過的文件。

--cc

此旗標會以類似 -c 選項的方式改變合併提交補丁的顯示方式。它會隱含 -c-p 選項,並進一步壓縮補丁輸出,省略父提交中只有兩種變體且合併結果未經修改就選擇其中一種的無趣區塊。當所有區塊都無趣時,提交本身和提交日誌訊息將不會顯示,就像任何其他「空差異」情況一樣。

--combined-all-paths

此旗標會導致合併差異(用於合併提交)列出所有父提交中的文件名。因此,它只有在指定 -c 或 --cc 時才會生效,而且可能只有在偵測到文件名變更時才有用(即當請求重新命名或複製偵測時)。

--always

即使差異本身為空,也顯示提交本身和提交日誌訊息。

美化格式

如果提交是合併提交,而且美化格式不是 onelineemailraw,則會在 Author: 行之前插入額外的一行。此行以「Merge: 」開頭,並印出祖先提交的雜湊值,以空格分隔。請注意,如果您限制了歷史記錄的檢視範圍,則列出的提交不一定是**直接**父提交的列表:例如,如果您只對與特定目錄或文件相關的變更感興趣。

有幾種內建格式,您可以透過將 pretty.<name> 設定選項設為另一個格式名稱或 format: 字串來定義其他格式,如下所述(請參閱 git-config[1])。以下是內建格式的詳細資訊

  • oneline

    <hash> <title-line>

    此格式的設計盡可能簡潔。

  • short

    commit <hash>
    Author: <author>
    <title-line>
  • medium

    commit <hash>
    Author: <author>
    Date:   <author-date>
    <title-line>
    <full-commit-message>
  • full

    commit <hash>
    Author: <author>
    Commit: <committer>
    <title-line>
    <full-commit-message>
  • fuller

    commit <hash>
    Author:     <author>
    AuthorDate: <author-date>
    Commit:     <committer>
    CommitDate: <committer-date>
    <title-line>
    <full-commit-message>
  • reference

    <abbrev-hash> (<title-line>, <short-author-date>)

    此格式用於在提交訊息中參考另一個提交,且與 --pretty='format:%C(auto)%h (%s, %ad)' 相同。預設情況下,日期會使用 --date=short 格式化,除非明確指定另一個 --date 選項。與任何具有格式佔位符的 format: 一樣,其輸出不會受到其他選項(例如 --decorate--walk-reflogs)的影響。

  • email

    From <hash> <date>
    From: <author>
    Date: <author-date>
    Subject: [PATCH] <title-line>
    <full-commit-message>
  • mboxrd

    email 類似,但提交訊息中以「From 」開頭的行(前面有零個或多個「>」)會用「>」引用,因此它們不會被誤認為是新的提交開始。

  • raw

    raw 格式會完全按照儲存在提交物件中的方式顯示整個提交。值得注意的是,雜湊會完整顯示,無論是否使用 --abbrev 或 --no-abbrev,且 parents 資訊會顯示真正的父提交,而不考慮接枝或歷史記錄簡化。請注意,此格式會影響提交的顯示方式,但不會影響差異的顯示方式,例如使用 git log --raw。若要在原始差異格式中取得完整的物件名稱,請使用 --no-abbrev

  • format:<format-string>

    format:<format-string> 格式可讓您指定要顯示哪些資訊。它的運作方式有點像 printf 格式,但值得注意的是,您會使用 %n 而不是 \n 來取得換行符號。

    例如,format:"%h 的作者是 %an,%ar%n標題是 >>%s<<%n" 會顯示類似這樣的內容

    The author of fe6e0ee was Junio C Hamano, 23 hours ago
    The title was >>t4119: test autocomputing -p<n> for traditional diff input.<<

    佔位符號如下

    • 擴展為單一文字字元的佔位符號

      %n

      換行符號

      %%

      原始 %

      %x00

      %x 後面接著兩個十六進位數字會被取代為具有十六進位數字值的位元組(在本文檔的其餘部分中,我們將稱之為「文字格式化代碼」)。

    • 影響後續佔位符號格式的佔位符號

      %Cred

      將顏色切換為紅色

      %Cgreen

      將顏色切換為綠色

      %Cblue

      將顏色切換為藍色

      %Creset

      重設顏色

      %C(…​)

      顏色規格,如 git-config[1] 的「設定檔」區段中的「值」下所述。預設情況下,只有在啟用記錄輸出(透過 color.diffcolor.ui--color,並遵守前者的 auto 設定,如果我們要進入終端機)時才會顯示顏色。%C(auto,...) 被接受為預設值的歷史同義詞(例如,%C(auto,red))。指定 %C(always,...) 即使未啟用其他顏色時也會顯示顏色(儘管考慮僅使用 --color=always 為整個輸出啟用顏色,包括此格式和 git 可能會著色的任何其他內容)。單獨的 auto(即 %C(auto))將在下一個佔位符號上開啟自動著色,直到再次切換顏色為止。

      %m

      左(<)、右(>)或邊界(-)標記

      %w([<w>[,<i1>[,<i2>]]])

      切換行換行,類似 git-shortlog[1] 的 -w 選項。

      %<( <N> [,trunc|ltrunc|mtrunc])

      讓下一個佔位符號至少佔用 N 個欄寬,必要時在右側填補空格。如果輸出長度超過 N 個欄,可以選擇在左側 (ltrunc) ..ft、中間 (mtrunc) mi..le 或結尾 (trunc) rig.. 處截斷(使用省略號 *..*)。注意事項 1:截斷僅在 N >= 2 時才能正確運作。注意事項 2:N 和 M(見下文)值周圍的空格是可選的。注意事項 3:表情符號和其他寬字元將佔用兩個顯示欄,這可能會超過欄邊界。注意事項 4:分解字元的組合標記可能會在填補邊界處錯置。

      %<|( <M> )

      讓下一個佔位符號至少佔用到第 M 個顯示欄,必要時在右側填補空格。針對從終端機視窗右邊緣測量的欄位置使用負 M 值。

      %>( <N> ), %>|( <M> )

      分別類似於 %<( <N> )%<|( <M> ),但在左側填補空格

      %>>( <N> ), %>>|( <M> )

      分別類似於 %>( <N> )%>|( <M> ),但如果下一個佔位符號佔用的空格多於給定的空格,且左側有空格,則使用這些空格

      %><( <N> ), %><|( <M> )

      分別類似於 %<( <N> )%<|( <M> ),但在兩側填補空格(即文字置中)

    • 擴展為從提交中擷取的資訊的佔位符號

      %H

      提交雜湊值

      %h

      縮寫的提交雜湊值

      %T

      樹狀雜湊值

      %t

      縮寫的樹狀雜湊值

      %P

      父提交雜湊值

      %p

      縮寫的父提交雜湊值

      %an

      作者名稱

      %aN

      作者名稱(遵守 .mailmap,請參閱 git-shortlog[1]git-blame[1]

      %ae

      作者電子郵件

      %aE

      作者電子郵件(遵守 .mailmap,請參閱 git-shortlog[1]git-blame[1]

      %al

      作者電子郵件的本機部分(@ 符號之前的部分)

      %aL

      作者本機部分(請參閱 %al),遵守 .mailmap,請參閱 git-shortlog[1]git-blame[1]

      %ad

      作者日期(格式遵守 --date= 選項)

      %aD

      作者日期,RFC2822 樣式

      %ar

      作者日期,相對

      %at

      作者日期,UNIX 時間戳記

      %ai

      作者日期,類似 ISO 8601 的格式

      %aI

      作者日期,嚴格的 ISO 8601 格式

      %as

      作者日期,簡短格式 (YYYY-MM-DD)

      %ah

      作者日期,人類樣式(如 git-rev-list[1]--date=human 選項)

      %cn

      提交者名稱

      %cN

      提交者名稱(遵守 .mailmap,請參閱 git-shortlog[1]git-blame[1]

      %ce

      提交者電子郵件

      %cE

      提交者電子郵件 (遵循 .mailmap,請參閱 git-shortlog[1]git-blame[1])

      %cl

      提交者電子郵件本地部分(@ 符號之前的部分)

      %cL

      提交者本地部分(請參閱 %cl)遵循 .mailmap,請參閱 git-shortlog[1]git-blame[1])

      %cd

      提交者日期 (格式遵循 --date= 選項)

      %cD

      提交者日期,RFC2822 樣式

      %cr

      提交者日期,相對

      %ct

      提交者日期,UNIX 時間戳記

      %ci

      提交者日期,類似 ISO 8601 的格式

      %cI

      提交者日期,嚴格的 ISO 8601 格式

      %cs

      提交者日期,簡短格式 (YYYY-MM-DD)

      %ch

      提交者日期,人類風格 (如同 git-rev-list[1]--date=human 選項)

      %d

      參考名稱,如同 git-log[1] 的 --decorate 選項

      %D

      不含「 (」、「) 」包裝的參考名稱。

      %(decorate[:<options>])

      具有自訂裝飾的參考名稱。decorate 字串後面可以接一個冒號和零個或多個以逗號分隔的選項。選項值可以包含文字格式代碼。這些必須用於逗號 (%x2C) 和右括號 (%x29),因為它們在選項語法中扮演的角色。

      • prefix=<value>:顯示在參考名稱列表之前。預設為「 (」。

      • suffix=<value>:顯示在參考名稱列表之後。預設為「)」。

      • separator=<value>:顯示在參考名稱之間。預設為「, 」。

      • pointer=<value>:顯示在 HEAD 和它指向的分支之間 (如果有的話)。預設為「 -> 」。

      • tag=<value>:顯示在標籤名稱之前。預設為「tag: 」。

    例如,要產生不含包裝或標籤註解,且以空格作為分隔符的裝飾:

    + %(decorate:prefix=,suffix=,tag=,separator= )

    %(describe[:<options>])

    人類可讀的名稱,如同 git-describe[1];對於無法描述的提交,則為空字串。describe 字串後面可以接一個冒號和零個或多個以逗號分隔的選項。當同時新增或移除標籤時,描述可能會不一致。

    • tags[=<bool-value>]:除了只考慮已註解的標籤外,也考慮輕量標籤。

    • abbrev=<number>:不使用縮寫物件名稱的預設十六進位位數(根據儲存庫中物件的數量而有所不同,預設為 7),而是使用 <number> 位數,或形成唯一物件名稱所需的多個位數。

    • match=<pattern>:只考慮符合給定 glob(7) 模式的標籤,不包含「refs/tags/」前綴。

    • exclude=<pattern>:不考慮符合給定 glob(7) 模式的標籤,不包含「refs/tags/」前綴。

    %S

    在命令列上給定的參考名稱,藉此到達提交 (如同 git log --source),僅適用於 git log

    %e

    編碼

    %s

    主旨

    %f

    經過清理的主旨行,適用於檔案名稱

    %b

    內文

    %B

    原始內文 (未包裝的主旨和內文)

    %N

    提交註解

    %GG

    來自 GPG 的簽名提交的原始驗證訊息

    %G?

    針對良好 (有效) 簽名顯示「G」,針對不良簽名顯示「B」,針對具有未知有效性的良好簽名顯示「U」,針對已過期的良好簽名顯示「X」,針對由過期金鑰製作的良好簽名顯示「Y」,針對由已撤銷金鑰製作的良好簽名顯示「R」,如果無法檢查簽名 (例如遺失金鑰) 則顯示「E」,以及針對沒有簽名顯示「N」

    %GS

    顯示簽署提交者的名稱

    %GK

    顯示用於簽署提交的金鑰

    %GF

    顯示用於簽署提交的金鑰的指紋

    %GP

    顯示用於簽署提交的子金鑰的對應主要金鑰的指紋

    %GT

    顯示用於簽署提交的金鑰的信任等級

    %gD

    reflog 選取器,例如,refs/stash@{1}refs/stash@{2 minutes ago};格式遵循針對 -g 選項所述的規則。@ 之前的部分是在命令列上給定的參考名稱 (因此 git log -g refs/heads/master 會產生 refs/heads/master@{0})。

    %gd

    簡短的 reflog 選取器;與 %gD 相同,但 refname 部分已縮短以提高人類可讀性 (因此 refs/heads/master 變為只有 master)。

    %gn

    reflog 身分名稱

    %gN

    reflog 身分名稱 (遵循 .mailmap,請參閱 git-shortlog[1]git-blame[1])

    %ge

    reflog 身分電子郵件

    %gE

    reflog 身分電子郵件 (遵循 .mailmap,請參閱 git-shortlog[1]git-blame[1])

    %gs

    reflog 主旨

    %(trailers[:<options>])

    顯示內文的 trailer,如 git-interpret-trailers[1] 所解譯。trailers 字串後面可以接一個冒號和零個或多個以逗號分隔的選項。如果多次提供任何選項,則最後一次出現的選項將會生效。

    • key=<key>:只顯示具有指定的 <key> 的 trailer。比對時會忽略大小寫,且尾端冒號是選用的。如果多次提供選項,則會顯示符合任何金鑰的 trailer 行。此選項會自動啟用 only 選項,以便隱藏 trailer 區塊中的非 trailer 行。如果不需要這樣,可以使用 only=false 停用。例如,%(trailers:key=Reviewed-by) 會顯示具有金鑰 Reviewed-by 的 trailer 行。

    • only[=<bool>]:選取是否應包含來自 trailer 區塊的非 trailer 行。

    • separator=<sep>:指定在 trailer 行之間插入的分隔符。預設為換行字元。字串 <sep> 可以包含上述的文字格式代碼。若要使用逗號作為分隔符,必須使用 %x2C,因為否則會將其剖析為下一個選項。例如,%(trailers:key=Ticket,separator=%x2C ) 會顯示所有金鑰為「Ticket」的 trailer 行,並以逗號和空格分隔。

    • unfold[=<bool>]:使其行為如同已提供 interpret-trailer 的 --unfold 選項一樣。例如,%(trailers:only,unfold=true) 會展開並顯示所有 trailer 行。

    • keyonly[=<bool>]:只顯示 trailer 的金鑰部分。

    • valueonly[=<bool>]:只顯示 trailer 的值部分。

    • key_value_separator=<sep>:指定在每個 trailer 的金鑰和值之間插入的分隔符。預設為「: 」。否則,它與上述的 separator=<sep> 具有相同的語意。

注意
某些佔位符可能會取決於提供給修訂版遍歷引擎的其他選項。例如,%g* reflog 選項將插入空字串,除非我們正在遍歷 reflog 項目 (例如,透過 git log -g)。如果命令列上尚未提供 --decorate%d%D 佔位符將會使用「簡短」裝飾格式。

布林選項接受選用值 [=<bool-value>]。接受的值為 truefalseonoff 等等。請參閱 git-config[1] 中「範例」中的「布林值」小節。如果給定不含值的布林選項,則會啟用該選項。

如果您在佔位符的 % 之後新增 + (加號),則當且僅當佔位符展開為非空字串時,才會在展開之前立即插入換行符號。

如果您在佔位符的 % 之後新增 - (減號),則當且僅當佔位符展開為空字串時,才會刪除緊接在展開之前的所有連續換行符號。

如果您在佔位符的 % 之後新增 ` ` (空格),則當且僅當佔位符展開為非空字串時,才會在展開之前立即插入空格。

  • tformat

    tformat: 格式的運作方式與 format: 完全相同,不同之處在於,它提供「終止符」語意而不是「分隔符」語意。換句話說,每個提交都會附加訊息終止字元 (通常是換行符號),而不是在項目之間放置分隔符。這表示單行格式的最後一個項目將會正確地以換行符號終止,就像「oneline」格式一樣。例如

    $ git log -2 --pretty=format:%h 4da45bef \
      | perl -pe '$_ .= " -- NO NEWLINE\n" unless /\n/'
    4da45be
    7134973 -- NO NEWLINE
    
    $ git log -2 --pretty=tformat:%h 4da45bef \
      | perl -pe '$_ .= " -- NO NEWLINE\n" unless /\n/'
    4da45be
    7134973

    此外,任何具有 % 的無法辨識的字串都會被解譯為前面有 tformat:。例如,這兩者是等效的

    $ git log -2 --pretty=tformat:%h 4da45bef
    $ git log -2 --pretty=%h 4da45bef

原始輸出格式

「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> [<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 選項時,為 Tab 或 NUL。

  12. 「src」的路徑

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

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

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

可能出現的狀態字母有:

  • 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 位元組終止。

合併的 diff 格式

"git-diff-tree"、"git-diff-files" 和 "git-diff --raw" 可以使用 -c--cc 選項來產生合併提交的 diff 輸出。其輸出與上述格式的不同之處在於:

  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

請注意,合併 diff 只會列出所有父提交中已修改的檔案。

使用 -p 產生 patch 文字

執行 git-diff[1]git-log[1]git-show[1]git-diff-index[1]git-diff-tree[1]git-diff-files[1] 並搭配 -p 選項時,會產生 patch 文字。您可以使用 GIT_EXTERNAL_DIFFGIT_DIFF_OPTS 環境變數(請參閱 git[1])以及 diff 屬性(請參閱 gitattributes[5])來自訂 patch 文字的產生方式。

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

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

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

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

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

  3. 具有「不尋常」字元的路徑名稱會依照設定變數 core.quotePath 所述的方式加上引號(請參閱 git-config[1])。

  4. 輸出中的所有 file1 檔案都指向提交之前的檔案,而所有 file2 檔案都指向提交之後的檔案。依序將每個變更套用至每個檔案是錯誤的。例如,此 patch 將會交換 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 標頭」。

合併 diff 格式

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

「合併 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> 的 diff 搭配使用而設計,而不會用於合併 diff 格式。

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

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

    與傳統的統一 diff 格式的雙行標頭類似,會使用 /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。建立合併 diff 格式是為了檢閱合併提交的變更,而不是要套用。變更與擴展的 index 標頭中的變更類似:

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

    在合併 diff 格式的 chunk 標頭中,會有(父提交數 + 1)個 @ 字元。

與傳統的統一 diff 格式不同(其顯示兩個檔案 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 是階段 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. 一個 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

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

scroll-to-top