簡體中文 ▾ 主題 ▾ 最新版本 ▾ git-diff-tree 上次更新於 2.52.0

名稱

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 的命令很有用,可以抑制其輸出,或者取消命令列中別名(alias)中像 --patch--stat 等選項的影響。

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

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

--output=<file>

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

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

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

--raw

以原始格式生成 diff。這是預設設定。

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

生成 diffstat。預設情況下,檔名部分會盡可能多地佔用空間,其餘部分用於圖形部分。最大寬度預設為終端寬度,如果未連線到終端則預設為 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 數字。這會忽略純程式碼移動 within a file 的量。換句話說,重新排列檔案中的行不如其他更改計數多。這是未提供任何引數時的預設行為。

lines

透過進行常規的基於行的 diff 分析,並對刪除/新增的行數進行求和來計算 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。預設值為 diff.submoduleshort 格式(如果配置選項未設定)。

--color[=<when>]

顯示彩色 diff。--color(即沒有 =<when>)等同於 --color=always<when> 可以是 alwaysneverauto 之一。

--no-color

關閉彩色 diff。它與 --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=<mode>,...

這配置了在執行 --color-moved 的移動檢測時如何忽略空白。這些模式可以作為逗號分隔的列表給出:

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

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

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

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

--rename-empty
--no-rename-empty

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

--check

當引入衝突標記或空格錯誤時發出警告。空格錯誤被認為是受 core.whitespace 配置控制的。預設情況下,行尾的空格(包括僅由空格組成的行)以及行開頭縮排中緊跟在製表符後面的空格字元被視為空格錯誤。如果發現問題,退出狀態將非零。與 --exit-code 不相容。

--ws-error-highlight=<kind>

在 diff 的 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>]]

將完整的重寫更改分解為刪除和建立對。這有兩個目的:

它影響了將檔案完全重寫(rewrite)的更改的處理方式,而不是將其視為一系列刪除和插入,其中只有少量文字碰巧與上下文匹配。它將其視為一次性的全部刪除後一次性的全部插入,並且數字<m>控制 -B 選項的這一方面(預設為 60%)。-B/70% 指定,如果結果中保留的原始部分少於 30%,Git 將認為這是一次完全重寫(即,否則生成的 patch 將是一系列刪除和插入,並帶有上下文行)。

當與 -M 一起使用時,完全重寫的檔案也被視為重新命名(rename)的源頭(通常 -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 選項僅在複製的原始檔案在同一更改集(changeset)中被修改時才查詢複製。此標誌使命令檢查未修改的檔案作為複製源的候選。對於大型專案,這是一項非常耗時的操作,因此請謹慎使用。給出多個 -C 選項具有相同的效果。

-D
--irreversible-delete

省略刪除的原始檔案(preimage),即只打印標頭,而不列印原始檔案與 /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> 之前的(即 *skip to*)檔案,或將它們移至輸出末尾(即 *rotate to*)。這些選項主要用於 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] 中“定義自定義塊標頭”)。

--exit-code

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

--quiet

停用程式的所有輸出。隱含 --exit-code。停用外部 diff 輔助程式(其退出程式碼不受信任)的執行,即其相應的配置選項 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)]

在生成 diff 時忽略對子模組的更改。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 恢復。這兩個選項都是實驗性的,未來可能會被刪除。

--max-depth=<depth>

對於命令列上給出的每個路徑說明符,最多向下遞迴 <depth> 層目錄。值為 -1 表示無限制。不能與路徑說明符中的萬用字元組合使用。給定一個包含 foo/bar/baz 的樹,以下列表顯示了每個選項集生成的匹配項

  • --max-depth=0 -- foo: foo

  • --max-depth=1 -- foo: foo/bar

  • --max-depth=1 -- foo/bar: foo/bar/baz

  • --max-depth=1 -- foo foo/bar: foo/bar/baz

  • --max-depth=2 -- foo: foo/bar/baz

如果沒有給出路徑說明符,則深度測量方式就好像所有頂級條目都被指定一樣。請注意,這與從根開始測量不同,因為 --max-depth=0 仍將返回 foo。這允許您在要求頂級條目子集的同時仍然限制深度。

請注意,此選項僅支援樹物件之間的差異,不支援與索引或工作樹的差異。

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

<tree-ish>

tree 物件的 ID。

<path>…​

如果提供了此選項,則結果將限制為匹配提供的任何路徑名模式的檔案子集。

-r

遞迴進入子樹。

-t

顯示 tree 條目本身以及子樹。隱含 -r。

--root

當指定 --root 時,初始提交將顯示為一個大的建立事件。這等同於與 NULL tree 進行 diff。

