Git
英文 ▾ 主題 ▾ 最新版本 ▾ git-show 最後更新於 2.46.0

名稱

git-show - 顯示各種型態的物件

概要

git show [<options>] [<object>…​]

描述

顯示一個或多個物件 (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 日誌的內容,其中 <格式> 可以是 onelineshortmediumfullfullerreferenceemailrawformat:<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 (預設)、fullfuller)。

--notes[=<ref>]

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

預設情況下,顯示的註解來自 core.notesRefnotes.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 不是 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 資訊會顯示真正的父提交,而不考慮移植或歷史記錄簡化。請注意,此格式會影響提交的顯示方式,但不會影響 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.<<

    佔位符如下

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

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

      帶有自訂裝飾的 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 佔位符會使用「短」裝飾格式。

布林選項接受可選值 [=<布林值>]。接受的值為 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 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}

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

default, myers

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

minimal

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

patience

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

histogram

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

例如,如果您將 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.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」)。該資訊放在檔案名稱部分和圖表部分之間。隱含 --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> 可以是 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 配置控制。預設情況下,尾隨空白字元 (包括僅由空白字元組成的行) 以及緊跟在行初始縮排內的 Tab 字元之後的空格字元被視為空白字元錯誤。如果發現問題,則會以非零狀態結束。與 --exit-code 不相容。

--ws-error-highlight=<kind>

突出顯示差異的 contextoldnew 行中的空白字元錯誤。多個值以逗號分隔,none 會重設先前的值,default 會將清單重設為 new,而 allold,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 之間的差異。產生的修補程式並非要以 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> 之間的差異,請考慮在同一個檔案中具有以下差異的提交

+    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.noprefixdiff.srcPrefixdiff.dstPrefixdiff.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_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>

    檔案模式會以包含檔案類型和檔案權限位的 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 標頭」。

合併差異格式

任何產生差異的命令都可以使用 -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);
  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>..<mode> 行。具有偵測到的內容移動(重新命名和複製偵測)相關資訊的延伸標頭旨在與兩個 <tree-ish> 的差異搭配使用,並且不會由合併差異格式使用。

  3. 它後面會跟著一個兩行的 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

    如果啟用重新命名或複製偵測,則這種延伸格式會很有用,可讓您查看不同父系中檔案的原始名稱。

  4. 修改了區塊標頭格式,以防止使用者意外地將其提供給 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 也並不禁止。但是,有幾件事需要注意。

  1. 如果提供給 git commitgit commit-tree 的提交記錄訊息看起來不像有效的 UTF-8 字串,它們就會發出警告,除非您明確表示您的專案使用舊版編碼。要做到這一點,必須在 .git/config 檔案中包含 i18n.commitEncoding,如下所示

    [i18n]
    	commitEncoding = ISO-8859-1

    使用上述設定建立的提交物件會在其 encoding 標頭中記錄 i18n.commitEncoding 的值。這是為了幫助稍後查看它們的其他人。如果缺少此標頭,則表示提交記錄訊息以 UTF-8 編碼。

  2. git loggit showgit blame 和其他類似命令會查看提交物件的 encoding 標頭,並嘗試將記錄訊息重新編碼為 UTF-8,除非另有指定。您可以使用 .git/config 檔案中的 i18n.logOutputEncoding 指定所需的輸出編碼,如下所示

    [i18n]
    	logOutputEncoding = ISO-8859-1

    如果您沒有此組態變數,則會改用 i18n.commitEncoding 的值。

請注意,我們刻意選擇在提交時不重新編碼提交記錄訊息,以在提交物件層級強制使用 UTF-8,因為重新編碼為 UTF-8 不一定是可逆的操作。

GIT

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

scroll-to-top