簡體中文 ▾ 主題 ▾ 最新版本 ▾ git-show 最後更新於 2.49.0

名稱

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

概要

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

描述

顯示一個或多個物件(blob、tree、tag 和 commit)。

對於提交,它顯示日誌資訊和文字差異。它還以 *git diff-tree --cc* 生成的特殊格式顯示合併提交。

對於標籤,它顯示標籤資訊和引用的物件。

對於樹,它顯示名稱(等同於帶 --name-only 的 *git ls-tree*)。

對於普通 blob,它顯示其原始內容。

可以利用 *git log* 命令理解的某些選項來控制提交引入的更改的顯示方式。

本手冊頁僅描述最常用的選項。

選項

<object>…​

要顯示的物件名稱(預設為 *HEAD*)。有關拼寫物件名稱的更完整列表,請參閱 gitrevisions[7] 中的 “SPECIFYING REVISIONS” 部分。

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

提交物件在其編碼頭中記錄了日誌訊息所使用的字元編碼;此選項可用於告知命令以使用者首選的編碼重新編碼提交日誌訊息。對於非底層命令,這預設為 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])。當命令列中沒有給定 --pretty--format--oneline 選項時,這是 git loggit showgit whatchanged 命令的預設行為。

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

使用可選的 *<ref>* 引數,使用該引用查詢要顯示的註釋。當引用以 refs/notes/ 開頭時,它可以指定完整的引用名稱;當它以 notes/ 開頭時,以 refs/ 開頭時,否則會加上 refs/notes/ 字首以形成引用的完整名稱。

可以組合多個 --notes 選項來控制顯示哪些註釋。示例:“--notes=foo”將只顯示“refs/notes/foo”中的註釋;“--notes=foo --notes”將同時顯示“refs/notes/foo”中的註釋和預設註釋引用中的註釋。

--no-notes

不顯示註釋。這會透過重置顯示註釋的註釋引用列表來抵消上述 --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 並顯示輸出,檢查簽名提交物件的有效性。