--merge-base

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

--stdin

當指定 --stdin 時,該命令不會從命令列獲取 <tree-ish> 引數。相反,它從標準輸入讀取包含以下內容的行:兩個 <tree>,一個 <commit>,或一系列 <commit>。(使用單個空格作為分隔符。)

當給出兩個 tree 時,它比較第一個 tree 和第二個 tree。當給出單個提交時,它比較該提交與其父提交。其餘的提交(如果給出)被視為第一個提交的父提交。

比較兩個 tree 時,在差異之前會列印兩個 tree 的 ID(用空格分隔,以換行符結尾)。比較提交時,會列印第一個(或唯一的)提交的 ID,後跟一個換行符。

以下標誌會進一步影響比較提交(而不是 tree)時的行為。

-m

預設情況下,git diff-tree --stdin 不顯示合併提交的差異。使用此標誌,它會同時顯示該提交與其所有父提交之間的差異,而不是一次顯示一個父提交與結果之間的成對 diff(這是 -m 選項所做的)。此外,它只列出從所有父提交中修改過的檔案。

-s

預設情況下,git diff-tree --stdin 顯示差異,要麼以機器可讀格式(沒有 -p),要麼以 patch 格式(有 -p)。此輸出可以被抑制。它僅在使用 -v 標誌時有用。

-v

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

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

以給定的格式漂亮地列印提交日誌的內容,其中 <format> 可以是 `oneline`、`short`、`medium`、`full`、`fuller`、`reference`、`email`、`raw`、`format:<string>` 和 `tformat:<string>`。當 <format> 不是上述任何一種,並且包含 %<placeholder> 時,它就像給定了 `--pretty=tformat:<format>` 一樣。

有關每種格式的更多詳細資訊,請參閱“PRETTY FORMATS”部分。當省略 =<format> 部分時,預設為 `medium`。

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

而不是顯示完整的 40 位元組十六進位制提交物件名,而是顯示一個唯一標識該物件的名稱字首。可以使用 `--abbrev=<n>` 選項(它也會修改 diff 輸出,如果顯示的話)來指定字首的最小長度。

這應該能讓使用 80 列終端的人更容易閱讀 `--pretty=oneline`。

--no-abbrev-commit

顯示完整的 40 位元組十六進位制提交物件名。這會否定 `--abbrev-commit`(無論是顯式的還是其他選項如 `--oneline` 暗示的)。它還會覆蓋 `log.abbrevCommit` 變數。

--oneline

這是 `--pretty=oneline --abbrev-commit` 的簡寫。

--encoding=<encoding>

提交物件在它們的 encoding 頭中記錄了日誌訊息使用的字元編碼;此選項可用於告訴命令將提交日誌訊息重新編碼為使用者首選的編碼。對於非底層命令,預設為 UTF-8。請注意,如果一個物件聲稱以 X 編碼,而我們正在以 X 輸出,我們將原樣輸出該物件;這意味著原始提交中的無效序列可能會被複制到輸出中。同樣,如果 iconv(3) 無法轉換該提交,我們將悄悄地原樣輸出原始物件。

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

在顯示日誌訊息之前,對其進行製表符擴充套件(將每個製表符替換為足夠的空格,以填充到下一個為 <n> 的倍數的顯示列)。`--expand-tabs` 是 `--expand-tabs=8` 的簡寫,而 `--no-expand-tabs` 是 `--expand-tabs=0` 的簡寫,後者停用製表符擴充套件。

預設情況下,製表符會在美化格式中進行擴充套件,這些格式會縮排日誌訊息 4 個空格(即 `medium`,這是預設值,`full` 和 `fuller`)。

--notes[=<ref>]

在顯示提交日誌訊息時,顯示註釋(請參閱 git-notes[1])註解的提交。這是 `git log`、`git show` 和 `git whatchanged` 命令的預設行為,當命令列上沒有給出 `--pretty`、`--format` 或 `--oneline` 選項時。

預設情況下,顯示的註釋來自 `core.notesRef` 和 `notes.displayRef` 變數(或相應的環境變數覆蓋)中列出的 notes refs。有關更多詳細資訊,請參閱 git-config[1]

使用可選的 <ref> 引數,使用該 ref 來查詢要顯示的註釋。當 ref 以 `refs/notes/` 開頭時,它可以指定完整的 refname;當它以 `notes/` 開頭時,`refs/` 和其他情況會加上 `refs/notes/` 字首來形成 ref 的完整名稱。

