English ▾ 主題 ▾ 最新版本 ▾ git-rev-list 最後更新於 2.55.0

名稱

git-rev-list - 以時間倒序排列提交物件

概要

git rev-list [<options>] <commit>…​ [--] [<path>…​]

描述

列出可以從給定提交(commit)透過 parent 連結追蹤到的提交,但排除那些從前面帶有 ^ 符號的提交所能追蹤到的提交。預設情況下,輸出會以時間倒序排列。

您可以將其視為一種集合運算。從命令列中給定的任何提交所能到達的提交構成一個集合,然後將從任何前面帶有 ^ 符號的提交所能到達的提交從該集合中減去。剩餘的提交即為該指令的輸出。也可以使用其他多種選項和路徑參數來進一步限制結果。

因此,以下指令

$ git rev-list foo bar ^baz

意思是「列出所有可以從 foobar 到達,但不能從 baz 到達的提交」。

一種特殊的記法 "<commit1>..<commit2>" 可以作為 "^<commit1> <commit2>" 的速記。例如,以下兩者可以互換使用

$ git rev-list origin..HEAD
$ git rev-list HEAD ^origin

另一種特殊的記法是 "<commit1>...<commit2>",這對於合併(merges)非常有用。產生的提交集合是兩個運算元之間的對稱差集。以下兩個指令是等效的

$ git rev-list A B --not $(git merge-base --all A B)
$ git rev-list A...B

rev-list 是 Git 的核心指令,因为它提供了構建和遍歷提交祖先圖的能力。因此,它具有許多不同的選項,使其能夠被 git bisectgit repack 等不同的指令所使用。

選項

提交限制

除了使用說明中所述的特殊標記來指定應列出的提交範圍外,還可以套用額外的提交限制。

除非另有說明,否則使用更多選項通常會進一步限制輸出(例如 --since=<日期1> 限制為比 <日期1> 更新的提交,而將其與 --grep=<模式> 配合使用則進一步限制為日誌訊息中有符合 <模式> 之行的提交)。

請注意,這些會在提交排序和格式化選項(例如 --reverse)之前套用。

-<number>
-n <number>
--max-count=<number>

將輸出限制為應顯示的前 <number> 個提交。

--max-count-oldest=<number>

將輸出限制為應顯示的最後 <number> 個提交。

--skip=<number>

在開始顯示提交輸出之前跳過 <數量> 個提交。

--since=<date>
--after=<date>

顯示比 <date> 更新的提交。作為特殊情況,today 指的是上一個午夜。

--since-as-filter=<date>

顯示所有比 <日期> 更新的提交。這會訪問範圍內的所有提交,而不是在遇到第一個早於 <日期> 的提交時停止。

--until=<date>
--before=<date>

顯示比 <日期> 更舊的提交。

--max-age=<timestamp>
--min-age=<timestamp>

將輸出提交限制在指定的日期範圍內。

--author=<pattern>
--committer=<pattern>

將提交輸出限制為作者/提交者欄位符合 <模式> 正規表示式的提交。如果有多個 --author=<模式>,則會選擇作者符合任何一個 <模式> 的提交(多個 --committer=<模式> 亦然)。

--grep-reflog=<pattern>

將提交輸出限制為參照日誌 (reflog) 分錄符合 <模式> 正規表示式的提交。如果有多個 --grep-reflog,則會選擇其參照日誌訊息符合任何給定模式的提交。除非使用了 --walk-reflogs,否則使用此選項會發生錯誤。

--grep=<pattern>

將提交輸出限制為日誌訊息符合 <模式> 正規表示式的提交。如果有多個 --grep=<模式>,則會選擇訊息符合任何一個 <模式> 的提交(但請參閱 --all-match)。

--all-match

將提交輸出限制為符合所有給定 --grep 的提交,而不是符合至少一個的提交。

--invert-grep

將提交輸出限制為日誌訊息不符合 --grep=<模式> 指定之 <模式> 的提交。

-i
--regexp-ignore-case

在比對正規表示式限制模式時不區分大小寫。

--basic-regexp

將限制模式視為基本正規表示式 (BRE);這是預設值。

-E
--extended-regexp

將限制模式視為擴展正規表示式 (ERE),而不是預設的基本正規表示式。

-F
--fixed-strings

將限制模式視為固定字串(不將模式解釋為正規表示式)。

-P
--perl-regexp

將限制模式視為 Perl 相容的正規表示式 (PCRE)。

對這些類型的正規表示式的支援是可選的編譯時依賴項。如果 Git 在編譯時未包含對其支援,提供此選項將導致程式終止。

--remove-empty

當給定路徑從樹中消失時停止。

--merges

僅列印合併提交。這與 --min-parents=2 完全相同。

--no-merges

不要列印具有多個父提交的提交。這與 --max-parents=1 完全相同。

--min-parents=<number>
--max-parents=<number>
--no-min-parents
--no-max-parents

僅顯示具有至少(或最多)多個父提交的提交。具體來說,--max-parents=1 等同於 --no-merges--min-parents=2 等同於 --merges--max-parents=0 會給出所有根提交,而 --min-parents=3 則給出所有章魚合併 (octopus merges)。

--no-min-parents--no-max-parents 會再次重設這些限制(設為無限制)。等效形式為 --min-parents=0(任何提交都有 0 個或多個父提交)和 --max-parents=-1(負數表示無上限)。

--first-parent

在尋找要包含的提交時,遇到合併提交僅跟隨第一個父提交。在查看特定主題分支的演變時,此選項可以提供更好的概覽,因為合併到主題分支通常只是為了不時調整以適應更新的上游,而此選項允許您忽略此類合併引入到您的歷史記錄中的個別提交。

--exclude-first-parent-only

在尋找要排除的提交時(使用 ^),在遇到合併提交時僅跟隨第一個父提交。這可以用於查找主題分支中從其偏離遠端分支之點開始的變更集,前提是任意合併都可以是有效的主題分支變更。

--maximal-only

將輸出提交限制為無法從修訂版本範圍內任何其他提交可達的那些提交。

--not

反轉所有後續修訂版本指定符的 ^ 前綴(或缺少前綴)的含義,直到下一個 --not。當在命令列中的 --stdin 之前使用時,通過 stdin 傳遞的修訂版本將不受其影響。反之,當通過標準輸入傳遞時,在命令列中傳遞的修訂版本將不受其影響。

--all

假裝命令列中列出了 refs/ 中的所有參照以及 HEAD 作為 <提交>

--branches[=<pattern>]

