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

名稱

git-rev-list - 以反向時間順序列表提交物件

概要

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

描述

列出可透過追蹤給定提交的 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>」,這對於合併很有用。產生的提交集合是兩個運算元之間的對稱差。以下兩個命令等效

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

rev-list 是一個基本的 Git 命令,因為它提供了建立和遍歷提交祖先圖的能力。因此,它有許多不同的選項,使其可以用於像 git bisectgit repack 這樣不同的命令。

選項

提交限制

除了使用描述中解釋的特殊表示法指定應列出的提交範圍外,還可以套用額外的提交限制。

使用更多選項通常會進一步限制輸出 (例如,--since=<date1> 限制為比 <date1> 更新的提交,將其與 --grep=<pattern> 一起使用會進一步限制為記錄訊息具有符合 <pattern> 的行的提交),除非另有說明。

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

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

限制要輸出的提交數量。

--skip=<number>

在開始顯示提交輸出之前跳過 number 個提交。

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

顯示比特定日期更新的提交。

--since-as-filter=<date>

顯示比特定日期更新的所有提交。這會造訪範圍內的所有提交,而不是在第一個比特定日期舊的提交處停止。

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

顯示比特定日期舊的提交。

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

將提交輸出限制在指定的時間範圍內。

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

將提交輸出限制為具有符合指定模式 (正規表示式) 的作者/提交者標頭行的提交。使用多個 --author=<pattern> 時,會選擇作者符合任何給定模式的提交 (對於多個 --committer=<pattern> 也相同)。

--grep-reflog=<pattern>

將提交輸出限制為具有符合指定模式 (正規表示式) 的 reflog 項目之提交。使用多個 --grep-reflog 時,會選擇其 reflog 訊息符合任何給定模式的提交。除非使用 --walk-reflogs,否則使用此選項會發生錯誤。

--grep=<pattern>

將提交輸出限制為具有符合指定模式 (正規表示式) 的記錄訊息之提交。使用多個 --grep=<pattern> 時,會選擇其訊息符合任何給定模式的提交 (但請參閱 --all-match)。

--all-match

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

--invert-grep

將提交輸出限制為記錄訊息不符合使用 --grep=<pattern> 指定的模式的提交。

-i
--regexp-ignore-case

比對不考慮字母大小寫的正規表示式限制模式。

--basic-regexp

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

-E
--extended-regexp

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

-F
--fixed-strings

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

-P
--perl-regexp

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

對這些類型的正規表示式的支援是可選的編譯時間相依性。如果 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 會提供所有章魚合併。

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

--first-parent

當尋找要包含的提交時,在看到合併提交時,只追蹤第一個父提交。當檢視特定主題分支的演進時,此選項可以提供更好的概觀,因為合併到主題分支通常只是為了調整與上游的更新,而此選項允許您忽略此類合併帶入您歷史記錄中的個別提交。

--exclude-first-parent-only

當尋找要排除的提交(使用 ^)時,在看到合併提交時,只追蹤第一個父提交。這可用於找出主題分支從遠端分支分歧點開始的變更集合,假設任意合併都可能是有效的主題分支變更。

--not

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

--all

假裝 refs/ 中的所有參照,以及 HEAD,都以 <commit> 的形式列在命令列上。

--branches[=<pattern>]

