簡體中文 ▾ 主題 ▾ 最新版本 ▾ git-rev-list 最後更新於 2.50.0

名稱

git-rev-list - 按逆時間順序列出提交物件

概要

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

描述

列出從給定提交(或多個提交)透過跟蹤 parent 連結可達的提交,但排除那些在前面帶有 *^* 符號的提交所能到達的提交。預設情況下,輸出按逆時間順序排列。

你可以將其視為一種集合操作。從命令列給定的任何提交可達到的提交構成一個集合,然後從那些前面帶有 *^* 符號的提交可達到的提交將從該集合中減去。剩餘的提交就是該命令的輸出。可以使用各種其他選項和路徑引數來進一步限制結果。

因此,以下命令

$ git rev-list foo bar ^baz

表示“列出所有從 *foo* 或 *bar* 可達但不能從 *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 bisect` 和 `git 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>

將提交輸出限制為引用日誌條目與指定模式(正則表示式)匹配的提交。當使用多個 --grep-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 表示所有章魚合併(octopus merges)。

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

--first-parent

在查詢要包含的提交時,遇到合併提交時只跟蹤第一個父提交。在檢視特定主題分支的演變時,此選項可以提供更好的概覽,因為合併到主題分支通常只是為了不時地調整上游更新,此選項允許您忽略此類合併帶入歷史記錄的單個提交。

--exclude-first-parent-only

在查詢要排除的提交時(帶有 *^* ),遇到合併提交時只跟蹤第一個父提交。這可以用於查詢主題分支中從其與遠端分支分歧點開始的變更集,因為任意合併都可以是有效的主題分支變更。

--not

顛倒所有後續修訂說明符的 *^* 字首(或缺少字首)的含義,直到下一個 --not。當在命令列中 ` --stdin` 之前使用時,透過標準輸入傳遞的修訂不會受其影響。反之,當透過標準輸入傳遞時,命令列上透過的修訂不會受其影響。

--all

假裝 refs/ 中的所有引用以及 HEAD 都作為 <commit> 列在命令列上。

--branches[=<pattern>]