漂亮格式(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=short 格式化,除非明確指定了另一個 --date 選項。與任何帶有格式佔位符的 format: 一樣,其輸出不受 --decorate--walk-reflogs 等其他選項的影響。

  • email

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

    類似於 *email*,但提交訊息中以“From ”開頭(前面有零個或多個“>”)的行會用“>”引用,以免被誤認為是新提交的開始。

  • raw

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

  • format:<format-string>

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

    例如,*format:"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(…​)

      顏色規範,如 git-config[1] 的“CONFIGURATION FILE”部分中的“Values”所述。預設情況下,僅當為日誌輸出啟用顏色時(透過 color.diffcolor.ui--color,並遵循前者的 auto 設定,如果我們輸出到終端),才會顯示顏色。%C(auto,...) 被接受作為預設值的歷史同義詞(例如,%C(auto,red))。指定 %C(always,...) 將即使在顏色未啟用時也顯示顏色(但請考慮直接使用 --color=always 來為整個輸出啟用顏色,包括此格式和 Git 可能著色的其他任何內容)。僅使用 auto(即 %C(auto))將會在顏色再次切換之前,對下一個佔位符啟用自動著色。

      %m

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

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

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

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

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

      %<|( <M> )

      使下一個佔位符至少佔據直到第 M 個顯示列,如有必要則在右側填充空格。使用負 M 值表示從終端視窗右側邊緣測量的列位置。

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

      類似於 *%<( <N> )*、*%<|( <M> )*,但在左側填充空格

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

      類似於 *%>( <N> )*、*%>|( <M> )*,但如果下一個佔位符佔用比給定更多的空間,並且其左側有空格,則使用這些空格

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

      類似於 *%<( <N> )*、*%<|( <M> )*,但兩側都填充(即文字居中)

    • 擴充套件為從提交中提取資訊的佔位符

      %H

      提交雜湊

      %h

      縮寫提交雜湊

      %T

      樹雜湊

      %t

      縮寫樹雜湊

      %P

      父雜湊

      %p

      縮寫父雜湊

      %an

      作者姓名

      %aN

      作者姓名(遵循 .mailmap,參見 git-shortlog[1]git-blame[1]

      %ae

      作者電子郵件

      %aE

      作者電子郵件(遵循 .mailmap,參見 git-shortlog[1]git-blame[1]

      %al

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

      %aL

      作者電子郵件的本地部分(參見 *%al*),遵循 .mailmap,參見 git-shortlog[1]git-blame[1]

      %ad

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

      %aD

      作者日期,RFC2822 樣式

      %ar

      作者日期,相對格式

      %at

      作者日期,UNIX 時間戳

      %ai

      作者日期,ISO 8601 類似格式

      %aI

      作者日期,嚴格 ISO 8601 格式

      %as

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

      %ah

      作者日期,人類可讀格式(類似於 git-rev-list[1]--date=human 選項)

      %cn

      提交者姓名

      %cN

      提交者姓名(遵循 .mailmap,參見 git-shortlog[1]git-blame[1]

      %ce

      提交者電子郵件

      %cE

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

      %cl

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

      %cL

      提交者電子郵件本地部分(參見 *%cl*),遵循 .mailmap,參見 git-shortlog[1]git-blame[1]

      %cd

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

      %cD

      提交者日期,RFC2822 樣式

      %cr

      提交者日期,相對格式

      %ct

      提交者日期,UNIX 時間戳

      %ci

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

      %cI

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

      %cs

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

      %ch

      提交者日期,人類可讀格式(類似於 git-rev-list[1]--date=human 選項)

      %d

      引用名稱,類似於 git-log[1] 的 --decorate 選項

      %D

      不帶“ (”和“)”包裹的引用名稱。

      %(decorate[:<options>])

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

      • prefix=<value>:在引用名稱列表之前顯示。預設為“ (”。

      • suffix=<value>:在引用名稱列表之後顯示。預設為“)”。

      • separator=<value>:在引用名稱之間顯示。預設為“, ”。

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

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

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

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

    %(describe[:<options>])

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

    • tags[=<bool-value>]:除了考慮帶註釋的標籤外,還考慮輕量級標籤。

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

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

    • exclude=<pattern>:不考慮與給定 glob(7) 模式匹配的標籤,不包括“refs/tags/”字首。

    %S

    命令列中給出用於到達提交的引用名稱(類似於 git log --source),僅適用於 git log

    %e

    編碼

    %s

    主題

    %f

    已清理的主題行,適合作為檔名

    %b

    正文

    %B

    原始正文(未包裝的主題和正文)

    %N

    提交註釋

    %GG

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

    %G?

    對於有效簽名顯示“G”,對於無效簽名顯示“B”,對於有效但未知有效性的簽名顯示“U”,對於已過期但有效的簽名顯示“X”,對於由已過期金鑰生成但有效的簽名顯示“Y”,對於由已撤銷金鑰生成但有效的簽名顯示“R”,如果無法檢查簽名(例如缺少金鑰)顯示“E”,如果沒有簽名顯示“N”

    %GS

    顯示簽名提交的簽名者姓名

    %GK

    顯示用於簽署簽名提交的金鑰

    %GF

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

    %GP

    顯示用於簽署簽名提交的子金鑰所屬主金鑰的指紋

    %GT

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

    %gD

    reflog 選擇器,例如 refs/stash@{1}refs/stash@{2 minutes ago};格式遵循 -g 選項的規則。@ 符號之前的部分是命令列中給出的引用名稱(因此 git log -g refs/heads/master 將生成 refs/heads/master@{0})。

    %gd

    縮短的 reflog 選擇器;與 %gD 相同,但為了人類可讀性,引用名稱部分被縮短(因此 refs/heads/master 變為 master)。

    %gn

    reflog 身份名稱

    %gN

    reflog 身份名稱(遵循 .mailmap,參見 git-shortlog[1]git-blame[1]

    %ge

    reflog 身份電子郵件

    %gE

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

    %gs

    reflog 主題

    %(trailers[:<options>])

    顯示由 git-interpret-trailers[1] 解析的正文末尾部分(trailers)。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] 接受的值,例如 yesoff,都被接受。不帶 =<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

差異格式(DIFF FORMATTING)

以下選項可用於更改 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=<format>

指定用於合併提交的差異格式。預設是 `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> 行上下文(而不是通常的三行)的 diff。隱含 --patch

--output=<file>

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

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

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

--raw

對於每個提交,使用原始差異格式顯示更改摘要。請參閱 git-diff[1] 的“RAW OUTPUT FORMAT”部分。這與以原始格式顯示日誌本身不同,後者可以透過 --format=raw 實現。

--patch-with-raw

-p --raw 的同義詞。

-t

在差異輸出中顯示樹物件。

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

透過計算從原始檔刪除或新增到目標檔案的行數來計算目錄統計數字。這忽略了檔案中純程式碼移動的數量。換句話說,重新排列檔案中的行與其它更改的計數不同。這是未給出引數時的預設行為。

lines

透過執行常規的基於行的差異分析並彙總刪除/新增的行數來計算 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

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

--color[=<when>]

顯示彩色差異。--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

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

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

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

--[no-]rename-empty

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

--check

如果更改引入了衝突標記或空白錯誤,則發出警告。空白錯誤的定義由 core.whitespace 配置控制。預設情況下,尾隨空白(包括僅包含空白的行)和行初始縮排中緊跟製表符的空格字元被視為空白錯誤。如果發現問題,則以非零狀態退出。與 --exit-code 不相容。

--ws-error-highlight=<kind>

在差異的 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>]]

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

它影響檔案完全重寫的更改的顯示方式,不是作為一系列刪除和插入與極少量文字匹配的上下文混合在一起,而是作為對所有舊內容的單個刪除,然後對所有新內容的單個插入,數字 *<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 會排除已新增和已刪除的路徑。

請注意,並非所有 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>之前的檔案(即跳到),或將其移到輸出的末尾(即旋轉到)。這些選項主要為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]中的“Defining a custom hunk-header”)。

--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.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恢復。這兩個選項都是實驗性的,將來可能會被移除。

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

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

任何生成差異的命令都可以帶-c--cc選項來在顯示合併時生成合併差異。這是用git-diff[1]git-show[1]顯示合併時的預設格式。另請注意,您可以為這些命令中的任何一個提供合適的--diff-merges選項,以強制生成特定格式的差異。

“組合 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>的差異,並且不用於合併差異格式。

  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。合併差異格式是為了審查合併提交更改而建立的,並非用於應用。該更改類似於擴充套件索引頭部中的更改

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

    組合 diff 格式的塊頭中有(父級數量 + 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

顯示檔案Documentation/README在分支next倒數第10次提交時的內容。

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