假裝 refs/heads 中的所有參照都以 <commit> 的形式列在命令列上。如果給定 <pattern>,則將分支限制為符合給定的 shell glob 的分支。如果 pattern 缺少 ?*[,則會隱含在結尾加上 /*

--tags[=<pattern>]

假裝 refs/tags 中的所有參照都以 <commit> 的形式列在命令列上。如果給定 <pattern>,則將標籤限制為符合給定的 shell glob 的標籤。如果 pattern 缺少 ?*[,則會隱含在結尾加上 /*

--remotes[=<pattern>]

假裝 refs/remotes 中的所有參照都以 <commit> 的形式列在命令列上。如果給定 <pattern>,則將遠端追蹤分支限制為符合給定的 shell glob 的分支。如果 pattern 缺少 ?*[,則會隱含在結尾加上 /*

--glob=<glob-pattern>

假裝符合 shell glob <glob-pattern> 的所有參照都以 <commit> 的形式列在命令列上。如果缺少開頭的 refs/,則會自動加上。如果 pattern 缺少 ?*[,則會隱含在結尾加上 /*

--exclude=<glob-pattern>

不要包含符合 <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]

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

--reflog

假裝 reflog 中提及的所有物件都以 <commit> 的形式列在命令列上。

--alternate-refs

假裝在備用儲存庫的參照提示中提及的所有物件都列在命令列上。備用儲存庫是指其物件目錄在 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

當提交集受到對稱差異限制時,省略任何引入與「另一邊」的另一個提交相同變更的提交。

例如,如果您有兩個分支 AB,通常列出它們其中一側的所有提交的方式是使用 --left-right(請參閱下方 --left-right 選項的描述中的範例)。但是,它會顯示從另一個分支 cherry-picked 的提交(例如,「b 上的第 3 個」可能會從分支 A cherry-picked)。使用此選項,會從輸出中排除這類提交對。

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

不追蹤提交祖先鏈,而是從最新的 reflog 項目到較舊的項目追蹤 reflog 項目。使用此選項時,您無法指定要排除的提交(也就是說,無法使用 ^commitcommit1..commit2commit1...commit2 標記法)。

使用 --pretty 格式而非 onelinereference(原因很明顯),這會導致輸出有兩個額外行,其中包含從 reflog 取得的資訊。輸出中的 reflog 指定符可能會顯示為 ref@{<Nth>}(其中 <Nth> 是 reflog 中的反向時間順序索引)或 ref@{<timestamp>}(其中 <timestamp> 是該項目的時間戳記),具體取決於一些規則

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

  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> 文字將會隨著每次進度更新印出。

歷史簡化

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

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

<paths>

選取修改給定 <paths> 的提交。

--simplify-by-decoration

選取由某些分支或標籤引用的提交。

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

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

預設模式

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

--show-pulls

包含預設模式中的所有提交,但也包含任何與第一個父提交不是 TREESAME,但與後續父提交是 TREESAME 的合併提交。此模式有助於顯示「首先引入」分支變更的合併提交。

--full-history

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

--dense

只顯示選定的提交,以及一些以提供有意義的歷史。

--sparse

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

--simplify-merges

--full-history 的額外選項,可從產生的歷史中移除一些不必要的合併,因為沒有選定的提交有助於此合併。

--ancestry-path[=<commit>]

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

以下是更詳細的說明。

假設您指定 foo 作為 <paths>。我們將修改 foo 的提交稱為 !TREESAME,其餘的則為 TREESAME。(在針對 foo 篩選的差異中,它們看起來分別不同和相等。)

在以下內容中,我們將始終參考相同的範例歷史,以說明簡化設定之間的差異。我們假設您正在此提交圖表中篩選檔案 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」。其合併 OND 的字串合併為「foobarbaz」;也就是說,它與任何父提交都不是 TREESAME。

  • Equux 變更為「xyzzy」,其合併 P 將字串合併為「quux xyzzy」。PO 是 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
	 \   /       /
	  `---------'

請注意 NPQ--full-history 的主要差異

  • N 的父級清單已刪除 I,因為它是另一個父級 M 的祖先。儘管如此,N 仍保留,因為它是 !TREESAME。

  • P 的父級清單也同樣刪除了 I。然後完全刪除了 P,因為它有一個父級且是 TREESAME。

  • Q 的父級清單將 Y 簡化為 X。然後刪除了 X,因為它是 TREESAME 根。然後完全刪除了 Q,因為它有一個父級且是 TREESAME。

還有另一種可用的簡化模式

--ancestry-path[=<commit>]

將顯示的提交限制為 <commit> 的祖先、<commit> 的後代或 <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 引入的錯誤影響並需要修正時,我們可能只想檢視 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 子集。因此,例如,針對 D..M 使用 --ancestry-path=H 將會產生

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

而針對 D..M 使用 --ancestry-path=K 將會產生

		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 分別不是。

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

	I---X

當使用 --full-history 時,Git 會遍歷每一條邊。這會發現 commit AB 以及合併 commit M,但也會顯示合併 commit OP。經過父節點重寫後,產生的圖形如下:

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

在這裡,合併 commit OP 產生了額外的雜訊,因為它們實際上並沒有對 file.txt 做出任何變更。它們只是合併了一個基於舊版 file.txt 的主題分支。這是使用多位貢獻者並行工作,並沿著單一主幹合併他們主題分支的工作流程中常見的問題:許多不相關的合併會出現在 --full-history 的結果中。

當使用 --simplify-merges 選項時,commit OP 會從結果中消失。這是因為 OP 的重寫第二父節點可以從它們的第一個父節點到達。這些邊會被移除,然後這些 commit 看起來就像是單一父節點的 commit,而且它們與其父節點是 TREESAME 的。commit N 也會發生這種情況,最終得到的歷史視圖如下:

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

在這個視圖中,我們看到了來自 ABX 的所有重要的單一父節點變更。我們也看到了仔細解決的合併 commit M 和不太仔細解決的合併 commit R。這通常足以確定為什麼 commit AB 在預設視圖中「消失」在歷史記錄中。然而,這種方法存在一些問題。

第一個問題是效能。與之前的任何選項不同,--simplify-merges 選項需要遍歷整個 commit 歷史記錄,然後才能返回單一結果。這使得這個選項對於非常大的儲存庫來說難以使用。

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

--show-pulls

除了預設歷史中顯示的 commit 之外,還顯示每個與其第一個父節點不是 TREESAME 但與後續父節點是 TREESAME 的合併 commit。

當使用 --show-pulls 包含合併 commit 時,會將此合併視為它從另一個分支「拉取」了變更。在這個範例中使用 --show-pulls (且沒有其他選項) 時,產生的圖形如下:

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

在這裡,合併 commit RN 被包含在內,因為它們分別將 commit XR 拉入基準分支。這些合併是 commit AB 沒有出現在預設歷史記錄中的原因。

--show-pulls--simplify-merges 配對使用時,圖形會包含所有必要的資訊。

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

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

--simplify-by-decoration 選項允許您僅查看歷史記錄拓樸的大局,方法是省略未被標籤引用的 commit。如果 (1) 它們被標籤引用,或者 (2) 它們變更了命令列上給定的路徑的內容,則 commit 會被標記為 !TREESAME (換句話說,在上述歷史簡化規則之後保留)。所有其他 commit 都會被標記為 TREESAME (可以被簡化掉)。

二分查找輔助程式

--bisect

將輸出限制為包含的 commit 和排除的 commit 之間大致中間的單一 commit 物件。請注意,錯誤的二分查找參考 refs/bisect/bad 會被新增到包含的 commit 中(如果它存在),而正確的二分查找參考 refs/bisect/good-* 會被新增到排除的 commit 中(如果它們存在)。因此,假設 refs/bisect/ 中沒有參考,如果

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

輸出 _中點_,則以下兩個命令的輸出

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

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

--bisect-vars

此選項的計算方式與 --bisect 相同,不同之處在於不會使用 refs/bisect/ 中的參考,而且此選項會輸出準備好讓 shell 執行的文字。這些行會將中點修訂版本的名稱指定給變數 bisect_rev,並將預期在測試 bisect_rev 後要測試的 commit 數量指定給 bisect_nr,如果 bisect_rev 結果是正確的,則預期要測試的 commit 數量指定給 bisect_good,如果 bisect_rev 結果是錯誤的,則預期要測試的 commit 數量指定給 bisect_bad,以及我們目前正在進行二分查找的 commit 數量指定給 bisect_all

--bisect-all

此選項會輸出包含的 commit 和排除的 commit 之間的所有 commit 物件,並依它們與包含的 commit 和排除的 commit 的距離排序。不會使用 refs/bisect/ 中的參考。距離最遠的會先顯示。(這是 --bisect 唯一會顯示的。)

這很有用,因為當您想要因為某些原因避免測試某些 commit 時,可以輕鬆地選擇一個好的 commit 來測試(例如,它們可能無法編譯)。

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

Commit 排序

預設情況下,commit 會以反向時間順序顯示。

--date-order

在顯示其所有子節點之前不顯示任何父節點,但其他情況下會以 commit 時間戳記順序顯示 commit。

--author-date-order

在顯示其所有子節點之前不顯示任何父節點,但其他情況下會以作者時間戳記順序顯示 commit。

--topo-order

在顯示其所有子節點之前不顯示任何父節點,並避免顯示混合在一起的多條歷史記錄線上的 commit。

例如,在像這樣的 commit 歷史記錄中

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

其中數字表示 commit 時間戳記的順序,使用 --date-ordergit rev-list 和相關命令會以時間戳記順序顯示 commit: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);為了避免顯示來自兩個並行開發軌跡混合在一起的 commit,某些較舊的 commit 會在較新的 commit 之前顯示。

--reverse

以反向順序輸出選擇要顯示的 commit (請參閱上面的 Commit 限制章節)。無法與 --walk-reflogs 組合使用。

物件遍歷

這些選項主要針對 Git 儲存庫的封裝。

--objects

列印所列 commit 引用的任何物件的物件 ID。因此,--objects foo ^bar 表示「如果我有 commit 物件 _bar_ 但沒有 _foo_,請傳送給我所有我需要下載的物件 ID」。另請參閱下面的 --object-names

--in-commit-order

依 commit 的順序列印樹狀和 blob ID。樹狀和 blob ID 會在第一次被 commit 引用後列印。

--objects-edge

--objects 類似,但也會列印以「-」字元為前綴的排除 commit 的 ID。 git-pack-objects[1] 使用此選項來建置「精簡」封裝,該封裝會根據這些排除 commit 中包含的物件,以差異化的形式記錄物件,以減少網路流量。

--objects-edge-aggressive

--objects-edge 類似,但它會花費更多時間來嘗試尋找排除的 commit。會使用此選項而不是 --objects-edge 來為淺層儲存庫建置「精簡」封裝。

--indexed-objects

假裝索引使用的所有樹狀和 blob 都已在命令列上列出。請注意,您可能也想要使用 --objects

--unpacked

僅與 --objects 一起使用;列印不在封裝中的物件 ID。

--object-names

僅與 --objects 一起使用;列印找到的物件 ID 的名稱。這是預設行為。請注意,每個物件的「名稱」含糊不清,主要目的是作為封裝物件的提示。特別是:不會區分標籤、樹狀和 blob 的名稱;路徑名稱可能會被修改以移除換行符號;如果物件會多次以不同的名稱出現,則只會顯示一個名稱。

--no-object-names

僅與 --objects 一起使用;不會列印找到的物件 ID 的名稱。這會反轉 --object-names。此旗標允許 git-cat-file[1] 等命令更輕鬆地解析輸出。

--filter=<filter-spec>

僅對 --objects* 其中之一有用;從列印的物件清單中省略物件 (通常是 blob)。_<filter-spec>_ 可以是下列其中一種

--filter=blob:none 的形式會省略所有 blob。

--filter=blob:limit=<n>[kmg] 的形式會省略大小至少為 n 個位元組或單位的 blob。n 可以是零。後綴 k、m 和 g 可用於命名 KiB、MiB 或 GiB 的單位。例如,blob:limit=1kblob:limit=1024 相同。

--filter=object:type=(tag|commit|tree|blob) 的形式會省略所有不是所請求類型的物件。

--filter=sparse:oid=<blob-ish> 形式會使用 blob (或 blob 表達式) <blob-ish> 中包含的稀疏檢出規格,來省略在請求的 refs 上進行稀疏檢出時不需要的 blob。

--filter=tree:<depth> 形式會省略所有從根樹狀結構深度 >= <depth> 的 blob 和樹狀結構(如果物件位於遍歷的提交中多個深度,則為最小深度)。<depth>=0 將不包含任何樹狀結構或 blob,除非在命令行中明確包含(或在使用 --stdin 時從標準輸入中包含)。<depth>=1 將僅包含從 <commit> 可到達的提交或明確給定的物件直接引用的樹狀結構和 blob。<depth>=2 與 <depth>=1 類似,同時還包含從明確給定的提交或樹狀結構再多移除一級的樹狀結構和 blob。

請注意,為了安全考量,已移除想要從檔案系統上的任意路徑讀取資料的 --filter=sparse:path=<path> 形式。

可以指定多個 --filter= 標誌來組合篩選器。只有每個篩選器都接受的物件才會被包含。

--filter=combine:<filter1>+<filter2>+…​<filterN> 形式也可以用於組合多個篩選器,但這比僅重複使用 --filter 標誌更難,通常沒有必要。篩選器以 + 連接,個別篩選器則以 % 編碼(即 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>

一個除錯選項,用於協助未來「部分克隆」開發。此選項指定如何處理遺失的物件。

--missing=error 形式要求如果遇到遺失的物件,rev-list 會停止並出現錯誤。這是預設動作。

如果遇到遺失的物件,--missing=allow-any 形式將允許物件遍歷繼續進行。遺失的物件將會從結果中靜默省略。

--missing=allow-promisor 形式與 allow-any 類似,但僅允許針對「預期」的 promisor 遺失物件繼續進行物件遍歷。非預期的遺失物件將會引發錯誤。

--missing=print 形式與 allow-any 類似,但也會印出遺失的物件清單。物件 ID 以 “?” 字元為前綴。

如果傳遞給遍歷的一些提示遺失,它們也會被視為遺失,且遍歷將會忽略它們。然而,如果我們無法取得它們的物件 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> 一樣。

請參閱「美化格式」章節,以取得每個格式的更多詳細資訊。當省略 =<format> 部分時,預設值為 medium

注意:您可以在存放庫設定中指定預設的美化格式(請參閱 git-config[1])。

--abbrev-commit

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

這應使「--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

在輸出中顯示日誌訊息之前,執行 tab 展開(將每個 tab 替換為足夠的空格,以填滿下一個顯示欄,該欄為 <n> 的倍數)。--expand-tabs--expand-tabs=8 的縮寫,而 --no-expand-tabs--expand-tabs=0 的縮寫,它會停用 tab 展開。

預設情況下,tab 會在將日誌訊息縮排 4 個空格的美化格式中展開(即 medium,它是預設值、fullfuller)。

--show-signature

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

--relative-date

--date=relative 的同義詞。

--date=<format>

僅對以人類可讀格式顯示的日期生效,例如使用 --pretty 時。log.date 設定變數會為日誌命令的 --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 會將日期顯示為自 epoch(1970-01-01 00:00:00 UTC)以來的秒數,後面接著一個空格,然後是時區,作為與 UTC 的偏移量(+- 加上四位數字;前兩位是小時,後兩位是分鐘)。即,如同時間戳記使用 strftime("%s %z") 格式化一樣。請注意,-local 選項不會影響自 epoch 以來的秒數值(它始終以 UTC 測量),但會切換隨附的時區值。

如果時區與目前時區不符,--date=human 會顯示時區,如果相符則不會列印整個日期(即,對於「今年」的日期,會略過列印年份,但如果是在過去幾天,我們可以只說它是星期幾)。對於較舊的日期,也會省略小時和分鐘。

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

--date=format:... 會將格式 ... 饋送到您的系統 strftime,除了 %s、%z 和 %Z,這些會內部處理。使用 --date=format:%c 以您系統地區設定偏好的格式顯示日期。請參閱 strftime 手冊,以取得格式預留位置的完整清單。使用 -local 時,正確的語法是 --date=format-local:...

--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>,則會顯示該字串,而不是預設的字串。

--count

印出一個數字,表示將被列出的提交數量,並抑制所有其他輸出。當與 --left-right 一起使用時,會改為印出左側和右側提交的計數,並以 Tab 分隔。當與 --cherry-mark 一起使用時,會從這些計數中省略修補程式等效提交,並印出等效提交的計數,以 Tab 分隔。

美化格式

如果提交是合併提交,且美化格式不是 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 選項,否則日期會使用 --date=short 格式化。與任何具有格式佔位符的 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] 的「組態檔」章節中的值所述。預設情況下,只有在啟用記錄輸出時才會顯示顏色(透過 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

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

    %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 選項的規則。@ 之前的部分是指令行上給定的 refname (所以 git log -g refs/heads/master 會產生 refs/heads/master@{0})。

    %gd

    縮短的 reflog 選擇器;與 %gD 相同,但 refname 部分會縮短以方便人類閱讀 (所以 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] 解釋的內文 trailer。trailers 字串後面可加上冒號和零或多個逗號分隔的選項。如果多次提供任何選項,則最後出現的選項優先。

    • key=<key>:只顯示具有指定 <key> 的 trailer。比對時不區分大小寫,且尾部的冒號是可選的。如果多次給定選項,則顯示符合任何金鑰的 trailer 行。此選項會自動啟用 only 選項,以便隱藏 trailer 區塊中的非 trailer 行。如果不希望這樣,可以使用 only=false 停用。例如,%(trailers:key=Reviewed-by) 會顯示金鑰為 Reviewed-by 的 trailer 行。

    • only[=<bool>]:選擇是否應包含 trailer 區塊中的非 trailer 行。

    • separator=<sep>:指定在 trailer 行之間插入的分隔符號。預設值為換行字元。字串 <sep> 可能包含上述文字格式代碼。若要使用逗號作為分隔符號,必須使用 %x2C,否則會被解析為下一個選項。例如,%(trailers:key=Ticket,separator=%x2C ) 會顯示所有金鑰為 "Ticket" 的 trailer 行,並以逗號和空格分隔。

    • unfold[=<bool>]:使其行為如同已指定 interpret-trailer 的 --unfold 選項。例如,%(trailers:only,unfold=true) 會展開並顯示所有 trailer 行。

    • keyonly[=<bool>]:僅顯示 trailer 的金鑰部分。

    • valueonly[=<bool>]:僅顯示 trailer 的值部分。

    • key_value_separator=<sep>:指定插入在每個 trailer 的金鑰和值之間的分隔符號。預設值為 ": "。否則,其語意與上述 separator=<sep> 相同。

注意
某些預留位置可能會取決於給修訂版遍歷引擎的其他選項。例如,除非我們正在遍歷 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 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
  • 列印從目前分支可到達的物件列表(即,所有提交及其包含的 blob 和樹狀結構)。

    git rev-list --objects HEAD
  • 比較所有可到達物件的磁碟大小,與從 reflog 可到達的物件大小,以及總壓縮大小。這可以告訴您執行 git repack -ad 是否可以減少儲存庫大小(透過刪除不可到達的物件),以及過期 reflog 是否有幫助。

    # 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] 套件的一部分

scroll-to-top