假裝 refs/heads 中的所有引用都以 <commit> 的形式在命令列中列出。如果提供了 <pattern>,則將分支限制為匹配給定 shell glob 模式的分支。如果模式缺少 ?*[,則隱含結尾的 /*

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

不要包含與 <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-config[1]),不包括會被 git-fetchgit-receive-packgit-upload-pack 隱藏的引用。此選項會影響下一個偽引用選項 --all--glob,並在處理它們後清除。

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

不要向標準輸出列印任何內容。這種形式主要是為了讓呼叫者測試退出狀態,以檢視一系列物件是否完全連線(或不連線)。這比將標準輸出重定向到 /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 選項描述中的示例)。但是,它會顯示從另一分支挑選的提交(例如,“b 上的第 3 次提交”可能從分支 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

不遍歷提交祖先鏈,而是從最新到最舊遍歷引用日誌條目。使用此選項時,不能指定要排除的提交(即不能使用 ^commitcommit1..commit2commit1...commit2 表示法)。

--pretty 格式不是 onelinereference(原因顯而易見)時,這會導致輸出包含來自引用日誌的兩行額外資訊。輸出中的引用日誌指示符可能顯示為 ref@{<Nth>}(其中 <Nth> 是引用日誌中的逆時間順序索引)或 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 遍歷時,樹和二進位制物件將不會列印其關聯路徑。

--progress=<header>

在考慮物件時,在標準錯誤輸出上顯示進度報告。每次進度更新時都會列印 <header> 文字。

-z

輸出的每個物件及其伴隨的元資料不再以換行符分隔,而是使用 NUL 位元組分隔。輸出以以下形式列印:

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

附加的物件元資料,例如物件路徑或邊界物件,使用 <token>=<value> 形式列印。令牌值按原樣列印,不進行任何編碼/截斷。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> 的提交。但《歷史簡化》(History Simplification) 有兩部分,一部分是選擇提交,另一部分是如何進行簡化,因為有多種策略可以簡化歷史。

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

<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 新增到 PQP 是 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 的父列表類似地移除了 IP 隨後被完全移除,因為它有一個父級且是 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 中在其祖先路徑中包含該主題的子集。因此,例如使用 --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 會遍歷每個邊。這將發現提交 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 包含合併提交時,該合併被視為“拉取”了另一個分支的更改。在此示例中使用 --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 選項允許您透過省略未被標籤引用的提交來僅檢視歷史拓撲的概覽。提交被標記為 !TREESAME(換句話說,在上述歷史簡化規則後保留)如果 (1) 它們被標籤引用,或者 (2) 它們更改了命令列上給定的路徑內容。所有其他提交都被標記為 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

的長度大致相同。因此,查詢引入迴歸的更改就簡化為二分查詢:重複生成和測試新的“中間點”,直到提交鏈的長度為一。

--bisect-vars

此選項的計算方式與 --bisect 相同,但 refs/bisect/ 中的引用不被使用,並且它輸出可供 shell `eval` 執行的文字。這些行會將中間修訂的名稱分配給變數 bisect_rev,將測試 bisect_rev 後預期要測試的提交數量分配給 bisect_nr,如果 bisect_rev 被證明是好的,則預期要測試的提交數量分配給 bisect_good,如果 bisopsis">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] 用於構建“瘦”包,該包以基於這些排除提交中包含的物件進行增量化的形式記錄物件,以減少網路流量。

--objects-edge-aggressive

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

--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 可以為零。字尾 k、m 和 g 可用於表示 KiB、MiB 或 GiB 的單位。例如,blob:limit=1kblob:limit=1024 相同。

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

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

形式 --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 標誌更難,通常也不是必需的。過濾器透過 + 連線,單個過濾器進行 % 編碼(即 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,但只允許物件遍歷在遇到“預期”的許諾物件缺失時繼續。意外的缺失物件將引發錯誤。

形式 --missing=print 類似於 allow-any,但也會列印缺失物件的列表。物件 ID 以“?”字元為字首。

形式 --missing=print-info 類似於 print,但還會列印從包含物件推斷出的缺失物件的附加資訊。所有資訊都與缺失物件 ID 在同一行列印,形式為:?<oid> [<token>=<value>]...。包含附加資訊的 <token>=<value> 對之間用一個空格(SP)分隔。值以令牌特定的方式編碼,但值中包含的空格(SP)或換行符(LF)總是以確保編碼結果不包含這兩個問題位元組的方式表示。每個 <token>=<value> 可以是以下之一:

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

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

如果傳遞給遍歷的一些尖端物件丟失,它們也將被視為丟失,並且遍歷將忽略它們。但是,如果無法獲取它們的“物件 ID”,將引發錯誤。

--exclude-promisor-objects

(僅供內部使用。)在許諾邊界預過濾物件遍歷。這用於部分克隆。這比 --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>" 選項(如果顯示差異輸出,此選項也會對其進行修改)來指定字首的最小長度。

這應該會使使用 80 列終端的人員更容易閱讀 "--pretty=oneline"。

--no-abbrev-commit

顯示完整的 40 位元組十六進位制提交物件名稱。這會抵消 --abbrev-commit,無論是顯式指定還是由其他選項(如“--oneline”)隱含。它還會覆蓋 log.abbrevCommit 變數。

--oneline

這是 "--pretty=oneline --abbrev-commit" 同時使用的簡寫形式。

--encoding=<encoding>

提交物件在其編碼頭中記錄用於日誌訊息的字元編碼;此選項可用於告訴命令以使用者偏好的編碼重新編碼提交日誌訊息。對於非底層命令,這預設為 UTF-8。請注意,如果一個物件聲稱以 X 編碼,並且我們正在以 X 輸出,我們將按字面意思輸出該物件;這意味著原始提交中的無效序列可能會被複制到輸出中。同樣,如果 iconv(3) 無法轉換提交,我們將靜默地按字面意思輸出原始物件。

--expand-tabs=<n>
--expand-tabs
--no-expand-tabs

在日誌訊息中執行製表符擴充套件(將每個製表符替換為足夠的空格,以填充到下一個是 <n> 倍的顯示列),然後才在輸出中顯示。--expand-tabs--expand-tabs=8 的簡寫,而 --no-expand-tabs--expand-tabs=0 的簡寫,後者停用製表符擴充套件。

預設情況下,在將日誌訊息縮排 4 個空格的美觀格式(即預設的 mediumfullfuller)中,製表符會被擴充套件。

--show-signature

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

--relative-date

等同於 --date=relative

--date=<format>

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

--date=relative 顯示相對於當前時間的日期,例如“2 hours ago”。對於 --date=relative-local 選項無效。

--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:... 將格式 ... 傳遞給您的系統 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 一起使用時,則列印左右提交的計數,用製表符分隔。當與 --cherry-mark 一起使用時,從這些計數中省略補丁等效的提交,並列印等效提交的計數,用製表符分隔。

美觀格式 (PRETTY FORMATS)

如果提交是合併,並且漂亮格式不是 onelineemailraw,則在 Author: 行之前插入一行附加內容。此行以“Merge: ”開頭,並列印祖先提交的雜湊值,用空格分隔。請注意,如果您限制了歷史檢視,則列出的提交不一定是**直接**父提交的列表:例如,如果您只對與特定目錄或檔案相關的更改感興趣。

有幾種內建格式,您可以透過將 pretty.<name> 配置選項設定為另一個格式名稱或 format: 字串來定義附加格式,如下所述(參見 git-config[1])。以下是內建格式的詳細資訊:

  • oneline

    <hash> <title-line>

    這被設計為儘可能緊湊。

  • short

    commit <hash>
    Author: <author>
    <title-line>
  • medium

    commit <hash>
    Author: <author>
    Date:   <author-date>
    <title-line>
    <full-commit-message>
  • full

    commit <hash>
    Author: <author>
    Commit: <committer>
    <title-line>
    <full-commit-message>
  • fuller

    commit <hash>
    Author:     <author>
    AuthorDate: <author-date>
    Commit:     <committer>
    CommitDate: <committer-date>
    <title-line>
    <full-commit-message>
  • reference

    <abbrev-hash> (<title-line>, <short-author-date>)

    此格式用於在提交訊息中引用另一個提交,它與 --pretty='format:%C(auto)%h (%s, %ad) 相同。預設情況下,日期使用 --date=short 格式化,除非明確指定了另一個 --date 選項。與任何帶有格式佔位符的 format: 一樣,其輸出不受 --decorate--walk-reflogs 等其他選項的影響。

  • email

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

    email 類似,但提交訊息中以 "From " 開頭(前面帶零個或多個 ">")的行會用 ">" 引用,這樣它們就不會被誤認為是新提交的開始。

  • raw

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

  • format:<format-string>

    format:<format-string> 格式允許您指定要顯示的資訊。它的工作方式有點像 printf 格式,但一個顯著的區別是,您使用 %n 而不是 \n 來獲取換行符。

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

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

    佔位符有

    • 擴充套件為單個文字字元的佔位符

      %n

      換行

      %%

      一個原始的 %

      %x00

      %x 後跟兩位十六進位制數字會被替換為具有該十六進位制數字值的位元組(在本文件的其餘部分,我們將此稱為“字面格式程式碼”)。

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

      %Cred

      切換顏色為紅色

      %Cgreen

      切換顏色為綠色

      %Cblue

      切換顏色為藍色

      %Creset

      重置顏色

      %C(…​)

      顏色規範,如git-config[1]的"CONFIGURATION FILE"(配置檔案)章節中的"Values"(值)部分所述。預設情況下,僅當啟用日誌輸出的顏色時(透過color.diffcolor.ui--color,並且在我們輸出到終端時尊重前兩者的auto設定)才顯示顏色。%C(auto,...)被接受作為預設設定的歷史同義詞(例如,%C(auto,red))。指定%C(always,...)將即使在未啟用顏色時也顯示顏色(儘管可以考慮直接使用--color=always來為整個輸出啟用顏色,包括此格式以及git可能著色的任何其他內容)。單獨的auto(即%C(auto))將開啟後續佔位符的自動著色,直到顏色再次切換。

      %m

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

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

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

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

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

      %<|( <M> )

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

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

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

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

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

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

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

    • 展開為從提交中提取的資訊的佔位符

      %H

      提交雜湊

      %h

      縮寫提交雜湊

      %T

      樹雜湊

      %t

      縮寫樹雜湊

      %P

      父雜湊

      %p

      縮寫父雜湊

      %an

      作者姓名

      %aN

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

      %ae

      作者電子郵件

      %aE

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

      %al

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

      %aL

      作者本地部分(參見 %al,遵循 .mailmap,參見 git-shortlog[1]git-blame[1]

      %ad

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

      %aD

      作者日期,RFC2822 風格

      %ar

      作者日期,相對時間

      %at

      作者日期,UNIX 時間戳

      %ai

      作者日期,類似 ISO 8601 格式

      %aI

      作者日期,嚴格 ISO 8601 格式

      %as

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

      %ah

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

      %cn

      提交者姓名

      %cN

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

      %ce

      提交者電子郵件

      %cE

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

      %cl

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

      %cL

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

      %cd

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

      %cD

      提交者日期,RFC2822 風格

      %cr

      提交者日期,相對時間

      %ct

      提交者日期,UNIX 時間戳

      %ci

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

      %cI

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

      %cs

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

      %ch

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

      %d

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

      %D

      引用名稱,不帶 " ("、")" 包裹。

      %(decorate[:<options>])

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

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

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

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

      • pointer=<value>:如果 HEAD 指向某個分支,則在 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

    引用日誌選擇器,例如,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[:<options>])

    顯示由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*引用日誌選項將插入一個空字串,除非我們正在遍歷引用日誌條目(例如,透過git log -g)。如果命令列上尚未提供--decorate%d%D佔位符將使用“短”裝飾格式。

布林選項接受一個可選值[=<bool-value>]。所有--type=bool git-config[1]接受的值,如yesoff,都受支援。不帶=<value>的布林選項等同於帶=true

如果在佔位符的 % 之後新增 +(加號),則僅當佔位符展開為非空字串時,才會在展開之前立即插入一個換行符。

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

如果在佔位符的 % 之後新增 ` `(空格),則僅當佔位符展開為非空字串時,才會在展開之前立即插入一個空格。

  • tformat

    tformat:格式的工作方式與format:完全相同,但它提供的是“終止符”語義而非“分隔符”語義。換句話說,每個提交都會追加訊息終止符(通常是換行符),而不是在條目之間放置分隔符。這意味著單行格式的最後一個條目將像“oneline”格式一樣正確地以新行終止。例如:

    $ git log -2 --pretty=format:%h 4da45bef \
      | perl -pe '$_ .= " -- NO NEWLINE\n" unless /\n/'
    4da45be
    7134973 -- NO NEWLINE
    
    $ git log -2 --pretty=tformat:%h 4da45bef \
      | perl -pe '$_ .= " -- NO NEWLINE\n" unless /\n/'
    4da45be
    7134973

    此外,任何包含 % 的無法識別的字串都被解釋為在其前面帶有 tformat:。例如,以下兩個是等效的:

    $ git log -2 --pretty=tformat:%h 4da45bef
    $ git log -2 --pretty=%h 4da45bef

示例

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

    git rev-list HEAD
  • 列印此分支上的提交列表,但不包括上游分支中存在的提交。

    git rev-list @{upstream}..HEAD
  • 格式化提交及其作者和提交訊息(另請參見基礎命令git-log[1])。

    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
  • 比較所有可達物件的磁碟大小,與可從引用日誌可達的物件大小,以及總打包大小。這可以告訴您執行git repack -ad是否能減小儲存庫大小(透過刪除不可達物件),以及過期引用日誌是否有幫助。

    # 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