設定和配置
獲取和建立專案
基本快照
分支與合併
共享和更新專案
檢查和比較
打補丁
除錯
電子郵件
外部系統
伺服器管理
指南
管理
底層命令
-
2.52.0
2025-11-17
- 2.51.1 → 2.51.2 無更改
-
2.51.0
2025-08-18
- 2.48.1 → 2.50.1 無更改
-
2.48.0
2025-01-10
- 2.46.1 → 2.47.3 無更改
-
2.46.0
2024-07-29
- 2.45.4 無更改
-
2.45.3
2024-11-26
- 2.45.1 → 2.45.2 無更改
-
2.45.0
2024-04-29
- 2.44.1 → 2.44.4 無更改
-
2.44.0
2024-02-23
- 2.43.1 → 2.43.7 無更改
-
2.43.0
2023-11-20
- 2.42.2 → 2.42.4 無更改
-
2.42.1
2023-11-02
-
2.42.0
2023-08-21
- 2.41.1 → 2.41.3 無更改
-
2.41.0
2023-06-01
- 2.40.1 → 2.40.4 無更改
-
2.40.0
2023-03-12
- 2.39.1 → 2.39.5 無變化
-
2.39.0
2022-12-12
- 2.37.3 → 2.38.5 無更改
-
2.37.2
2022-08-11
- 2.36.1 → 2.37.1 無變化
-
2.36.0
2022-04-18
- 2.35.1 → 2.35.8 無更改
-
2.35.0
2022-01-24
- 2.34.1 → 2.34.8 無更改
-
2.34.0
2021-11-15
- 2.33.1 → 2.33.8 無更改
-
2.33.0
2021-08-16
- 2.32.1 → 2.32.7 無變更
-
2.32.0
2021-06-06
- 2.31.1 → 2.31.8 無更改
-
2.31.0
2021-03-15
- 2.30.1 → 2.30.9 無更改
-
2.30.0
2020-12-27
- 2.29.1 → 2.29.3 無更改
-
2.29.0
2020-10-19
- 2.28.1 無更改
-
2.28.0
2020-07-27
- 2.25.2 → 2.27.1 無變化
-
2.25.1
2020-02-17
-
2.25.0
2020-01-13
- 2.24.1 → 2.24.4 無更改
-
2.24.0
2019-11-04
- 2.22.1 → 2.23.4 無更改
-
2.22.0
2019-06-07
- 2.21.1 → 2.21.4 無更改
-
2.21.0
2019-02-24
- 2.20.1 → 2.20.5 無更改
-
2.20.0
2018-12-09
- 2.19.1 → 2.19.6 無更改
-
2.19.0
2018-09-10
- 2.18.1 → 2.18.5 無更改
-
2.18.0
2018-06-21
- 2.17.1 → 2.17.6 無更改
-
2.17.0
2018-04-02
-
2.16.6
2019-12-06
-
2.15.4
2019-12-06
-
2.14.6
2019-12-06
-
2.13.7
2018-05-22
-
2.12.5
2017-09-22
-
2.11.4
2017-09-22
- 2.10.5 無更改
-
2.9.5
2017-07-30
-
2.8.6
2017-07-30
- 2.7.6 無更改
-
2.6.7
2017-05-05
-
2.5.6
2017-05-05
-
2.4.12
2017-05-05
-
2.3.10
2015-09-28
- 2.1.4 → 2.2.3 無更改
-
2.0.5
2014-12-17
選項
-p-u--patch-
生成補丁(參見 使用 -p 生成補丁文字)。
-s--no-patch-
禁止 diff 引擎的所有輸出。這對於像
gitshow這樣預設顯示 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)-
選擇一種差異演算法。變體如下:
例如,如果您將
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.statNameWidth或diff.statGraphWidth不會影響gitformat-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,但以十進位制顯示新增和刪除的行數,並省略路徑名縮寫,以便更易於機器處理。對於二進位制檔案,輸出兩個-而不是說00。 --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.submodule,如果配置選項未設定,則預設為short格式。 --color[=<when>]-
顯示彩色 diff。
--color(即沒有=<when>)等同於--color=always。<when> 可以是always、never或auto之一。 --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-color-moved-ws-
執行移動檢測時不忽略空白。這可以用於覆蓋配置設定。它與
--color-moved-ws=no相同。 --word-diff[=<mode>]-
預設情況下,單詞由空白分隔;參見下面的
--word-diff-regex。<mode> 預設為plain,並且必須是以下之一:請注意,儘管第一個模式的名稱如此,如果啟用,所有模式都使用顏色高亮顯示更改的部分。
--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 的
context、old或new行中突出顯示空格錯誤。多個值用逗號分隔,none重置先前的值,default將列表重置為new,all是old,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之間的差異。生成的補丁不適用於patch或gitapply;這僅適用於那些只想專注於檢視更改後文本的人。此外,輸出顯然缺乏足夠的資訊來手動甚至手動反向應用此類補丁,因此得名於該選項。與
-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*)。這些選項主要用於
gitdifftool命令,可能在其他情況下不太有用。 -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-
顯示整個函式作為每個更改的上下文行。函式名稱的確定方式與
gitdiff生成補丁塊標頭的方式相同(參見 gitattributes[5] 中“定義自定義塊標頭”)。 --exit-code-
使程式以類似於
diff(1) 的程式碼退出。也就是說,如果存在差異,則以 1 退出,0 表示無差異。 --quiet-
停用程式的所有輸出。隱含
--exit-code。停用外部 diff 輔助程式(其退出程式碼不受信任)的執行,即其相應的配置選項diff.trustExitCode或diff.<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.noprefix、diff.srcPrefix、diff.dstPrefix和diff.mnemonicPrefix(參見 git-config[1])。 --line-prefix=<prefix>-
在每行輸出前面新增一個額外的 <prefix>。
--ita-invisible-in-index-
預設情況下,由
gitadd-N新增的條目在gitdiff中顯示為現有空檔案,在gitdiff--cached中顯示為新檔案。此選項使條目在gitdiff中顯示為新檔案,在gitdiff--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--foofoo/bar:foo/bar/baz -
--max-depth=2--foo:foo/bar/baz
如果沒有給出路徑說明符,則深度測量方式就好像所有頂級條目都被指定一樣。請注意,這與從根開始測量不同,因為
--max-depth=0仍將返回foo。這允許您在要求頂級條目子集的同時仍然限制深度。請注意,此選項僅支援樹物件之間的差異,不支援與索引或工作樹的差異。
-
有關這些通用選項的更詳細說明,另請參見 gitdiffcore[7]。
原始輸出格式
git-diff-index、git-diff-tree、git-diff-files 和 git diff --raw 的原始輸出格式非常相似。
這些命令都比較兩組事物;比較的內容有所不同:
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
即從左到右:
-
一個冒號。
-
"src" 的模式;如果為建立或未合併,則為 000000。
-
一個空格。
-
"dst" 的模式;如果為刪除或未合併,則為 000000。
-
一個空格。
-
"src" 的 SHA1;如果為建立或未合併,則為 0{40}。
-
一個空格。
-
"dst" 的 SHA1;如果為刪除、未合併或“工作區與索引不同步”,則為 0{40}。
-
一個空格。
-
狀態,後跟可選的“分數”數字。
-
當使用
-z選項時,一個製表符或一個 NUL。 -
"src" 的路徑。
-
當使用
-z選項時,一個製表符或一個 NUL;僅在 C 或 R 狀態下存在。 -
"dst" 的路徑;僅在 C 或 R 狀態下存在。
-
當使用
-z選項時,一個 LF 或一個 NUL,用於終止記錄。
可能的狀態字母是:
-
A:新增檔案 -
C:將檔案複製為新檔案 -
D:刪除檔案 -
M:檔案內容或模式的修改 -
R:檔案重新命名 -
T:檔案型別(常規檔案、符號連結或子模組)的更改 -
U:檔案未合併(您必須在提交之前完成合並) -
X:“未知”更改型別(很可能是一個 bug,請報告)
狀態字母 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 輸出。輸出與上述格式不同之處在於
-
每個父級都有一個冒號
-
有更多的“src”模式和“src”SHA1
-
狀態是每個父級的狀態字元的連線
-
沒有可選的“分數”數字
-
以製表符分隔的檔案路徑名
對於 -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_DIFF 和 GIT_DIFF_OPTS 環境變數(參見 git[1])以及 diff 屬性(參見 gitattributes[5])來自定義補丁文字的建立。
-p 選項生成的輸出與傳統的 diff 格式略有不同:
-
它前面是“git diff”頭,看起來像這樣:
diff --git a/file1 b/file2
a/和b/的檔名相同,除非涉及重新命名或複製。特別是,即使是建立或刪除,/dev/null也*不*用作a/或b/檔名的替代。當涉及重新命名/複製時,
file1和file2分別顯示重新命名/複製的原始檔名稱和重新命名/複製生成的檔名稱。 -
後面跟著一個或多個擴充套件頭行:
oldmode<mode>newmode<mode>deletedfilemode<mode>newfilemode<mode>copyfrom<path>copyto<path>renamefrom<path>renameto<path>similarityindex<number>dissimilarityindex<number>index<hash>..<hash> <mode>檔案模式 <mode> 以 6 位八進位制數字列印,包括檔案型別和檔案許可權位。
擴充套件頭中的路徑名不包含
a/和b/字首。相似度索引是未更改行的百分比,不相似度索引是更改行的百分比。它是一個向下取整的整數,後跟一個百分號。因此,100% 的相似度索引值保留給兩個相同的檔案,而 100% 的不相似度表示沒有來自舊檔案的行進入新檔案。
索引行包括更改前後的 blob 物件名稱。如果檔案模式沒有更改,則包含 <mode>;否則,單獨的行指示舊模式和新模式。
-
包含“不尋常”字元的路徑名將按照配置變數
core.quotePath的解釋進行引用(參見 git-config[1])。 -
輸出中的所有
file1檔案都指代提交之前的檔案,所有file2檔案都指代提交之後的檔案。逐個應用每個更改是不正確的。例如,此補丁將交換 a 和 bdiff --git a/a b/b rename from a rename to b diff --git a/b b/a rename from b rename to a
-
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);
-
它前面是“git diff”頭,看起來像這樣(使用
-c選項時):diff --combined file
或者像這樣(使用
--cc選項時):diff --cc file
-
後面跟著一個或多個擴充套件頭行(此示例顯示了一個包含兩個父級的合併):
index<hash>,<hash>..<hash>mode<mode>,<mode>..<mode>newfilemode<mode>deletedfilemode<mode>,<mode>當 <mode> 中至少有一個與其餘不同的時,才會出現
mode<mode>,<mode>..<mode> 行。有關檢測到的內容移動(重新命名和複製檢測)資訊的擴充套件標頭是為與兩個 <tree-ish> 的 diff 設計的,並且不用於 combined diff 格式。 -
後面跟著一個兩行的“原始檔/目標檔案”頭:
--- a/file +++ b/file
類似於傳統 unified diff 格式的兩行頭,
/dev/null用於指示已建立或已刪除的檔案。然而,如果提供了 --combined-all-paths 選項,您將得到一個 N+1 行的“原始檔/目標檔案”頭,而不是兩行的“原始檔/目標檔案”頭,其中 N 是合併提交中父級的數量:
--- a/file --- a/file --- a/file +++ b/file
如果重新命名或複製檢測處於活動狀態,這種擴充套件格式會很有用,可以讓您檢視不同父級中檔案的原始名稱。
-
塊頭格式已修改,以防止人們意外地將其饋送給
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
即從左到右:
-
新增的行數;
-
一個製表符;
-
刪除的行數;
-
一個製表符;
-
路徑名(可能包含重新命名/複製資訊);
-
一個換行符。
當 -z 輸出選項生效時,輸出格式如下:
1 2 README NUL 3 1 NUL arch/i386/Makefile NUL arch/x86/Makefile NUL
即:
-
新增的行數;
-
一個製表符;
-
刪除的行數;
-
一個製表符;
-
一個 NUL(僅在重新命名/複製時存在);
-
原始映像中的路徑名;
-
一個 NUL(僅在重新命名/複製時存在);
-
後映像中的路徑名(僅在重新命名/複製時存在);
-
一個 NUL。
在重新命名的情況下,在原始檔案路徑之前的額外 NUL 字元是為了讓讀取輸出的指令碼能夠區分當前讀取的記錄是單路徑記錄還是重新命名/複製記錄,而無需預讀。在讀取新增和刪除行之後,讀取到 NUL 將得到路徑名,但如果它是 NUL,則記錄將顯示兩個路徑。