假裝命令列中列出了 refs/heads 中的所有參照作為 <提交>。如果給定了 <模式>,則將分支限制為符合給定 shell 全域比對模式 (glob) 的分支。如果模式中缺少 ?*[,則隱含結尾處為 /*

--tags[=<pattern>]

假裝命令列中列出了 refs/tags 中的所有參照作為 <提交>。如果給定了 <模式>,則將標籤限制為符合給定 shell 全域比對模式的標籤。如果模式中缺少 ?*[,則隱含結尾處為 /*

--remotes[=<pattern>]

假裝命令列中列出了 refs/remotes 中的所有參照作為 <提交>。如果給定了 <模式>,則將遠端追蹤分支限制為符合給定 shell 全域比對模式的分支。如果模式中缺少 ?*[,則隱含結尾處為 /*

--glob=<glob-pattern>

假裝命令列中列出了所有符合 shell 全域比對模式 <全域比對模式> 的參照作為 <提交>。如果缺少領頭的 refs/,會自動補上。如果模式中缺少 ?*[,則隱含結尾處為 /*

--exclude=<glob-pattern>

不要包含符合 <全域比對模式> 的參照,否則下一個 --all--branches--tags--remotes--glob 會考慮這些參照。重複此選項會累積排除模式,直到遇到下一個 --all--branches--tags--remotes--glob 選項為止(其他選項或引數不會清除累積的模式)。

當套用於 --branches--tags--remotes 時,給定的模式不應分別以 refs/headsrefs/tagsrefs/remotes 開頭;當套用於 --glob--all 時,它們必須以 refs/ 開頭。如果需要結尾的 /*,必須明確給出。

--exclude-hidden=(fetch|receive|uploadpack)

參考對應的 fetch.hideRefsreceive.hideRefsuploadpack.hideRefs 設定以及 transfer.hideRefs,不要包含會被 git-fetchgit-receive-packgit-upload-pack 隱藏的參照(請參閱 git-config[1])。此選項會影響下一個虛擬參照選項 --all--glob,並在處理後清除。

--reflog

假裝參照日誌 (reflog) 提到的所有物件都作為 <提交> 列在命令列中。

--alternate-refs

假裝備份儲存庫(alternate repositories)的參照頂端提到的所有物件都列在命令列中。備份儲存庫是指在 objects/info/alternates 中指定其物件目錄的任何儲存庫。包含的物件集可以由 core.alternateRefsCommand 等修改。請參閱 git-config[1]

--single-worktree

預設情況下,當存在多個工作樹時,下列選項會檢查所有工作樹(請參閱 git-worktree[1]):--all--reflog--indexed-objects。此選項強制它們僅檢查目前工作樹。

--ignore-missing

在輸入中看到無效的物件名稱時,假裝沒有給出該錯誤輸入。

--stdin

除了從命令列獲取引數外,也從標準輸入讀取引數。這接受提交和類似 --all--glob= 的虛擬選項。當看到 -- 分隔符時,後續輸入將被視為路徑並用於限制結果。通過標準輸入讀取的標記(如 --not)僅對以相同方式傳遞的引數有效,不會影響任何後續的命令列引數。

--quiet

不要將任何內容列印到標準輸出。此模式主要是為了讓呼叫者測試退出狀態,以查看物件範圍是否完全連接(或不連接)。由於無需格式化輸出,這比將 stdout重新導向到 /dev/null 更快。

--disk-usage
--disk-usage=human

抑制常規輸出;改為列印所選提交或物件在磁碟上儲存所佔用的位元組總和。這等同於將輸出導向至 git cat-file --batch-check='%(objectsize:disk),但執行速度快得多(特別是與 --use-bitmap-index 一起使用時)。有關「磁碟儲存」含義的限制,請參閱 git-cat-file[1] 中的 CAVEATS 章節。使用選用值 human 時,磁碟儲存大小將以人類可讀的字串顯示(例如 12.24 Kib, 3.50 Mib)。

--cherry-mark

類似於 --cherry-pick(見下文),但用 = 標記等效的提交而不是省略它們,並用 + 標記不等效的提交。

--cherry-pick

當提交集以對稱差(symmetric difference)受限時,省略任何引入與“另一側”另一個提交相同變更的提交。

例如,如果您有兩個分支 AB,列出僅在其中一側的所有提交的常用方法是使用 --left-right(參見下面 --left-right 選項說明中的範例)。但是,它會顯示從另一個分支揀選 (cherry-picked) 過來的提交(例如,“3rd on b”可能是從分支 A 揀選的)。使用此選項,此類提交對將從輸出中排除。

--left-only
--right-only

僅列出對稱差中相應一側的提交,即僅列出會被 --left-right 標記為 <> 的提交。

例如,--cherry-pick --right-only A...B 會省略 B 中位於 A 中或與 A 中的提交補丁等效的提交。換句話說,這列出了來自 git cherry A B+ 提交。更準確地說,--cherry-pick --right-only --no-merges 給出了確切的列表。

--cherry

--right-only --cherry-mark --no-merges 的同義詞;對於將輸出限制在我們這一側的提交,並用 git log --cherry upstream...mybranch(類似於 git cherry upstream mybranch)標記那些已套用到分叉歷史另一側的提交非常有用。

-g
--walk-reflogs

遍歷參照日誌分錄(從最新到最舊),而不是遍歷提交祖先鏈。使用此選項時,您不能指定要排除的提交(即不能使用 ^<提交><提交1>..<提交2><提交1>...<提交2> 記法)。

--pretty 格式不是 onelinereference 時(原因顯而易見),這會導致輸出中包含兩行額外的從參照日誌中獲取的資訊。輸出中的參照日誌指定符可以顯示為 ref@{<第N個>}(其中 <第N個> 是參照日誌中反向時間順序的索引)或 ref@{<時間戳記>}(帶有該分錄的 <時間戳記>),具體取決於一些規則:

  1. 如果起始點被指定為 ref@{<第N個>},則顯示索引格式。

  2. 如果起始點被指定為 ref@{now},則顯示時間戳記格式。

  3. 如果兩者都沒使用,但在命令列上給出了 --date,則以 --date 要求的格式顯示時間戳記。

  4. 否則,顯示索引格式。

--pretty=oneline 下,提交訊息在同一行會加上此資訊的前綴。此選項不能與 --reverse 結合使用。另請參閱 git-reflog[1]

--pretty=reference 下,根本不會顯示此資訊。

--merge

顯示範圍 HEAD...<other> 內涉及衝突路徑的提交,其中 <other>MERGE_HEADCHERRY_PICK_HEADREVERT_HEADREBASE_HEAD 中第一個存在的虛擬參照。僅在索引具有未合併分錄時才有效。此選項可用於在解決三方合併衝突時顯示相關提交。

--boundary

輸出排除的邊界提交。邊界提交以前綴 - 標示。

--use-bitmap-index

嘗試使用打包點陣圖索引(若可用)加速遍歷。請注意,使用 --objects 遍歷時,樹狀物件和二進位大物件(blob)將不會列印其相關路徑。

--progress=<header>

當考慮物件時,在 stderr 上顯示進度報告。<header> 文字將隨著每個進度更新一起列印。

-z

每個輸出的物件及其附帶的元資料不再使用換行符分隔,而是使用 NUL 位元組分隔。輸出格式如下

<OID> NUL [<token>=<value> NUL]...

額外的物件元資料(例如物件路徑或邊界物件)使用 <token>=<value> 格式列印。Token 值按原樣列印,無需任何編碼/截斷。OID 條目從不包含 = 字元,因此用於標示新物件記錄的開始。範例

<OID> NUL
<OID> NUL path=<path> NUL
<OID> NUL boundary=yes NUL
<OID> NUL missing=yes NUL [<token>=<value> NUL]...

此模式僅與 --objects--boundary--missing 輸出選項相容。

歷史簡化

有時您只對歷史的一部分感興趣,例如修改特定 <路徑> 的提交。但是 歷史簡化 有兩個部分,一部分是選擇提交,另一部分是如何執行,因為有各種策略可以簡化歷史。

以下選項選擇要顯示的提交:

<paths>

選擇修改給定 <路徑> 的提交。

--simplify-by-decoration

選擇被某些分支或標籤參照的提交。

請注意,可以顯示額外的提交以提供有意義的歷史。

以下選項影響執行簡化的方式:

Default mode

將歷史簡化為解釋樹的最終狀態的最簡歷史。最簡是因為如果最終結果相同(即合併內容相同的分支),它會剪除一些側邊分支。

--show-pulls

包含預設模式下的所有提交,但也包含任何與第一個父提交不 TREESAME 但與後面的父提交 TREESAME 的合併提交。此模式有助於顯示 "首次引入" 變更至分支的合併提交。

--full-history

與預設模式相同,但不剪除某些歷史。

--dense

僅顯示選定的提交,加上一些為了構成有意義歷史的提交。

--sparse

顯示簡化歷史中的所有提交。

--simplify-merges

--full-history 的附加選項,用於從結果歷史中刪除一些不必要的合併,因為沒有選定的提交對此合併有貢獻。

--ancestry-path[=<commit>]

當給定要顯示的提交範圍(例如 <提交1>..<提交2><提交2> ^<提交1>)以及該範圍內的一個提交 <提交> 時,僅顯示該範圍內是 <提交> 的祖先、<提交> 的後代或 <提交> 本身的提交。如果未指定提交,則使用 <提交1>(範圍中排除的部分)作為 <提交>。可以多次傳遞;如果多次傳遞,則提交若為給定的任何提交或其祖先或後代,則會被包含在內。

更詳細的解釋如下。

假設您指定 foo<路徑>。我們將修改 foo 的提交稱為 !TREESAME,其餘的稱為 TREESAME。(在為 foo 過濾的 diff 中,它們分別看起來不同和相同。)

在下文中,我們將始終引用同一個範例歷史來說明簡化設定之間的差異。我們假設您正在過濾此提交圖中的檔案 foo

	  .-A---M---N---O---P---Q
	 /     /   /   /   /   /
	I     B   C   D   E   Y
	 \   /   /   /   /   /
	  `-------------'   X

歷史水平線 A---Q 被視為每個合併的第一個父提交。提交如下:

  • I 是初始提交,其中 foo 存在且內容為 asdf,並且檔案 quux 存在且內容為 quux。初始提交與空樹進行比較,因此 I 是 !TREESAME。

  • A 中,foo 僅包含 foo

  • B 包含與 A 相同的變更。其合併 M 是微不足道的,因此與所有父提交都是 TREESAME。

  • C 沒有更改 foo,但其合併 N 將其更改為 foobar,因此它與任何父提交都不是 TREESAME。

  • Dfoo 設為 baz。其合併 O 將來自 ND 的字串組合為 foobarbaz;即它與任何父提交都不是 TREESAME。

  • Equux 更改為 xyzzy,其合併 P 將字串組合為 quux xyzzyPO 是 TREESAME,但與 E 不是。

  • X 是一個獨立的根提交,添加了一個新檔案 side,而 Y 修改了它。 YX 是 TREESAME。其合併 Qside 添加到 P,且 QP 是 TREESAME,但與 Y 不是。

rev-list 在歷史中向後遍歷,根據是否使用 --full-history 和/或父提交重寫(透過 --parents--children)來包含或排除提交。提供以下設定。

預設模式

如果提交與任何父提交都不是 TREESAME,則包含這些提交(儘管這可以更改,請參見下面的 --sparse)。如果提交是合併提交,且與一個父提交是 TREESAME,則僅跟隨該父提交。(即使有多個 TREESAME 父提交,也僅跟隨其中一個。)否則,跟隨所有父提交。

這導致:

	  .-A---N---O
	 /     /   /
	I---------D

請注意,僅跟隨 TREESAME 父提交(如果有)的規則如何將 B 完全排除在考慮範圍之外。 C 透過 N 被考慮,但是 TREESAME。根提交與空樹進行比較,因此 I 是 !TREESAME。

父/子關係僅在使用 --parents 時可見,但這不會影響預設模式下選擇的提交,因此我們顯示了父線。

--full-history 不進行父系重寫

此模式與預設模式在一點上不同:始終跟隨合併的所有父提交,即使它與其中一個父提交是 TREESAME。即使合併的多個方面都有被包含的提交,這並不意味著合併本身也被包含!在範例中,我們得到:

	I  A  B  N  D  O  P  Q

M 被排除,因為它與兩個父提交都是 TREESAME。 ECB 都被遍歷了,但只有 B 是 !TREESAME,所以其他的不會出現。

請注意,在沒有父提交重寫的情況下,實際上無法談論提交之間的父/子關係,因此我們將它們顯示為斷開的。

--full-history 進行父系重寫

普通提交僅在它們是 !TREESAME 時才被包含(儘管這可以更改,請參閱下面的 --sparse)。

合併提交始終包含在內。但是,它們的父列表會被重寫:沿著每個父提交,剪掉本身不被包含的提交。這導致:

	  .-A---M---N---O---P---Q
	 /     /   /   /   /
	I     B   /   D   /
	 \   /   /   /   /
	  `-------------'

與上面不帶重寫的 --full-history 進行比較。請注意,E 被剪掉了,因為它是 TREESAME,但 P 的父列表被重寫為包含 E 的父提交 ICN,以及 XYQ 也發生了同樣的情況。

除了上述設定外,您還可以更改 TREESAME 是否影響包含:

--dense

被遍歷的提交如果與任何父提交都不是 TREESAME,則會被包含。

--sparse

所有被遍歷的提交都會被包含。

請注意,在沒有 --full-history 的情況下,這仍然會簡化合併:如果父提交之一是 TREESAME,我們僅跟隨該提交,因此合併的其他方面永遠不會被遍歷。

--simplify-merges

首先,以與包含父提交重寫的 --full-history 相同的方式構建歷史圖(見上文)。

然後根據以下規則將每個提交 C 簡化為其在最終歷史中的替代項 C'

  • C' 設為 C

  • C' 的每個父提交 P 替換為其簡化後的 P'。在此過程中,丟棄作為其他父提交祖先的父提交,或與空樹 TREESAME 的根提交,並刪除重複項,但注意永遠不要丟棄我們與之為 TREESAME 的所有父提交。

  • 如果在重寫父提交之後,C' 是根提交或合併提交(具有零個或 >1 個父提交)、邊界提交或 !TREESAME,則保留它。否則,它將被其唯一的父提交替換。

透過與包含父提交重寫的 --full-history 進行比較,可以最好地顯示其效果。範例變為:

	  .-A---M---N---O
	 /     /       /
	I     B       D
	 \   /       /
	  `---------'

請注意與 --full-history 相比,NPQ 的主要差異:

  • N 的父列表移除了 I,因為它是另一個父提交 M 的祖先。儘管如此,N 仍然保留,因為它是 !TREESAME。

  • P 的父列表同樣移除了 IP 隨後被完全移除,因為它有一個父提交且是 TREESAME。

  • Q 的父列表將 Y 簡化為 X。然後移除了 X,因為它是 TREESAME 根提交。隨後 Q 被完全移除,因為它有一個父提交且是 TREESAME。

還有一種簡化模式可用:

--ancestry-path[=<commit>]

將顯示的提交限制為那些是 <提交> 的祖先、後代或 <提交> 本身的提交。

作為範例用例,請考慮以下提交歷史:

	    D---E-------F
	   /     \       \
	  B---C---G---H---I---J
	 /                     \
	A-------K---------------L--M

常規的 D..M 計算作為 M 祖先但排除作為 D 祖先的提交集。這對於查看自 D 以來通往 M 的歷史發生了什麼非常有用,從某種意義上說,“M 擁有什麼是 D 中不存在的”。在此範例中,結果將是所有提交,除了 AB(當然,還有 D 本身)。

然而,當我們想找出 M 中哪些提交被 D 引入的臭蟲 (bug) 污染並需要修復時,我們可能只想查看 D..M 中實際上是 D 的後代的子集,即排除 CK。這正是 --ancestry-path 選項的作用。套用於 D..M 範圍,結果為:

		E-------F
		 \       \
		  G---H---I---J
			       \
				L--M

我們也可以使用 --ancestry-path=D 而不是 --ancestry-path,這在套用於 D..M 範圍時含義相同,但更明確。

如果我們對此範圍內的給定主題以及受該主題影響的所有提交感興趣,我們可能只想查看在其祖先路徑中包含該主題的 D..M 子集。因此,例如使用 --ancestry-path=H D..M 將導致:

		E
		 \
	      C---G---H---I---J
			       \
				L--M

--ancestry-path=K D..M 將導致:

		K---------------L--M

在討論另一個選項 --show-pulls 之前,我們需要建立一個新的範例歷史。

用戶在查看簡化歷史時經常遇到的一個問題是,他們知道更改了檔案的某個提交不知為何沒有出現在檔案的簡化歷史中。讓我們演示一個新的範例,並展示 --full-history--simplify-merges 等選項在這種情況下是如何運作的:

	  .-A---M-----C--N---O---P
	 /     / \  \  \/   /   /
	I     B   \  R-'`-Z'   /
	 \   /     \/         /
	  \ /      /\        /
	   `---X--'  `---Y--'

以此範例為例,假設 I 建立了 file.txt,該檔案隨後被 ABX 以不同方式修改。單一父系的提交 CZY 沒有變更 file.txt。合併提交 M 是透過解決合併衝突,納入 AB 的變更所建立的,因此它與兩者皆非 TREESAME。然而,合併提交 R 是透過忽略 Mfile.txt 的內容,僅採用 Xfile.txt 的內容所建立的。因此,RX 為 TREESAME,但與 M 不是。最後,建立 N 的自然合併解析是採用 Rfile.txt 的內容,因此 NR 為 TREESAME,但與 C 不是。合併提交 OP 與其第一父系為 TREESAME,但分別與其第二父系 ZY 並非 TREESAME。

使用預設模式時,NR 都有一個 TREESAME 父提交,因此遍歷這些邊而忽略其他邊。產生的歷史圖為:

	I---X

使用 --full-history 時,Git 遍歷每一條邊。這將發現提交 AB 以及合併 M,但也會揭示合併提交 OP。使用父提交重寫後,產生的圖為:

	  .-A---M--------N---O---P
	 /     / \  \  \/   /   /
	I     B   \  R-'`--'   /
	 \   /     \/         /
	  \ /      /\        /
	   `---X--'  `------'

這裡,合併提交 OP 貢獻了額外的噪音,因為它們實際上並沒有對 file.txt 貢獻變更。它們只是合併了一個基於較舊版本 file.txt 的主題。這是在使用許多貢獻者並行工作並沿單一主幹合併其主題分支的工作流程的儲存庫中常見的問題:許多不相關的合併會出現在 --full-history 結果中。

當使用 --simplify-merges 選項時,提交 OP 會從結果中消失。這是因為 OP 重寫後的第二父提交可從其第一父提交到達。這些邊被移除,然後提交看起來就像是與其父提交 TREESAME 的單父提交。提交 N 也發生了這種情況,產生的歷史視圖如下:

	  .-A---M--.
	 /     /    \
	I     B      R
	 \   /      /
	  \ /      /
	   `---X--'

在此視圖中,我們看到了來自 ABX 的所有重要單父提交變更。我們還看到了精心解決的合併 M 和不太精心解決的合併 R。這通常足以確定為什麼提交 AB 從預設視圖的歷史中 “消失” 了。但是,這種方法存在一些問題。

第一個問題是效能。與之前的任何選項不同,--simplify-merges 選項需要在返回單個結果之前遍歷整個提交歷史。這可能會使該選項難以用於非常大的儲存庫。

第二個問題是稽核。當許多貢獻者在同一個儲存庫上工作時,哪一個合併提交將變更引入到重要分支是很重要的。上面的問題合併 R 不太可能是用於合併到重要分支的合併提交。相反,合併 N 用於將 RX 合併到重要分支。此提交的提交訊息中可能包含有關變更 X 為何覆蓋來自 AB 的變更的資訊。

--show-pulls

除了預設歷史中顯示的提交外,還顯示每個與其第一父提交不是 TREESAME 但與後面父提交是 TREESAME 的合併提交。

當合併提交被 --show-pulls 包含時,該合併被視為從另一個分支 "拉取" (pulled) 了變更。在此範例中使用 --show-pulls(且不使用其他選項)時,產生的圖為:

	I---X---R---N

這裡包含合併提交 RN 是因為它們分別將提交 XR 拉取到了基礎分支。這些合併是提交 AB 不出現在預設歷史中的原因。

--show-pulls--simplify-merges 搭配使用時,該圖表包含所有必要的資訊:

	  .-A---M--.   N
	 /     /    \ /
	I     B      R
	 \   /      /
	  \ /      /
	   `---X--'

請注意,由於 M 可從 R 到達,因此從 NM 的邊被簡化掉了。然而,N 仍然作為一個重要的提交出現在歷史中,因為它將變更 R "拉取" 到了主分支。

--simplify-by-decoration 選項允許您僅查看歷史拓撲的大局,它會忽略未被標籤參照的提交。如果 (1) 提交被標籤參照,或 (2) 提交更改了命令列上給定路徑的內容,則提交將標記為 !TREESAME(換句話說,在上述歷史簡化規則後保留)。所有其他提交都標記為 TREESAME(可能會被簡化掉)。

二分搜尋輔助工具

--bisect

將輸出限制在包含與排除提交之間大致位於中間位置的一個提交物件。請注意,錯誤的二分參考 refs/bisect/bad 會被加入包含的提交(若存在),而良好的二分參考 refs/bisect/good-* 會被加入排除的提交(若存在)。因此,假設 refs/bisect/ 中沒有參考,如果

	$ git rev-list --bisect foo ^bar ^baz

輸出 midpoint,那麼這兩個指令的輸出

	$ git rev-list foo ^midpoint
	$ git rev-list midpoint ^bar ^baz

長度將大致相同。因此,尋找引入回歸(regression)的變更被簡化為二元搜尋:重複生成並測試新的「中點」,直到提交鏈的長度為 1。

--bisect-vars

這會計算與 --bisect 相同的結果,除了不使用 refs/bisect/ 中的參考,並且此輸出格式可供 shell 直接 eval。這些行會將中點修訂版本名稱指派給變數 bisect_rev,將 bisect_rev 測試後預期要測試的提交數量指派給 bisect_nr,若 bisect_rev 結果為好,預期要測試的提交數量指派給 bisect_good,若 bisect_rev 結果為壞,預期要測試的提交數量指派給 bisect_bad,並將目前我們正在二分搜尋的提交數量指派給 bisect_all

--bisect-all

這會輸出包含和排除提交之間的所有提交物件,並根據它們與包含和排除提交的距離進行排序。不使用 refs/bisect/ 中的參考。距離它們最遠的會優先顯示。(這是 --bisect 唯一顯示的一個。)

這很有用,因為當你想因故避免測試某些提交時(例如它們可能無法編譯),它可以輕鬆選擇要測試的良好提交。

此選項可以與 --bisect-vars 一起使用,在這種情況下,在所有排序後的提交物件之後,將會有與單獨使用 --bisect-vars 時相同的文字。

提交排序

預設情況下,提交會按反向時間順序顯示。

--date-order

在顯示所有子節點之前不顯示父節點,除此之外按提交時間戳記順序顯示提交。

--author-date-order

在顯示所有子節點之前不顯示父節點,除此之外按作者時間戳記順序顯示提交。

--topo-order

在顯示所有子節點之前不顯示父節點,並避免交替顯示多條歷史線上的提交。

例如,在如下的提交歷史中

    ---1----2----4----7
	\	       \
	 3----5----6----8---

其中數字表示提交時間戳記的順序,git rev-list 及其相關命令搭配 --date-order 會按時間戳記順序顯示提交:8 7 6 5 4 3 2 1。

搭配 --topo-order,它們會顯示 8 6 5 3 7 4 2 1(或 8 7 4 2 6 5 3 1);一些較舊的提交會比較新的提交先顯示,以避免交替顯示來自兩個平行開發軌跡的提交。

--reverse

以反向順序輸出選擇顯示的提交(參見上方的「提交限制」章節)。不能與 --walk-reflogs 結合使用。

物件遍歷

這些選項主要針對 Git 儲存庫的打包。

--objects

列印列出的提交所參考的任何物件的 ID。--objects foo ^bar 因此意指「如果我擁有提交物件 bar 但沒有 foo,請傳送給我我需要下載的所有物件 ID」。另請參閱下方的 --object-names

--in-commit-order

按提交順序列印樹狀物件和二進位物件 ID。樹狀物件和二進位物件 ID 會在首次被提交參考後列印。

--objects-edge

--objects 類似,但也會列印被排除提交的 ID,並以「-」字元作為前綴。這由 git-pack-objects[1] 用於構建「瘦(thin)」包,它基於這些被排除提交中包含的物件以差異形式記錄物件,從而減少網路流量。

--objects-edge-aggressive

--objects-edge 類似,但它會以增加時間為代價,更努力地尋找被排除的提交。這取代了 --objects-edge 用於為淺層儲存庫構建「瘦(thin)」包。

--indexed-objects

假裝索引使用的所有樹狀物件和二進位物件都列在命令列上。請注意,您可能也想使用 --objects

--unpacked

僅在與 --objects 一起使用時才有用;列印不在打包檔案中的物件 ID。

--object-names

僅在與 --objects 一起使用時才有用;列印找到的物件 ID 的名稱。這是預設行為。請注意,每個物件的「名稱」是模稜兩可的,主要旨在作為打包物件的提示。特別是:標籤、樹狀物件和二進位物件的名稱之間沒有區別;路徑名稱可能會被修改以刪除換行符;如果一個物件以不同名稱出現多次,則只會顯示一個名稱。

--no-object-names

僅在與 --objects 一起使用時才有用;不列印找到的物件 ID 的名稱。這會反轉 --object-names。此標記允許輸出更容易被諸如 git-cat-file[1] 等指令解析。

--filter=<filter-spec>

僅在與 --objects* 其中之一一起使用時才有用;從列印的物件清單中省略物件(通常是二進位物件)。<filter-spec> 可以是下列其中之一

--filter=blob:none 格式會省略所有二進位物件。

--filter=blob:limit=<n>[kmg] 格式會省略大小至少為 <n> 位元組或單位的二進位物件。<n> 可以為零。後綴 kmg 可用於命名 KiB、MiB 或 GiB 為單位的量。例如,blob:limit=1kblob:limit=1024 相同。

--filter=object:type=(tag|commit|tree|blob) 格式會省略所有非請求類型的物件。請注意,明確提供的物件會忽略過濾器並始終被列印,除非同時指定了 --filter-provided-objects

--filter=sparse:oid=<blob-ish> 格式使用包含在二進位物件(或二進位物件表達式)<blob-ish> 中的稀疏檢出(sparse-checkout)規範,以省略在所請求參考上進行稀疏檢出時不需要的二進位物件。

--filter=tree:<depth> 格式會省略所有距離根樹狀物件 >= <depth> 的二進位物件和樹狀物件(若物件位於遍歷提交的多個深度,則為最小深度)。<depth>=0 不會包含任何樹狀物件或二進位物件,除非在命令列(或使用 --stdin 時的標準輸入)中明確包含。<depth>=1 將僅包含直接由可從 <commit> 到達的提交或明確給定的物件所參考的樹狀物件和二進位物件。<depth>=2 類似於 <depth>=1,同時還包括距離明確給定的提交或樹狀物件再多一層的樹狀物件和二進位物件。

請注意,由於安全原因,想要從檔案系統中的任意路徑讀取的 --filter=sparse:path=<path> 格式已被移除。

可以指定多個 --filter= 標記來組合過濾器。僅包含被每個過濾器接受的物件。

--filter=combine:<filter1>+<filter2>+...<filterN> 格式也可以用於組合多個過濾器,但這比僅重複 --filter 標記更困難,通常沒有必要。過濾器由 + 連接,個別過濾器進行 %-encoded(即 URL 編碼)。除了 +% 字元外,以下字元也是保留的,也必須編碼:~!@#$^&*()[]{}\;",<>?'` 以及所有 ASCII 代碼 <= 0x20 的字元,這包括空格和換行符。

其他任意字元也可以編碼。例如,combine:tree:3+blob:nonecombine:tree%3A3+blob%3Anone 是等效的。

--no-filter

關閉任何先前的 --filter= 引數。

--filter-provided-objects

過濾明確提供的物件清單,否則這些物件即使不符合任何過濾器也始終會被列印。僅在與 --filter= 一起使用時才有用。

--filter-print-omitted

僅在與 --filter= 一起使用時才有用;列印被過濾器省略的物件清單。物件 ID 以「~」字元作為前綴。

--missing=<missing-action>

一個有助於未來「部分複製(partial clone)」開發的除錯選項。此選項指定如何處理缺失的物件。

--missing=error 格式要求如果遇到缺失的物件,rev-list 應以錯誤停止。這是預設動作。

--missing=allow-any 格式將允許在遇到缺失物件時繼續物件遍歷。缺失的物件將會悄悄地從結果中省略。

--missing=allow-promisor 格式類似於 allow-any,但僅允許針對預期的 promisor 缺失物件繼續物件遍歷。意外的缺失物件將會引發錯誤。

--missing=print 格式類似於 allow-any,但也會列印缺失物件的清單。物件 ID 以「?」字元作為前綴。

--missing=print-info 格式類似於 print,但也會列印關於從其包含物件推斷出的缺失物件的附加資訊。資訊全部列印在同一行,缺失物件 ID 格式為:?<oid> [<token>=<value>]...<token>=<value> 包含附加資訊的對之間由 SP 分隔。該值以 token 特定的方式進行編碼,但預期值中包含的 SPLF 都將以確保產生的編碼值不包含這兩個有問題位元組的方式表示。每個 <token>=<value> 可以是下列其中之一

  • path=<path> 顯示從包含物件推斷出的缺失物件的路徑。包含 SP 或特殊字元的路徑會根據需要以 C 風格的雙引號括起來。

  • type=<type> 顯示從包含物件推斷出的缺失物件的類型。

如果傳遞給遍歷的某些提示(tips)缺失,它們也將被視為缺失,遍歷將忽略它們。但如果我們無法取得它們的物件 ID,將會引發錯誤。

--exclude-promisor-objects

(僅限內部使用。)在 promisor 邊界進行物件遍歷預過濾。這與部分複製一起使用。這比 --missing=allow-promisor 更強大,因為它限制了遍歷,而不僅僅是忽略有關缺失物件的錯誤。

--no-walk[=(sorted|unsorted)]

僅顯示指定的提交,但不遍歷其祖先。如果指定了範圍,則此選項無效。如果指定了 unsorted 參數,則提交會按命令列中指定的順序顯示。否則(如果指定了 sorted 或未指定參數),提交會按提交時間的反向時間順序顯示。不能與 --graph 結合使用。

--do-walk

覆蓋之前的 --no-walk

提交格式化

使用這些選項,git-rev-list[1] 的行為將類似於更專業的提交日誌工具系列:git-log[1]git-show[1]git-whatchanged[1]

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

以指定格式美化列印提交日誌的內容,其中 <format> 可以是 onelineshortmediumfullfullerreferenceemailrawformat:<string>tformat:<string> 之一。當 <format> 不是上述任何一種,且其中包含 %<placeholder> 時,它的行為就像給定了 --pretty=tformat:<format> 一樣。

有關每種格式的一些額外詳細資訊,請參見 "PRETTY FORMATS" 部分。當省略 =<format> 部分時,它預設為 medium

注意
您可以在儲存庫組態中指定預設的美化格式(參見 git-config[1])。
--abbrev-commit

不顯示完整的 40 位元組十六進位提交物件名稱,而是顯示唯一命名物件的前綴。--abbrev=<n>(如果顯示,它也會修改差異輸出)選項可用於指定前綴的最小長度。

這應該會使 --pretty=oneline 對於使用 80 欄終端機的人來說更具可讀性。

--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 個空格的美化格式(即預設的 mediumfullfuller)中會擴展製表符。

--show-signature

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

--relative-date

--date=relative 的同義詞。

--date=<format>

僅對以人類可讀格式顯示的日期生效,例如使用 --pretty 時。log.date 配置變數為 log 指令的 --date 選項設定了預設值。預設情況下,日期以原始時區(提交者或作者的時區)顯示。如果將 -local 附加到格式(例如 iso-local),則改為使用使用者的本地時區。

--date=relative 顯示相對於當前時間的日期,例如「2 小時前」。-local 選項對 --date=relative 無效。

--date=local--date=default-local 的別名。

--date=iso(或 --date=iso8601)以 ISO 8601 類似格式顯示時間戳記。與嚴格 ISO 8601 格式的差異為

  • 日期/時間分隔符號使用空格而不是 T

  • 時間和時區之間使用空格

  • 時區的小時和分鐘之間沒有冒號

--date=iso-strict(或 --date=iso8601-strict)以嚴格的 ISO 8601 格式顯示時間戳記。

--date=rfc(或 --date=rfc2822)以電子郵件中常見的 RFC 2822 格式顯示時間戳記。

--date=short 僅顯示日期而不顯示時間,格式為 YYYY-MM-DD

--date=raw 顯示自紀元(1970-01-01 00:00:00 UTC)以來的秒數,後跟一個空格,然後是作為 UTC 偏移量的時區(一個 +- 後跟四位數字;前兩位為小時,後兩位為分鐘)。即,如同時間戳記是用 strftime("%s %z") 格式化一樣。請注意,-local 選項不會影響自紀元以來的秒數值(始終以 UTC 為單位測量),但會切換隨附的時區值。

--date=human 若時區與當前時區不符,則顯示時區;若與當前時間匹配,則不列印完整日期(例如「今年」的日期跳過年份列印,若在最近幾天內且只需說明是星期幾,則甚至跳過整個日期)。對於更早的日期,小時和分鐘也會被省略。

--date=unix 將日期顯示為 Unix 紀元時間戳記(自 1970 年以來的秒數)。與 --raw 一樣,這始終採用 UTC,因此 -local 無效。

--date=format:<format><format> 輸入到系統的 strftime,但 %s%z%Z 除外,它們在內部處理。使用 --date=format:%c 以系統區域設定的首選格式顯示日期。有關格式佔位符的完整清單,請參閱 strftime(3) 手冊。使用 -local 時,正確的語法為 --date=format-local:<format>

--date=default 是預設格式,基於 ctime(3) 輸出。它顯示單行,包含三個字母的星期幾、三個字母的月份、月份中的日期、「HH:MM:SS」格式的小時-分鐘-秒,後跟 4 位年份,加上時區資訊(除非使用本地時區),例如 Thu Jan 1 00:00:00 1970 +0000

--header

以原始格式列印提交內容;每條記錄以 NUL 字元分隔。

--no-commit-header

抑制在指定格式之前列印包含「commit」和物件 ID 的標頭行。這對內建格式無效;僅影響自訂格式。

--commit-header

覆寫先前的 --no-commit-header

--parents

同時列印提交的父系(格式為「commit parent…」)。也會啟用父系重寫,請參閱上方的「歷史簡化」。

--children

同時列印提交的子系(格式為「commit child…」)。也會啟用父系重寫,請參閱上方的「歷史簡化」。

--timestamp

列印原始提交時間戳記。

--left-right

標記提交是從對稱差集的哪一側可到達。左側的提交以 < 為前綴,右側的以 > 為前綴。如果與 --boundary 結合使用,這些提交將以 - 為前綴。

例如,如果你有這樣的拓撲

	     y---b---b  branch B
	    / \ /
	   /   .
	  /   / \
	 o---x---a---a  branch A

你會得到這樣的輸出

	$ git rev-list --left-right --boundary --pretty=oneline A...B

	>bbbbbbb... 3rd on b
	>bbbbbbb... 2nd on b
	<aaaaaaa... 3rd on a
	<aaaaaaa... 2nd on a
	-yyyyyyy... 1st on b
	-xxxxxxx... 1st on a
--graph

在輸出的左側繪製提交歷史的基於文字的圖形表示。為了正確繪製圖形歷史,這可能會導致在提交之間列印額外的行。不能與 --no-walk 結合使用。

這會啟用父系重寫,請參閱上方的「歷史簡化」。

預設情況下,這意味著啟用 --topo-order 選項,但也可以指定 --date-order 選項。

--show-linear-break[=<barrier>]

當不使用 --graph 時,所有歷史分支都會被扁平化,這可能使人難以看出兩個連續的提交不屬於線性分支。在此情況下,此選項會在它們之間放置一個屏障。如果指定了 <barrier>,則它是將顯示而不是預設字串的字串。

--graph-lane-limit=<n>

當使用 --graph 時,限制顯示的圖形通道(lanes)數量。超過限制的通道會被截斷標記 ~ 取代。預設值為 0(無限制),零和負值將被忽略並視為無限制。

--count

列印一個數字,說明本應列出多少個提交,並抑制所有其他輸出。當與 --left-right 一起使用時,改為列印左側和右側提交的計數,並以製表符分隔。當與 --cherry-mark 一起使用時,從這些計數中省略補丁等效的提交,並列印等效提交的計數,以製表符分隔。

漂亮格式 (PRETTY FORMATS)

如果該提交是一個合併,且 pretty-format 不是 onelineemailraw,則會在 Author: 行之前插入額外的一行。此行以 "Merge: " 開頭,並列出祖先提交的雜湊值,以空格分隔。請注意,如果您限制了歷史視圖,則列出的提交不一定是「直接」父提交清單:例如,如果您只感興趣於與特定目錄或文件相關的變更。

有幾種內建格式,您可以透過將 pretty.<名稱> 配置選項設定為另一個格式名稱或 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)」資訊顯示真實的父提交,不考慮嫁接 (grafts) 或歷史簡化。請注意,此格式會影響提交的顯示方式,但不會影響差異 (diff) 的顯示方式(例如使用 git log --raw)。若要在原始差異格式中獲取完整物件名稱,請使用 --no-abbrev

format:<format-string>

format:<格式字串> 格式允許您指定想要顯示的資訊。它的工作方式有點像 printf 格式,但顯著的例外是您使用 %n 而不是 \n 來換行。

例如,format:"The author of %h was %an, %ar%nThe title was >>%s<<%n" 將顯示如下內容:

The author of fe6e0ee was Junio C Hamano, 23 hours ago
The title was >>t4119: test autocomputing -p<n> for traditional diff input.<<

佔位符如下:

  • 擴展為單個字面字元的佔位符:

    %n

    換行

    %%

    原始的 %

    %x00

    %x 後跟兩個十六進位數字將被替換為具有該十六進位值的位元組(我們在本文檔的其餘部分將此稱為「字面格式化代碼」)。

  • 影響後續佔位符格式的佔位符:

    %Cred

    切換顏色為紅色

    %Cgreen

    切換顏色為綠色

    %Cblue

    切換顏色為藍色

    %Creset

    重設顏色

    %C(<spec>)

    顏色規範,如 git-config[1] 的「設定檔」章節中的 Values 下所述。預設情況下,僅在為日誌輸出啟用顏色時才會顯示顏色(透過 color.diffcolor.ui--color,並在前往終端時尊重前者的 auto 設定)。%C(auto,<spec>) 被接受作為預設值的歷史同義詞(例如 %C(auto,red))。指定 %C(always,<spec>) 將即使在未啟用顏色時也會顯示顏色(儘管考慮直接使用 --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:表情符號 (Emoji) 和其他寬字元將佔據兩個顯示欄位,這可能會超出欄位邊界。注意 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

    沒有 " (", ")" 包裝的參照名稱。

    %(count)

    補丁系列中補丁的編號。僅用於 format-patch 中的 --commit-list-format

    %(total)

    補丁系列中補丁的總數。僅用於 format-patch 中的 --commit-list-format

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

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

    prefix=<value>

    顯示在參照名稱列表之前。預設為 " ("。

    suffix=<value>

    顯示在參照名稱列表之後。預設為 ")"。

    separator=<value>

    顯示在參照名稱之間。預設為 ", "。

    pointer=<value>

    顯示在 HEAD 及其指向的分支(如果有)之間。預設為 " → "。

    tag=<value>

    顯示在標籤 (tag) 名稱之前。預設為 "tag: "。

    例如,要產生沒有包裝或標籤註解,且以空格作為分隔符的裝飾:

        %(decorate:prefix=,suffix=,tag=,separator= )
    %(describe[:<option>,...])

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

    tags[=<bool-value>]

    除了考慮有註解的標籤 (annotated tags) 外,也考慮輕量級標籤 (lightweight tags)。

    abbrev=<number>

    不使用預設的十六進位數字位數(這會根據儲存庫中的物件數量而變化,預設為 7),而是使用 <數字> 位數,或形成唯一物件名稱所需的位數位數。

    match=<pattern>

    僅考慮符合給定 glob(7) <模式> 的標籤,不包括 refs/tags/ 前綴。

    exclude=<pattern>

    不考慮符合給定 glob(7) <模式> 的標籤,不包括 refs/tags/ 前綴。

    %S

    在命令行中給出的用於到達該提交的參照名稱(類似 git log --source),僅對 git log 有效

    %e

    編碼

    %s

    主旨

    %f

    經過清理的主旨行,適合用作文件名

    %b

    內文

    %B

    原始內文(未換行的主旨和內文)

    %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

    簡短的參照日誌選取器;與 %gD 相同,但參照名稱部分為了人類可讀性而縮短(因此 refs/heads/master 僅變為 master)。

    %gn

    參照日誌身份名稱

    %gN

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

    %ge

    參照日誌身份電子郵件

    %gE

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

    %gs

    參照日誌主旨

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

    顯示由 git-interpret-trailers[1] 解釋的內文尾註 (trailers)。trailers 字串後可以跟一個冒號和零個或多個以逗號分隔的選項。如果任何選項被多次提供,則以最後一次出現的為準。

    key=<key>

    僅顯示具有指定 <鍵> 的尾註。匹配不區分大小寫,且末尾冒號是可選的。如果多次給出該選項,則會顯示與任何鍵匹配的尾註行。此選項會自動啟用 only 選項,從而隱藏尾註塊中的非尾註行。如果不希望這樣,可以使用 only=false 禁用它。例如,%(trailers:key=Reviewed-by) 顯示鍵為 Reviewed-by 的尾註行。

    only[=<bool>]

    選擇是否應包含尾註塊中的非尾註行。

    separator=<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=<分隔符> 具有相同的語義。

    注意
    某些佔位符可能取決於給予版本遍歷引擎的其他選項。例如,除非我們正在遍歷參照日誌項目(例如透過 git log -g),否則 %g* 參照日誌選項將插入一個空字串。如果在命令行中尚未提供 --decorate,則 %d%D 佔位符將使用 "short" 裝飾格式。

    布林選項接受一個可選的值 [=<布林值>]git-config[1]--type=bool 所接受的值(如 yesoff)都可被接受。給予不帶 =<值> 的布林選項相當於給予帶有 =true 的選項。

    如果您在佔位符的 % 之後加入 +(加號),則當且僅當佔位符擴展為非空字串時,會在擴展前立即插入換行符。

    如果您在佔位符的 % 之後加入 -(減號),則當且僅當佔位符擴展為空字串時,會刪除緊接在擴展前的所有連續換行符。

    如果您在佔位符的 % 之後加入 (空格),則當且僅當佔位符擴展為非空字串時,會在擴展前立即插入一個空格。

tformat:

tformat: 格式的工作原理與 format: 完全相同,不同之處在於它提供「結束符 (terminator)」語義而非「分隔符 (separator)」語義。換句話說,每個提交都會附加訊息結束字元(通常是換行符),而不是在項目之間放置分隔符。這意味著單行格式的最後一項將像 "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 rev-list HEAD
  • 列印此分支上存在,但不在上游分支中存在的提交清單。

    git rev-list @{upstream}..HEAD
  • 使用其作者和提交訊息格式化提交(另請參閱 porcelain git-log[1])。

    git rev-list --format=medium HEAD
  • 格式化提交及其差異(另請參閱 porcelain git-log[1],它可以在單個行程中執行此操作)。

    git rev-list HEAD |
    git diff-tree --stdin --format=medium -p
  • 列印當前分支上修改了 Documentation 目錄中任何檔案的提交清單。

    git rev-list HEAD -- Documentation/
  • 列印過去一年中由您在任何分支、標籤或其他參考上創作的提交清單。

    git rev-list --author=you@example.com --since=1.year.ago --all
  • 列印可從當前分支到達的物件清單(即所有提交以及它們包含的二進位物件和樹狀物件)。

    git rev-list --objects HEAD
  • 比較所有可到達物件的磁碟大小,相對於那些可從 reflogs 到達的物件,以及總打包大小。這可以告訴您執行 git repack -ad 是否可以減少儲存庫大小(透過丟棄不可到達的物件),以及過期 reflogs 是否有幫助。

    # reachable objects
    git rev-list --disk-usage --objects --all
    # plus reflogs
    git rev-list --disk-usage --objects --all --reflog
    # total disk size used
    du -c .git/objects/pack/*.pack .git/objects/??/*
    # alternative to du: add up "size" and "size-pack" fields
    git count-objects -v
  • 報告每個分支的磁碟大小,不包括當前分支使用的物件。這可以發現導致儲存庫膨脹的異常值(例如,因為有人不小心提交了大型建置產物)。

    git for-each-ref --format='%(refname)' |
    while read branch
    do
    	size=$(git rev-list --disk-usage --objects HEAD..$branch)
    	echo "$size $branch"
    done |
    sort -n
  • 比較一組參考中分支的磁碟大小,排除另一組。如果您在單個儲存庫中混合來自多個遠端的物件,這可以顯示哪些遠端導致了儲存庫大小增加(以 origin 的大小為基準)。

    git rev-list --disk-usage --objects --remotes=$suspect --not --remotes=origin

GIT

git[1] 套件的一部分