簡體中文 ▾ 主題 ▾ 最新版本 ▾ git-rev-list 最後更新於 2.52.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>

將輸出限制為 <number> 個提交。

--skip=<number>

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

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

顯示比 <date> 更新的提交。

--since-as-filter=<date>

顯示所有比 <date> 更新的提交。這會遍歷範圍內的所有提交,而不是在第一個比 <date> 舊的提交處停止。

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

顯示比 <date> 舊的提交。

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

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

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

將提交輸出限制為作者/提交者標題行與 <pattern> 正則表示式匹配的提交。使用多個 --author=<pattern> 時,會選擇作者匹配任何 <pattern> 的提交(對多個 --committer=<pattern> 類似)。

--grep-reflog=<pattern>

將提交輸出限制為 reflog 條目與 <pattern> 正則表示式匹配的提交。使用多個 --grep-reflog 時,會選擇 reflog 訊息匹配任何給定模式的提交。使用此選項但未同時使用 --walk-reflogs 是錯誤的。

--grep=<pattern>

將提交輸出限制為其日誌訊息匹配 <pattern> 正則表示式的提交。使用多個 --grep=<pattern> 時,會選擇訊息匹配任何 <pattern> 的提交(但請參閱 --all-match)。

--all-match

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

--invert-grep

將提交輸出限制為其日誌訊息不匹配使用 --grep=<pattern> 指定的 <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 匹配的標籤。如果模式缺少 ?*[,則在末尾隱含 /*

--remotes[=<pattern>]

假裝 refs/remotes 中的所有引用都已在命令列上列為 <commit>。如果給出了 <pattern>,則將遠端跟蹤分支限制為與給定 shell glob 匹配的分支。如果模式缺少 ?*[,則在末尾隱含 /*

--glob=<glob-pattern>

假裝所有匹配 shell glob <glob-pattern> 的引用都已在命令列上列為 <commit>。如果缺少,則自動加上字首 refs/。如果模式缺少 ?*[,則在末尾隱含 /*

--exclude=<glob-pattern>

不包括與下一個 --all--branches--tags--remotes--glob 將要考慮的 <glob-pattern> 匹配的引用。此選項的重複使用會累積排除模式,直到下一個 --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-config[1]),不包括會被 git-fetchgit-receive-packgit-upload-pack 隱藏的引用。此選項會影響下一個偽引用選項 --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=。當看到 -- 分隔符時,後面的輸入被視為路徑並用於限制結果。透過 stdin 讀取的標誌(如 --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-pick 的提交(例如,“b 上的第 3 個”可能從分支 A cherry-pick)。使用此選項,將從輸出中排除此類提交對。

--left-only
--right-only

僅列出對稱差集一側的提交,即僅那些由 --left-right 標記為 <> 的提交。

例如,--cherry-pick --right-only A...B 將 B 中在 A 中或與 A 中的提交補丁等效的提交從 B 中省略。換句話說,這列出了 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 條目。使用此選項時,您不能指定要排除的提交(即,不能使用 ^<commit><commit1>..<commit2><commit1>...<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 中的第一個存在的偽引用。僅當索引包含未合併條目時才有效。此選項可用於在解決 3 路合併衝突時顯示相關提交。

--boundary

輸出排除的邊界提交。邊界提交字首為 -

--use-bitmap-index

嘗試使用 pack bitmap 索引(如果可用)來加速遍歷。請注意,在使用 --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 輸出選項相容。

歷史簡化

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

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

<paths>

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

--simplify-by-decoration

選擇被某些分支或標籤引用的提交。

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

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

預設 模式

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

--show-pulls

包含預設模式中的所有提交,但也包括任何與第一個父提交不 TREESAME 但與較晚的父提交 TREESAME 的合併提交。此模式有助於顯示“首次引入”更改到分支的合併提交。

--full-history

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

--dense

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

--sparse

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

--simplify-merges

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

--ancestry-path[=<commit>]

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

更詳細的解釋如下。

假設您指定了 foo 作為 <paths>。我們將呼叫修改 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。其合併 OND 的字串合併為 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)來包含或排除提交。以下是可用的設定。

預設模式

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

這導致

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

請注意,如果存在 TREESAME 父項,則只跟隨該 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 的父項 I。對於 CN,以及 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 的父列表類似地移除了 IP 隨後被完全移除,因為它有一個父級且是 TREESAME。

  • Q 的父項列表將 Y 簡化為 XX 然後被刪除,因為它是一個 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 中不存在的什麼”的意義上來說。在此示例中的結果將是所有提交,除了 A 和 B(以及 D 本身,當然)。

然而,當我們想找出 M 中的哪些提交受到了 D 引入的 bug 的汙染並需要修復時,我們可能只想檢視 D..M 中實際上是 D 的後代的提交子集,即排除 C 和 K。這正是 `--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 是透過忽略 M 處的 file.txt 內容而建立的,只採用了 X 處的 file.txt 內容。因此,RX 是 TREESAME 的,但與 M 不是。最後,建立 N 的自然合併解析是採用 R 處的 file.txt 內容,因此 NR 是 TREESAME 的,但與 C 不是。合併提交 OP 與它們的第一個父提交是 TREESAME 的,但與它們的第二個父提交 ZY 分別不是。

在使用預設模式時,NR 都具有一個 TREESAME 父級,因此那些邊緣被遍歷,而其他的則被忽略。生成的歷史圖是

	I---X

使用 `--full-history` 時,Git 會遍歷每個邊。這將發現提交 A 和 B 以及合併 M,但也會顯示合併提交 O 和 P。使用父項重寫後,生成的圖是:

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

在這裡,合併提交 O 和 P 貢獻了額外的噪音,因為它們實際上沒有為 `file.txt` 貢獻更改。它們只是合併了一個基於舊版本 `file.txt` 的主題。這是在許多貢獻者並行工作並將主題分支合併到單條主線的工作流中常見的儲存庫問題:許多不相關的合併出現在 `--full-history` 的結果中。

當使用 `--simplify-merges` 選項時,提交 O 和 P 將從結果中消失。這是因為 O 和 P 的重寫後的第二個父項可以從它們的第一個父項到達。這些邊被移除,然後這些提交看起來像單父提交,並且與它們的父項是 TREESAME。提交 N 也發生這種情況,導致歷史檢視如下:

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

在此檢視中,我們看到了 A、B 和 X 的所有重要的單父提交更改。我們還看到了仔細解析的合併 M 和不太仔細解析的合併 R。這通常足以確定為什麼提交 A 和 B 在預設檢視中“消失”了。但是,此方法存在一些問題。

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

第二個問題是審計。當許多貢獻者在同一個儲存庫中工作時,哪個合併提交將更改引入重要分支是很重要的。上面的有問題的合併 R 很可能不是用於將 R 合併到重要分支的合併提交。相反,合併 N 用於將 R 和 X 合併到重要分支。該提交可能包含有關 X 的更改覆蓋 A 和 B 的更改原因的資訊。

--show-pulls

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

當合並提交被 `--show-pulls` 包含時,合併被視為“拉取”了另一個分支的更改。當在此示例上使用 `--show-pulls`(且沒有其他選項)時,生成的圖是:

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

在這裡,合併提交 R 和 N 被包含,因為它們分別拉取了提交 X 和 R 到主分支。這些合併是提交 A 和 B 不出現在預設歷史記錄中的原因。

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

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

請注意,由於 M 可以從 R 到達,因此從 N 到 M 的邊被簡化掉了。然而,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

將大致相同長度。因此,找到引入迴歸的更改被簡化為二分查詢:反覆生成和測試新的“midpoint”,直到提交鏈長度為一。

--bisect-vars

這計算的結果與 --bisect 相同,除了 refs/bisect/ 中的引用不被使用,並且它輸出文字,準備被 shell 求值。這些行將中間修訂版的名稱賦給變數 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

按提交順序列印樹和 blob ID。樹和 blob ID 在首次被提交引用後列印。

--objects-edge

類似於 --objects,但也列印排除提交的 ID,前面加上 "-" 字元。這由 git-pack-objects[1] 使用來構建“瘦” pack,它以增量形式記錄物件,基於這些排除提交中的物件,以減少網路流量。

--objects-edge-aggressive

類似於 --objects-edge,但它會更努力地尋找排除的提交,但代價是增加時間。這被用於代替 --objects-edge 來構建淺倉庫的“瘦” pack。

--indexed-objects

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

--unpacked

僅與 --objects 有效;列印不在 pack 中的物件 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> 可以為零。字尾 kmg 可用於命名 KiB、MiB 或 GiB 為單位。例如,blob:limit=1k 等同於 blob:limit=1024

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

--filter=sparse:oid=<blob-ish> 形式使用 blob(或 blob 表示式)<blob-ish> 中包含的稀疏檢出規範,來省略在請求的引用上進行稀疏檢出時不需要的 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 前面帶有 "?" 字元。

--missing=print-info 形式類似於 print,但還會列印關於從其包含物件推斷出的缺失物件的附加資訊。資訊全部列印在同一行,缺失物件 ID 的形式為:?<oid> [<token>=<value>]...。包含附加資訊的 <token>=<value> 對之間由一個空格分隔。值以 token 特定方式進行編碼,但值中包含的 SPLF 始終被期望以不會包含這兩個問題位元組的形式進行編碼。每個 <token>=<value> 可能為以下之一

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

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

如果傳遞給遍歷的某些提示缺失,它們也將被視為缺失,並且遍歷將忽略它們。如果我們無法獲得它們的 Object 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> 可以是 `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>

提交物件在它們的 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`)。

--show-signature

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

--relative-date

等同於 --date=relative

--date=<format>

僅在以人類可讀格式顯示日期時生效(例如,使用 `--pretty` 時)。`log.date` 配置變數為 `git 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”)、四位數字年份,以及時區資訊,除非使用本地時區,例如 `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 一起使用時,則列印左右提交的數量,並用製表符分隔。當與 --cherry-mark 一起使用時,則從這些計數中省略補丁等價提交,並用製表符分隔等價提交的數量。

美觀格式 (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 選項,否則日期格式為 --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* 資訊顯示真實的父提交,而不考慮 graft 或歷史簡化。請注意,此格式會影響提交的顯示方式,但不會影響 diff 的顯示方式,例如使用 git log --raw。要在原始 diff 格式中獲取完整的物件名稱,請使用 --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(<spec>)

      顏色規範,如 git-config[1] 的 "CONFIGURATION FILE" 部分的 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)截斷(使用省略號 ..),在中間(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[:<option>,...])

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

      • prefix=<value>:顯示在 ref 名稱列表之前。預設為 " ("。

      • suffix=<value>:顯示在 ref 名稱列表之後。預設為 ")"。

      • separator=<value>:顯示在 ref 名稱之間。預設為 ", "。

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

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

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

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

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

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

    • tags[=<bool-value>]:而不是隻考慮帶註釋的標籤,也考慮輕量級標籤。

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

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

    • exclude=<pattern>:不考慮匹配給定 glob(7) <pattern> 的標籤,不包括 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

    引用日誌身份名稱

    %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 字串後面可以跟一個冒號和零個或多個逗號分隔的選項。如果任何選項出現多次,則最後一個生效。

    • 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] 中的值,如 yes 和 off,都被接受。給出布林選項而不帶 =<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

示例

  • 列印當前分支可達的提交列表。

    git rev-list HEAD
  • 列印此分支上的提交列表,但排除上游分支上的提交。

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

    git rev-list --format=medium HEAD
  • 格式化提交及其差異(另請參閱 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 和 tree)。

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