可以組合多個 `--notes` 選項來控制顯示哪些註釋。示例:“`--notes=foo`”將僅顯示來自 `refs/notes/foo` 的註釋;“`--notes=foo --notes`”將顯示來自“refs/notes/foo”和預設 notes ref(s) 的註釋。

--no-notes

不顯示註釋。這會否定上面的 `--notes` 選項,透過重置從中顯示註釋的 notes ref 列表。選項是按命令列給出的順序解析的,因此例如“`--notes --notes=foo --no-notes --notes=bar`”將只顯示來自 `refs/notes/bar` 的註釋。

--show-notes-by-default

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

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

這些選項已棄用。請使用上面的 `--notes`/`--no-notes` 選項。

--show-signature

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

--no-commit-id

git diff-tree 在適用時會輸出包含提交 ID 的行。此標誌會抑制提交 ID 的輸出。

-c

此標誌會改變合併提交的顯示方式(這意味著它僅在命令提供一個 <tree-ish>--stdin 時才有用)。它會同時顯示每個父提交與合併結果之間的差異,而不是一次顯示一個父提交與結果之間的成對 diff(這是 -m 選項所做的)。此外,它僅列出從所有父提交中修改過的檔案。

--cc

此標誌會以類似於 -c 選項的方式改變合併提交 patch 的顯示方式。它隱含了 -c-p 選項,並透過省略不相關的 hunks(其內容在父提交中只有兩種變體,並且合併結果未修改地選擇了其中一種)來進一步壓縮 patch 輸出。當所有 hunks 都不相關時,提交本身和提交日誌訊息將不會顯示,就像任何其他“空 diff”情況一樣。

--combined-all-paths

此標誌會導致組合 diff(用於合併提交)列出所有父提交的檔名。因此,它僅在指定 -c 或 --cc 時才有效,並且可能僅在檢測到檔名更改時(即,當請求了重新命名或複製檢測時)才有用。

--always

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

美觀格式 (PRETTY FORMATS)

