設定與組態
取得與建立專案
基本快照
分支與合併
分享與更新專案
檢查與比較
修補
除錯
電子郵件
外部系統
伺服器管理
指南
管理
底層命令
- 2.46.1 → 2.47.0 無變更
-
2.46.0
07/29/24
- 2.45.1 → 2.45.2 無變更
-
2.45.0
04/29/24
- 2.44.1 → 2.44.2 無變更
-
2.44.0
02/23/24
- 2.43.1 → 2.43.5 無變更
-
2.43.0
11/20/23
- 2.42.2 → 2.42.3 無變更
-
2.42.1
11/02/23
-
2.42.0
08/21/23
- 2.41.1 → 2.41.2 無變更
-
2.41.0
06/01/23
- 2.40.1 → 2.40.3 無變更
-
2.40.0
03/12/23
- 2.36.1 → 2.39.5 無變更
-
2.36.0
04/18/22
- 2.35.1 → 2.35.8 無變更
-
2.35.0
01/24/22
- 2.33.3 → 2.34.8 無變更
-
2.33.2
03/23/22
-
2.33.1
10/12/21
-
2.33.0
08/16/21
- 2.32.1 → 2.32.7 無變更
-
2.32.0
06/06/21
- 2.31.1 → 2.31.8 無變更
-
2.31.0
03/15/21
- 2.30.1 → 2.30.9 無變更
-
2.30.0
12/27/20
- 2.29.1 → 2.29.3 無變更
-
2.29.0
10/19/20
- 2.28.1 無變更
-
2.28.0
07/27/20
- 2.27.1 無變更
-
2.27.0
06/01/20
- 2.26.1 → 2.26.3 無變更
-
2.26.0
03/22/20
- 2.25.2 → 2.25.5 無變更
-
2.25.1
02/17/20
-
2.25.0
01/13/20
- 2.24.1 → 2.24.4 無變更
-
2.24.0
11/04/19
- 2.22.1 → 2.23.4 無變更
-
2.22.0
06/07/19
- 2.21.1 → 2.21.4 無變更
-
2.21.0
02/24/19
- 2.20.1 → 2.20.5 無變更
-
2.20.0
12/09/18
- 2.19.1 → 2.19.6 無變更
-
2.19.0
09/10/18
- 2.18.1 → 2.18.5 無變更
-
2.18.0
06/21/18
- 2.17.1 → 2.17.6 無變更
-
2.17.0
04/02/18
-
2.16.6
12/06/19
-
2.15.4
12/06/19
-
2.14.6
12/06/19
-
2.13.7
05/22/18
-
2.12.5
09/22/17
-
2.11.4
09/22/17
-
2.10.5
09/22/17
-
2.9.5
07/30/17
-
2.8.6
07/30/17
- 2.7.6 無變更
-
2.6.7
05/05/17
-
2.5.6
05/05/17
-
2.4.12
05/05/17
- 2.3.10 無變更
-
2.2.3
09/04/15
-
2.1.4
12/17/14
-
2.0.5
12/17/14
描述
顯示一個或多個物件 (blobs、trees、tags 和 commits)。
對於 commits,它會顯示日誌訊息和文字差異。它也會以 git diff-tree --cc 產生的特殊格式呈現合併 commit。
對於 tags,它會顯示 tag 訊息和參考的物件。
對於 trees,它會顯示名稱 (等同於使用 --name-only 的 git ls-tree)。
對於純 blobs,它會顯示純內容。
可以使用 git log 命令理解的一些選項來控制 commit 所引入的變更如何顯示。
此手冊頁面僅描述最常用的選項。
選項
- <物件>…
-
要顯示的物件名稱 (預設為 HEAD)。如需更完整的物件名稱拼寫方式列表,請參閱 gitrevisions[7] 中的「指定修訂版本」章節。
- --pretty[=<格式>]
- --format=<格式>
-
以給定的格式漂亮地列印 commit 日誌的內容,其中 <格式> 可以是 oneline、short、medium、full、fuller、reference、email、raw、format:<string> 和 tformat:<string> 之一。當 <格式> 不是上述任何一個,並且其中有 %placeholder 時,它的行為就像給定了 --pretty=tformat:<format> 一樣。
請參閱「漂亮格式」章節,瞭解每種格式的更多詳細資訊。當省略 =<格式> 部分時,它預設為 medium。
注意:您可以在儲存庫組態中指定預設的漂亮格式 (請參閱 git-config[1])。
- --abbrev-commit
-
不要顯示完整的 40 位元組十六進位 commit 物件名稱,而是顯示唯一命名物件的前綴。「--abbrev=<n>」選項 (如果顯示差異輸出,也會修改它) 可用於指定前綴的最小長度。
這應該讓使用 80 欄終端機的人更容易閱讀「--pretty=oneline」。
- --no-abbrev-commit
-
顯示完整的 40 位元組十六進位 commit 物件名稱。這會否定
--abbrev-commit
,無論是明確的還是其他選項 (例如「--oneline」) 所暗示的。它也會覆寫log.abbrevCommit
變數。 - --oneline
-
這是將「--pretty=oneline --abbrev-commit」一起使用的簡寫。
- --encoding=<編碼>
-
Commit 物件會在其編碼標頭中記錄用於日誌訊息的字元編碼;此選項可用於告知命令以使用者偏好的編碼重新編碼 commit 日誌訊息。對於非底層命令,這預設為 UTF-8。請注意,如果物件聲稱以
X
編碼,而我們以X
輸出,我們將逐字輸出物件;這表示原始 commit 中的無效序列可能會複製到輸出中。同樣地,如果 iconv(3) 無法轉換 commit,我們將靜默地逐字輸出原始物件。 - --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 (預設)、full 和 fuller)。
- --notes[=<ref>]
-
在顯示 commit 日誌訊息時,顯示註解 commit 的註解 (請參閱 git-notes[1])。這是
git log
、git show
和git whatchanged
命令在命令列上未給定--pretty
、--format
或--oneline
選項時的預設值。預設情況下,顯示的註解來自
core.notesRef
和notes.displayRef
變數 (或相應的環境覆寫) 中列出的註解 refs。請參閱 git-config[1] 以瞭解更多詳細資訊。使用可選的 <ref> 引數,使用 ref 來尋找要顯示的註解。當 ref 以
refs/notes/
開頭時,它可以指定完整的 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
來檢查簽署 commit 物件的有效性,並顯示輸出。
漂亮格式
如果提交是一個合併,而且如果 pretty-format 不是 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=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 資訊會顯示真正的父提交,而不考慮移植或歷史記錄簡化。請注意,此格式會影響提交的顯示方式,但不會影響 diff 的顯示方式,例如使用
git log --raw
。若要以原始 diff 格式取得完整的物件名稱,請使用--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.<<
佔位符如下
-
展開為單一文字字元的佔位符
-
會影響後續佔位符格式的佔位符
- %Cred
-
將顏色切換為紅色
- %Cgreen
-
將顏色切換為綠色
- %Cblue
-
將顏色切換為藍色
- %Creset
-
重設顏色
- %C(…)
-
顏色規格,如 git-config[1] 的「組態檔」章節中的「值」所述。預設情況下,只有在啟用記錄輸出時才會顯示顏色(透過
color.diff
、color.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>])
-
帶有自訂裝飾的 ref 名稱。
decorate
字串後面可以接一個冒號和零或多個以逗號分隔的選項。選項值可以包含文字格式化代碼。由於逗號 (%x2C
) 和右括號 (%x29
) 在選項語法中扮演的角色,因此必須使用這些代碼。-
prefix=<值>: 顯示在 ref 名稱列表之前。預設值為「
(
」。 -
suffix=<值>: 顯示在 ref 名稱列表之後。預設值為「
)
」。 -
separator=<值>: 顯示在 ref 名稱之間。預設值為「
,
」。 -
pointer=<值>: 顯示在 HEAD 和它指向的分支之間(如果有的話)。預設值為「
->
」。 -
tag=<值>: 顯示在標籤名稱之前。預設值為「
tag:
」。
-
例如,要產生沒有包裝或標籤註釋,並以空格作為分隔符號的裝飾:
+
%(decorate:prefix=,suffix=,tag=,separator= )
- %(describe[:<選項>])
-
人類可讀的名稱,類似於 git-describe[1];對於無法描述的提交,則為空字串。
describe
字串後面可以接一個冒號和零或多個以逗號分隔的選項。當同時新增或移除標籤時,描述可能不一致。-
tags[=<布林值>]: 除了僅考慮帶註釋的標籤外,也考慮輕量級標籤。
-
abbrev=<數字>: 不使用預設的十六進位數字位數(這會根據儲存庫中的物件數量而變化,預設值為 7),而是使用 <數字> 位數,或使用形成唯一物件名稱所需的位數。
-
match=<模式>: 僅考慮符合給定的
glob(7)
模式的標籤,不包括 "refs/tags/" 前綴。 -
exclude=<模式>: 不考慮符合給定的
glob(7)
模式的標籤,不包括 "refs/tags/" 前綴。
-
- %S
-
命令列上給定的 ref 名稱,用於追溯提交的來源(類似於
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
選項描述的規則。@
之前的部分是在命令列上給定的 ref 名稱(因此git log -g refs/heads/master
將產生refs/heads/master@{0}
)。 - %gd
-
縮短的 reflog 選擇器;與
%gD
相同,但 ref 名稱部分縮短以提高人類可讀性(因此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[:<選項>])
-
顯示由 git-interpret-trailers[1] 解譯的內文拖曳 (trailers)。
trailers
字串後面可以接一個冒號和零或多個以逗號分隔的選項。如果多次提供任何選項,則最後一次出現的選項會生效。-
key=<金鑰>: 僅顯示具有指定 <金鑰> 的拖曳 (trailers)。比對不區分大小寫,尾隨冒號為可選。如果多次給定選項,則會顯示符合任何金鑰的拖曳行。此選項會自動啟用
only
選項,以便隱藏拖曳區塊中的非拖曳行。如果不希望這樣,可以使用only=false
來停用。例如,%(trailers:key=Reviewed-by)
顯示金鑰為Reviewed-by
的拖曳行。 -
only[=<布林值>]: 選取是否應包含拖曳區塊中的非拖曳行。
-
separator=<分隔符號>: 指定插入在拖曳行之間的分隔符號。預設值為換行字元。字串 <分隔符號> 可以包含上述的文字格式化代碼。若要使用逗號作為分隔符號,必須使用
%x2C
,否則會被解析為下一個選項。例如,%(trailers:key=Ticket,separator=%x2C )
顯示所有金鑰為 "Ticket" 的拖曳行,並以逗號和空格分隔。 -
unfold[=<布林值>]: 使其行為如同給定 interpret-trailer 的
--unfold
選項。例如,%(trailers:only,unfold=true)
會展開並顯示所有拖曳行。 -
keyonly[=<布林值>]: 僅顯示拖曳的金鑰部分。
-
valueonly[=<布林值>]: 僅顯示拖曳的值部分。
-
key_value_separator=<分隔符號>: 指定插入在每個拖曳的金鑰和值之間的分隔符號。預設值為 ": "。否則,它與上述的 separator=<分隔符號> 具有相同的語意。
-
-
注意
|
某些佔位符可能取決於提供給修訂版遍歷引擎的其他選項。例如,除非我們正在遍歷 reflog 項目(例如透過 git log -g ),否則 %g* reflog 選項將會插入空字串。如果命令列上尚未提供 --decorate ,則 %d 和 %D 佔位符會使用「短」裝飾格式。 |
布林選項接受可選值 [=<布林值>]
。接受的值為 true
、false
、on
、off
等。請參閱 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 show
產生差異輸出的方式。
- -p
- -u
- --patch
-
產生修補程式(請參閱使用 -p 產生修補程式文字)。
- -s
- --no-patch
-
抑制來自差異機制的任何輸出。對於預設會顯示修補程式的命令(例如
git show
)來說,這很有用,可以消除它們的輸出,或取消命令列中較早出現的選項(例如--patch
、--stat
)在別名中的效果。 - -m
-
以預設格式顯示合併提交的差異。這類似於 --diff-merges=on,但除非同時給定
-p
,否則-m
不會產生任何輸出。 - -c
-
產生合併提交的合併差異輸出。--diff-merges=combined -p 的捷徑。
- --cc
-
產生合併提交的密集合併差異輸出。--diff-merges=dense-combined -p 的捷徑。
- --dd
-
產生針對合併提交和一般提交的第一個父項的差異。--diff-merges=first-parent -p 的捷徑。
- --remerge-diff
-
產生合併提交的重新合併差異輸出。--diff-merges=remerge -p 的捷徑。
- --no-diff-merges
-
--diff-merges=off 的同義詞。
- --diff-merges=<格式>
-
指定用於合併提交的差異格式。預設值為 `dense-combined`,除非使用
--first-parent
,在這種情況下,預設值為 `first-parent`。支援以下格式:
- off, none
-
停用合併提交的差異輸出。適用於覆寫隱含值。
- on, m
-
使合併提交的差異輸出以預設格式顯示。可以使用
log.diffMerges
設定變數來變更預設格式,其預設值為separate
。 - first-parent, 1
-
顯示相對於第一個父項的完整差異。這與
--patch
針對非合併提交產生的格式相同。 - separate
-
顯示相對於每個父項的完整差異。為每個父項產生個別的記錄項目和差異。
- combined, c
-
同時顯示與每個父節點的差異到合併結果,而不是一次顯示一個父節點和結果之間的差異。此外,它只列出從所有父節點修改過的檔案。
- dense-combined, cc
-
進一步壓縮
--diff-merges=combined
產生的輸出,省略不重要的程式碼區塊,這些區塊在父節點中只有兩種變體,而合併結果選擇其中一種且未經修改。 - remerge, r
-
重新合併雙父節點的合併提交,以建立一個臨時的樹狀物件 — 可能包含帶有衝突標記等內容的檔案。然後,將該臨時樹與實際的合併提交之間顯示差異。
使用此選項時輸出的內容可能會變更,並且與其他選項的交互作用也會變更(除非明確記錄)。
- --combined-all-paths
-
此標誌會使組合差異(用於合併提交)列出所有父節點的檔案名稱。因此,它僅在使用
--diff-merges=[dense-]combined
時有效,並且可能僅在偵測到檔案名稱變更時才有用(即,當要求重新命名或複製偵測時)。 - -U<n>
- --unified=<n>
-
產生具有 <n> 行上下文的差異,而不是通常的三行。隱含
--patch
。 - --output=<file>
-
輸出到特定檔案,而不是標準輸出。
- --output-indicator-new=<char>
- --output-indicator-old=<char>
- --output-indicator-context=<char>
-
指定用於指示產生的修補程式中新行、舊行或上下文行的字元。通常它們分別是 +、- 和 ' '。
- --raw
-
對於每個提交,使用原始差異格式顯示變更摘要。請參閱git-diff[1]的「原始輸出格式」章節。這與以原始格式顯示記錄本身不同,您可以使用
--format=raw
來實現。 - --patch-with-raw
-
-p --raw
的同義詞。 - -t
-
在差異輸出中顯示樹狀物件。
- --indent-heuristic
-
啟用啟發式方法,將差異區塊邊界移動以使修補程式更容易閱讀。這是預設值。
- --no-indent-heuristic
-
停用縮排啟發式方法。
- --minimal
-
花費額外時間以確保產生最小的差異。
- --patience
-
使用「耐心差異」演算法產生差異。
- --histogram
-
使用「直方圖差異」演算法產生差異。
- --anchored=<text>
-
使用「錨定差異」演算法產生差異。
此選項可以指定多次。
如果一行同時存在於來源和目的地中,僅存在一次,並且以該文字開頭,則此演算法會嘗試防止它在輸出中顯示為刪除或新增。它在內部使用「耐心差異」演算法。
- --diff-algorithm={patience|minimal|histogram|myers}
-
選擇差異演算法。變體如下:
例如,如果您將
diff.algorithm
變數設定為非預設值,並且想要使用預設值,則必須使用--diff-algorithm=default
選項。 - --stat[=<width>[,<name-width>[,<count>]]]
-
產生差異統計資訊。依預設,檔案名稱部分會使用盡可能多的空間,其餘部分則用於圖表部分。最大寬度預設為終端機寬度,如果未連接到終端機,則預設為 80 個欄位,並且可以被
<width>
覆寫。檔案名稱部分的寬度可以透過在逗號後給出另一個寬度<name-width>
或透過設定diff.statNameWidth=<width>
來限制。圖表部分的寬度可以使用--stat-graph-width=<width>
或透過設定diff.statGraphWidth=<width>
來限制。使用--stat
或--stat-graph-width
會影響所有產生統計圖的命令,而設定diff.statNameWidth
或diff.statGraphWidth
不會影響git format-patch
。透過給出第三個參數<count>
,您可以將輸出限制為前<count>
行,如果還有更多行,則接著顯示...
。這些參數也可以使用
--stat-width=<width>
、--stat-name-width=<name-width>
和--stat-count=<count>
個別設定。 - --compact-summary
-
在差異統計資訊中輸出擴展標頭資訊的精簡摘要,例如檔案建立或刪除(「new」或「gone」,如果它是符號連結,則可選為「+l」)和模式變更(新增或移除可執行位元,分別為「+x」或「-x」)。該資訊放在檔案名稱部分和圖表部分之間。隱含
--stat
。 - --numstat
-
與
--stat
類似,但以十進位表示法顯示新增和刪除的行數,以及沒有縮寫的路徑名稱,以使其更適合機器使用。對於二進位檔案,輸出兩個-
,而不是說0 0
。 - --shortstat
-
僅輸出
--stat
格式的最後一行,其中包含修改檔案的總數,以及新增和刪除的行數。 - -X[<param1,param2,…>]
- --dirstat[=<param1,param2,…>]
-
輸出每個子目錄相對變更量的分佈。
--dirstat
的行為可以透過傳遞逗號分隔的參數清單來自訂。預設值由diff.dirstat
組態變數控制(請參閱git-config[1])。可以使用以下參數:-
changes
-
透過計算從來源中移除或新增到目的地的行數來計算目錄統計數字。這會忽略檔案內純程式碼移動的數量。換句話說,重新排列檔案中的行不會像其他變更一樣被計數。當沒有給定參數時,這是預設行為。
-
lines
-
透過執行常規的基於行的差異分析,並對移除/新增的行數進行求和來計算目錄統計數字。(對於二進位檔案,則計算 64 位元組的區塊,因為二進位檔案沒有行的自然概念)。與
changes
行為相比,這是一種更耗費資源的--dirstat
行為,但它會像其他變更一樣計算檔案內重新排列的行。產生的輸出與您從其他--*stat
選項獲得的輸出一致。 -
files
-
透過計算變更的檔案數來計算目錄統計數字。每個變更的檔案在目錄統計分析中都計數相同。這是計算上最便宜的
--dirstat
行為,因為它根本不需要查看檔案內容。 -
cumulative
-
也將子目錄中的變更計入父目錄。請注意,當使用
cumulative
時,回報的百分比總和可能會超過 100%。預設(非累積)行為可以使用noncumulative
參數指定。 - <limit>
-
整數參數指定一個截止百分比(預設為 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
-
使用 NUL 而不是換行符來分隔提交。
此外,當已給定
--raw
或--numstat
時,請勿修改路徑名稱,並使用 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
時,會使用「簡短」格式。此格式僅顯示範圍開始和結束時的提交名稱。當指定--submodule
或--submodule=log
時,會使用「日誌」格式。此格式會列出範圍內的提交,就像 git-submodule[1]summary
所做的那樣。當指定--submodule=diff
時,會使用「差異」格式。此格式會顯示提交範圍之間子模組內容變更的內嵌差異。預設為diff.submodule
,如果未設定該配置選項,則預設為「簡短」格式。 - --color[=<when>]
-
顯示彩色差異。
--color
(即不帶 =<when>) 與--color=always
相同。<when> 可以是always
、never
或auto
其中之一。 - --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-color-moved-ws
-
在執行移動偵測時,不要忽略空白字元。這可以用來覆寫配置設定。它與
--color-moved-ws=no
相同。 - --word-diff[=<mode>]
-
顯示單字差異,使用 <mode> 來分隔變更的單字。預設情況下,單字以空白字元分隔;請參閱下方的
--word-diff-regex
。<mode> 預設為 plain,且必須是以下其中之一:請注意,儘管第一個模式的名稱如此,但如果啟用,所有模式都會使用顏色來突出顯示變更的部分。
- --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
配置控制。預設情況下,尾隨空白字元 (包括僅由空白字元組成的行) 以及緊跟在行初始縮排內的 Tab 字元之後的空格字元被視為空白字元錯誤。如果發現問題,則會以非零狀態結束。與 --exit-code 不相容。 - --ws-error-highlight=<kind>
-
突出顯示差異的
context
、old
或new
行中的空白字元錯誤。多個值以逗號分隔,none
會重設先前的值,default
會將清單重設為new
,而all
是old,new,context
的簡寫。如果未指定此選項,並且未設定配置變數diff.wsErrorHighlight
,則僅突出顯示new
行中的空白字元錯誤。空白字元錯誤會以color.diff.whitespace
著色。 - --full-index
-
在產生修補程式格式輸出時,不要顯示前幾個字元,而是顯示 "index" 行上完整的 pre- 和 post-image 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>]
-
如果產生差異,則偵測並回報每個提交的重新命名。若要在追蹤歷程時跨重新命名追蹤檔案,請參閱
--follow
。如果指定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
之間的差異。產生的修補程式並非要以patch
或git 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>
之間的差異,請考慮在同一個檔案中具有以下差異的提交+ 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
-
忽略 EOL 空白字元的變更。
- -b
- --ignore-space-change
-
忽略空白字元數量的變更。這會忽略行尾的空白字元,並將其他一個或多個空白字元的所有序列視為相等。
- -w
- --ignore-all-space
-
在比較行時忽略空白字元。即使其中一行有空白字元,而另一行沒有,也會忽略差異。
- --ignore-blank-lines
-
忽略所有行為空白的變更。
- -I<regex>
- --ignore-matching-lines=<regex>
-
忽略所有行符合 <regex> 的變更。可以多次指定此選項。
- --inter-hunk-context=<lines>
-
顯示差異區塊之間的內容,最多指定行數,藉此融合彼此接近的區塊。預設為
diff.interHunkContext
,如果未設定組態選項,則預設為 0。 - -W
- --function-context
-
將整個函式顯示為每個變更的內容行。函式名稱的判斷方式與
git diff
運作修補程式區塊標頭的方式相同 (請參閱 gitattributes[5] 中的*定義自訂區塊標頭*)。 - --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=<prefix>
-
顯示指定的來源前置詞,而不是 "a/"。
- --dst-prefix=<prefix>
-
顯示指定的目的地前置詞,而不是 "b/"。
- --no-prefix
-
不顯示任何來源或目的前綴。
- --default-prefix
-
使用預設的來源和目的前綴("a/" 和 "b/")。這會覆寫組態變數,例如
diff.noprefix
、diff.srcPrefix
、diff.dstPrefix
和diff.mnemonicPrefix
(請參閱git-config
(1))。 - --line-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]。
使用 -p 產生修補程式文字
使用 -p
選項執行 git-diff[1]、git-log[1]、git-show[1]、git-diff-index[1]、git-diff-tree[1] 或 git-diff-files[1] 會產生修補程式文字。您可以使用 GIT_EXTERNAL_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
會分別顯示重新命名/複製的來源檔案名稱和重新命名/複製產生的檔案名稱。 -
它後面會跟著一或多個延伸標頭行
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>;否則,會使用不同的行表示舊模式和新模式。
-
具有「不尋常」字元的路徑名稱會根據組態變數
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 標頭」。
合併差異格式
任何產生差異的命令都可以使用 -c
或 --cc
選項,在顯示合併時產生「合併差異」。這是使用 git-diff[1] 或 git-show[1] 顯示合併時的預設格式。另請注意,您可以將適當的 --diff-merges
選項提供給這些命令中的任何一個,以強制產生特定格式的差異。
「合併差異」格式如下所示
diff --combined describe.c index fabadb8,cc95eb0..4866510 --- a/describe.c +++ b/describe.c @@@ -98,20 -98,12 +98,20 @@@ return (a_date > b_date) ? -1 : (a_date == b_date) ? 0 : 1; } - static void describe(char *arg) -static void describe(struct commit *cmit, int last_one) ++static void describe(char *arg, int last_one) { + unsigned char sha1[20]; + struct commit *cmit; struct commit_list *list; static int initialized = 0; struct commit_name *n; + if (get_sha1(arg, sha1) < 0) + usage(describe_usage); + cmit = lookup_commit_reference(sha1); + if (!cmit) + usage(describe_usage); + if (!initialized) { initialized = 1; for_each_ref(get_name);
-
它前面會加上一個 "git diff" 標頭,看起來像這樣(當使用
-c
選項時)diff --combined file
或像這樣(當使用
--cc
選項時)diff --cc file
-
它後面會跟著一或多個延伸標頭行(此範例顯示具有兩個父系的合併)
index <hash>,<hash>..<hash> mode <mode>,<mode>..<mode> new file mode <mode> deleted file mode <mode>,<mode>
只有在至少一個 <mode> 與其餘 <mode> 不同時,才會顯示
mode <mode>,<mode>..<mode>
行。具有偵測到的內容移動(重新命名和複製偵測)相關資訊的延伸標頭旨在與兩個 <tree-ish> 的差異搭配使用,並且不會由合併差異格式使用。 -
它後面會跟著一個兩行的 from-file/to-file 標頭
--- a/file +++ b/file
類似於傳統的「統一」差異格式的兩行標頭,
/dev/null
用於表示建立或刪除的檔案。但是,如果提供了 --combined-all-paths 選項,您將會取得 N+1 行的 from-file/to-file 標頭,而不是兩行的 from-file/to-file,其中 N 是合併提交中的父系數量
--- a/file --- a/file --- a/file +++ b/file
如果啟用重新命名或複製偵測,則這種延伸格式會很有用,可讓您查看不同父系中檔案的原始名稱。
-
修改了區塊標頭格式,以防止使用者意外地將其提供給
patch -p1
。建立合併差異格式是為了檢閱合併提交變更,而不是為了套用。@@@ <from-file-range> <from-file-range> <to-file-range> @@@
合併差異格式的區塊標頭中有 (父系數量 + 1) 個
@
字元。
不同於顯示兩個檔案 A 和 B 的傳統「統一」差異格式,它使用單一欄,其中有 -
(減號 - 出現在 A 中,但在 B 中移除)、+
(加號 - A 中遺失,但新增至 B)或 " "
(空格 - 未變更)前綴,這種格式會將兩個或多個檔案 file1、file2... 與一個檔案 X 進行比較,並顯示 X 與每個 fileN 的不同之處。每個 fileN 的一欄會附加到輸出行的前面,以表示 X 的行與它的不同之處。
欄 N 中的 -
字元表示該行出現在 fileN 中,但沒有出現在結果中。欄 N 中的 +
字元表示該行出現在結果中,而 fileN 沒有該行(換句話說,從該父系的觀點來看,該行是新增的)。
在上述範例輸出中,函式簽名已從兩個檔案變更(因此從 file1 和 file2 中移除兩個 -
,再加上 ++
表示新增的一行沒有出現在 file1 或 file2 中)。此外,還有另外八行與 file1 相同,但沒有出現在 file2 中(因此以 +
作為前綴)。
當由 git diff-tree -c
顯示時,它會將合併提交的父系與合併結果進行比較(即 file1..fileN 是父系)。當由 git diff-files -c
顯示時,它會將兩個未解析的合併父系與工作目錄檔案進行比較(即 file1 是階段 2,也就是「我們的版本」,file2 是階段 3,也就是「他們的版本」)。
範例
-
git show v1.0.0
-
顯示標籤
v1.0.0
,以及標籤指向的物件。 -
git show v1.0.0^{tree}
-
顯示標籤
v1.0.0
指向的樹狀結構。 -
git show -s --format=%s v1.0.0^{commit}
-
顯示標籤
v1.0.0
指向的提交主旨。 -
git show next~10:Documentation/README
-
顯示分支
next
的倒數第 10 次提交中目前的檔案Documentation/README
的內容。 -
git show master:Makefile master:t/Makefile
-
將分支
master
標頭中的 Makefiles 的內容串連起來。
討論
Git 在某種程度上與字元編碼無關。
-
Blob 物件的內容是不需解譯的位元組序列。在核心層級沒有編碼轉換。
-
路徑名稱會以 UTF-8 正規化形式 C 編碼。這適用於樹狀物件、索引檔案、參照名稱,以及命令列引數、環境變數和組態檔案(
.git/config
(請參閱 git-config[1])、gitignore[5]、gitattributes[5] 和 gitmodules[5])中的路徑名稱。請注意,Git 在核心層級只是將路徑名稱視為非 NUL 位元組序列,沒有路徑名稱編碼轉換(Mac 和 Windows 除外)。因此,即使在使用舊版擴充 ASCII 編碼的平台和檔案系統上,使用非 ASCII 路徑名稱也大多可以運作。但是,在此類系統上建立的儲存庫在基於 UTF-8 的系統(例如 Linux、Mac、Windows)上無法正常運作,反之亦然。此外,許多基於 Git 的工具只是假設路徑名稱為 UTF-8,並且無法正確顯示其他編碼。
-
提交記錄訊息通常以 UTF-8 編碼,但也支援其他擴充 ASCII 編碼。這包括 ISO-8859-x、CP125x 和許多其他編碼,但不包括 UTF-16/32、EBCDIC 和 CJK 多位元組編碼(GBK、Shift-JIS、Big5、EUC-x、CP9xx 等)。
雖然我們鼓勵提交記錄訊息以 UTF-8 編碼,但核心和 Git Porcelain 都設計為不強制專案使用 UTF-8。如果特定專案的所有參與者都覺得使用舊版編碼更方便,Git 也並不禁止。但是,有幾件事需要注意。
-
如果提供給 git commit 和 git commit-tree 的提交記錄訊息看起來不像有效的 UTF-8 字串,它們就會發出警告,除非您明確表示您的專案使用舊版編碼。要做到這一點,必須在
.git/config
檔案中包含i18n.commitEncoding
,如下所示[i18n] commitEncoding = ISO-8859-1
使用上述設定建立的提交物件會在其
encoding
標頭中記錄i18n.commitEncoding
的值。這是為了幫助稍後查看它們的其他人。如果缺少此標頭,則表示提交記錄訊息以 UTF-8 編碼。 -
git log、git show、git blame 和其他類似命令會查看提交物件的
encoding
標頭,並嘗試將記錄訊息重新編碼為 UTF-8,除非另有指定。您可以使用.git/config
檔案中的i18n.logOutputEncoding
指定所需的輸出編碼,如下所示[i18n] logOutputEncoding = ISO-8859-1
如果您沒有此組態變數,則會改用
i18n.commitEncoding
的值。
請注意,我們刻意選擇在提交時不重新編碼提交記錄訊息,以在提交物件層級強制使用 UTF-8,因為重新編碼為 UTF-8 不一定是可逆的操作。
GIT
屬於 git[1] 套件的一部分