如果該提交是合併提交,並且美化格式不是 `oneline`、`email` 或 `raw`,則在 `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 選項,否則日期格式為 --date=short。與任何帶有格式佔位符的 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* 資訊顯示真實的父提交,而不考慮 graft 或歷史簡化。請注意,此格式會影響提交的顯示方式,但不會影響 diff 的顯示方式,例如使用 git log --raw。要在原始 diff 格式中獲取完整的物件名稱,請使用 --no-abbrev。

  • format:<format-string>

    format:<format-string> 格式允許您指定要顯示的資訊。它的工作方式有點像 printf 格式,但有一個明顯的區別是,您需要使用 %n 而不是 \n 來獲得一個換行符。

    例如,format:"The author of %h was %an, %ar%nThe title was >>%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(<spec>)

      color specification, as described under Values in the "CONFIGURATION FILE" section of git-config[1]. By default, colors are shown only when enabled for log output (by color.diff, color.ui, or --color, and respecting the auto settings of the former if we are going to a terminal). %C(auto,<spec>) is accepted as a historical synonym for the default (e.g., %C(auto,red)). Specifying %C(always,<spec>) will show the colors even when color is not otherwise enabled (though consider just using --color=always to enable color for the whole output, including this format and anything else git might color). auto alone (i.e. %C(auto)) will turn on auto coloring on the next placeholders until the color is switched again.

      %m

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

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

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

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

      使下一個佔位符至少佔用 N 列寬度,如果需要,則在右側填充空格。如果輸出超過 N 列,則可以選擇在左側(ltrunc)截斷(使用省略號 ..),在中間(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[:<option>,...])

      帶有自定義裝飾的 ref 名稱。decorate 字串後面可以跟一個冒號和零個或多個逗號分隔的選項。選項值可以包含字面格式化程式碼。由於它們在選項語法中的作用,因此必須為逗號(%x2C)和右括號(%x29)使用這些程式碼。

      • prefix=<value>:顯示在 ref 名稱列表之前。預設為 " ("。

      • suffix=<value>:顯示在 ref 名稱列表之後。預設為 ")"。

      • separator=<value>:顯示在 ref 名稱之間。預設為 ", "。

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

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

    例如,生成不帶包裹或標籤註釋的裝飾,並使用空格作為分隔符

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

    %(describe[:<option>,...])

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

    • tags[=<bool-value>]:而不是隻考慮帶註釋的標籤,也考慮輕量級標籤。

    • abbrev=<number>:而不是使用預設的十六進位制數字數量(這將根據儲存庫中的物件數量而變化,預設為 7),使用 <number> 位數字,或者根據需要使用的數字以形成唯一的物件名稱。

    • match=<pattern>:只考慮匹配給定 glob(7) <pattern> 的標籤,不包括 refs/tags/ 字首。

    • exclude=<pattern>:不考慮匹配給定 glob(7) <pattern> 的標籤,不包括 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 選項所述的規則。@ 符號之前的部分是命令列中給出的 refname(因此 git log -g refs/heads/master 會產生 refs/heads/master@{0})。

    %gd

    縮短的 reflog 選擇器;與 %gD 相同,但 refname 部分已縮短以便於人類閱讀(因此 refs/heads/master 會變成簡單的 master)。

    %gn

    引用日誌身份名稱

    %gN

    引用日誌身份名稱(遵循 .mailmap,參見 git-shortlog[1]git-blame[1]

    %ge

    引用日誌身份電子郵件

    %gE

    引用日誌身份電子郵件(遵循 .mailmap,參見 git-shortlog[1]git-blame[1]

    %gs

    引用日誌主題

    %(trailers[:<option>,...])

    顯示由 git-interpret-trailers[1] 解釋的提交正文的尾部。trailers 字串後面可以跟一個冒號和零個或多個逗號分隔的選項。如果任何選項出現多次,則最後一個生效。

    • key=<key>:只顯示具有指定 <key> 的尾部。匹配不區分大小寫,並且尾部冒號是可選的。如果多次給出此選項,則顯示匹配任何鍵的尾部行。此選項會自動啟用 `only` 選項,因此尾部塊中的非尾部行將被隱藏。如果不需要,可以使用 `only=false` 停用它。例如,%(trailers:key=Reviewed-by) 顯示鍵為 `Reviewed-by` 的尾部行。

    • only[=<bool>]:選擇是否包含尾部塊中的非尾部行。

    • separator=<sep>:指定在尾部行之間插入的分隔符。預設為換行符。字串 <sep> 可以包含上面描述的字面格式化程式碼。要使用逗號作為分隔符,必須使用 %x2C,因為它否則會被解析為下一個選項。例如,%(trailers:key=Ticket,separator=%x2C ) 顯示所有鍵為 "Ticket" 的尾部行,以逗號和空格分隔。

    • unfold[=<bool>]:使其表現得好像給定了 interpret-trailer 的 --unfold 選項。例如,%(trailers:only,unfold=true) 會展開並顯示所有尾部行。

    • keyonly[=<bool>]:只顯示尾部的鍵部分。

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

    • key_value_separator=<sep>:指定在每個尾部的鍵和值之間插入的分隔符。預設為 ": "。否則,它與上面的 separator=<sep> 具有相同的語義。

注意
一些佔位符可能依賴於提供給修訂遍歷引擎的其他選項。例如,%g* reflog 選項將插入一個空字串,除非我們正在遍歷 reflog 條目(例如,透過 git log -g)。如果命令列為未提供 --decorate,則 %d 和 %D 佔位符將使用 "short" 裝飾格式。

布林選項接受一個可選值 [=<bool-value>]。--type=bool git-config[1] 中的值,如 yes 和 off,都被接受。給出布林選項而不帶 =<value> 等同於給出 =true。

如果在佔位符的 % 後面加上 +(加號),當且僅當佔位符擴充套件為非空字串時,會在其擴充套件之前立即插入一個換行符。

如果在佔位符的 % 後面加上 -(減號),當且僅當佔位符擴充套件為空字串時,會刪除擴充套件之前所有連續的換行符。

如果在佔位符的 % 後面加上空格,當且僅當佔位符擴充套件為非空字串時,會在其擴充套件之前立即插入一個空格。

  • 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-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 選項來為合併提交生成 diff 輸出。輸出與上述格式不同之處在於

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

任何生成 diff 的命令都可以接受 -c--cc 選項,以便在顯示合併時生成 *combined 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 設計的,並且不用於 combined diff 格式。

  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。Combined diff 格式是為審查合併提交更改而建立的,不用於應用。更改類似於擴充套件的 index 標頭中的更改。

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

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

與傳統的 *unified* diff 格式(顯示兩個檔案 A 和 B,並帶有一個單列,該列有 -(減號 — 出現在 A 中但從 B 中移除)、+(加號 — 在 A 中缺失但新增到 B 中),或 " "(空格 — 未更改)字首)不同,此格式比較兩個或多個檔案 file1、file2、…… 和一個檔案 X,並顯示 X 與 fileN 的不同之處。檔案 fileN 的數量加上每行輸出中的一個列,用於指示 X 的行與該檔案有何不同。

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

在上面的示例輸出中,函式簽名與兩個檔案都不同(因此從 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

Git[1] 套件的一部分