# git-rev-list
> 原文: [https://git-scm.com/docs/git-rev-list](https://git-scm.com/docs/git-rev-list)
## 名稱
git-rev-list - 以反向時間順序列出提交對象
## 概要
```
git rev-list [ --max-count=<number> ]
[ --skip=<number> ]
[ --max-age=<timestamp> ]
[ --min-age=<timestamp> ]
[ --sparse ]
[ --merges ]
[ --no-merges ]
[ --min-parents=<number> ]
[ --no-min-parents ]
[ --max-parents=<number> ]
[ --no-max-parents ]
[ --first-parent ]
[ --remove-empty ]
[ --full-history ]
[ --not ]
[ --all ]
[ --branches[=<pattern>] ]
[ --tags[=<pattern>] ]
[ --remotes[=<pattern>] ]
[ --glob=<glob-pattern> ]
[ --ignore-missing ]
[ --stdin ]
[ --quiet ]
[ --topo-order ]
[ --parents ]
[ --timestamp ]
[ --left-right ]
[ --left-only ]
[ --right-only ]
[ --cherry-mark ]
[ --cherry-pick ]
[ --encoding=<encoding> ]
[ --(author|committer|grep)=<pattern> ]
[ --regexp-ignore-case | -i ]
[ --extended-regexp | -E ]
[ --fixed-strings | -F ]
[ --date=<format>]
[ [ --objects | --objects-edge | --objects-edge-aggressive ]
[ --unpacked ]
[ --filter=<filter-spec> [ --filter-print-omitted ] ] ]
[ --missing=<missing-action> ]
[ --pretty | --header ]
[ --bisect ]
[ --bisect-vars ]
[ --bisect-all ]
[ --merge ]
[ --reverse ]
[ --walk-reflogs ]
[ --no-walk ] [ --do-walk ]
[ --count ]
[ --use-bitmap-index ]
<commit>…? [ -- <paths>…? ]
```
## 描述
列出通過遵循給定提交的`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_ 。
## OPTIONS
### 提交限制
除了使用說明書中解釋的特殊符號指定應列出的提交范圍之外,還可以應用其他提交限制。
除非另有說明,否則使用更多選項通常會進一步限制輸出(例如,`--since=<date1>`限制提交比`<date1>`更新,并將其與`--grep=<pattern>`一起使用進一步限制其日志消息具有與`<pattern>`匹配的行的提交)。
請注意,這些是在提交排序和格式化選項之前應用的,例如`--reverse`。
```
-<number>
```
```
-n <number>
```
```
--max-count=<number>
```
限制要輸出的提交數量。
```
--skip=<number>
```
在開始顯示提交輸出之前,跳過_編號_提交。
```
--since=<date>
```
```
--after=<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`給出所有root提交和`--min-parents=3`所有章魚合并。
`--no-min-parents`和`--no-max-parents`再次重置這些限制(無限制)。等效形式是`--min-parents=0`(任何提交具有0或更多父母)和`--max-parents=-1`(負數表示無上限)。
```
--first-parent
```
在看到合并提交時,僅遵循第一個父提交。在查看特定主題分支的演變時,此選項可以提供更好的概述,因為合并到主題分支往往只是關于不時調整到更新的上游,并且此選項允許您忽略引入的單個提交通過這樣的合并你的歷史。不能與--bisect結合使用。
```
--not
```
反轉所有后續修訂說明符的 _^_ 前綴(或缺少)的含義,直到下一個`--not`。
```
--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>
```
假設所有的refs匹配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/heads`,`refs/tags`或`refs/remotes`開始,并且當應用于`--glob`時,它們必須以`refs/`開頭]或`--all`。如果打算使用尾隨 _/ *_ ,則必須明確給出。
```
--reflog
```
假設reflog所提到的所有對象都在命令行中列為`<commit>`。
```
--single-worktree
```
默認情況下,當有多個工作樹時,將通過以下選項檢查所有工作樹(參見 [git-worktree [1]](https://git-scm.com/docs/git-worktree) ):`--all`,`--reflog`和`--indexed-objects`。此選項強制它們僅檢查當前工作樹。
```
--ignore-missing
```
在輸入中看到無效的對象名稱時,假裝沒有給出錯誤的輸入。
```
--stdin
```
除了_< commit>在命令行中列出_,從標準輸入中讀取它們。如果看到`--`分隔符,請停止讀取提交并開始讀取路徑以限制結果。
```
--quiet
```
不要將任何東西打印到標準輸出。此表單主要用于允許調用者測試退出狀態以查看一系列對象是否完全連接(或不完全連接)。它比將stdout重定向到`/dev/null`更快,因為輸出不必格式化。
```
--cherry-mark
```
與`--cherry-pick`(見下文)相同,但標記等效提交與`=`而不是省略它們,而與`+`不等價。
```
--cherry-pick
```
當提交集受限于對稱差異時,省略任何引用與“另一方”上的另一個提交相同的更改的提交。
例如,如果您有兩個分支,`A`和`B`,通常只在一側列出所有提交的方法是使用`--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
```
而不是走提交祖先鏈,將reflog條目從最新的條目轉到較舊的條目。使用此選項時,您無法指定要排除的提交(即 _^ commit_ , _commit1..commit2_ , _commit1 ... commit2_ 表示法不能用過的)。
使用`oneline`以外的`--pretty`格式(出于顯而易見的原因),這會導致輸出從reflog中獲取兩行額外的信息。輸出中的reflog指示符可能顯示為`ref@{Nth}`(其中`Nth`是reflog中的反向時間順序索引)或`ref@{timestamp}`(帶有該條目的時間戳),具體取決于以下幾條規則:
1. 如果起始點指定為`ref@{Nth}`,則顯示索引格式。
2. 如果起始點指定為`ref@{now}`,則顯示時間戳格式。
3. 如果兩者均未使用,但在命令行中給出了`--date`,則以`--date`請求的格式顯示時間戳。
4. 否則,顯示索引格式。
在`--pretty=oneline`下,提交消息在同一行上以此信息為前綴。此選項不能與`--reverse`組合使用。另見 [git-reflog [1]](https://git-scm.com/docs/git-reflog) 。
```
--merge
```
合并失敗后,show refs觸摸有沖突的文件,并且在所有頭上都不存在要合并的文件。
```
--boundary
```
輸出排除邊界提交。邊界提交以`-`為前綴。
```
--use-bitmap-index
```
嘗試使用pack位圖索引(如果有的話)來加速遍歷。請注意,當使用`--objects`遍歷時,樹和blob將不會打印其關聯路徑。
```
--progress=<header>
```
在考慮對象時顯示stderr的進度報告。每次進度更新都會打印`<header>`文本。
### 歷史簡化
有時您只對歷史記錄的某些部分感興趣,例如修改特定< path>的提交。但_歷史簡化_有兩個部分,一部分是選擇提交,另一部分是如何做,因為有各種策略來簡化歷史。
以下選項選擇要顯示的提交:
```
<paths>
```
提交修改給定的<路徑>被選中。
```
--simplify-by-decoration
```
選擇某些分支或標記引用的提交。
請注意,可以顯示額外的提交以提供有意義的歷史記錄。
以下選項會影響簡化的執行方式:
```
Default mode
```
將歷史簡化為最簡單的歷史,解釋樹的最終狀態。最簡單的,因為如果最終結果相同(即合并具有相同內容的分支),它會修剪一些側分支
```
--full-history
```
與默認模式相同,但不修剪某些歷史記錄。
```
--dense
```
僅顯示選定的提交,并顯示一些具有有意義的歷史記錄。
```
--sparse
```
顯示簡化歷史記錄中的所有提交。
```
--simplify-merges
```
`--full-history`的附加選項,用于從生成的歷史記錄中刪除一些不必要的合并,因為沒有選定的提交有助于此合并。
```
--ancestry-path
```
當給出一系列要顯示的提交時(例如 _commit1..commit2_ 或 _commit2 ^ commit1_ ),只顯示直接存在于 _commit1_ 之間的祖先鏈上的提交]和 _commit2_ ,即提交既是 _commit1_ 的后代,又是 _commit2_ 的祖先。
下面是更詳細的解釋。
假設您將`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。
* `D`將`foo`設置為“baz”。它的合并`O`將`N`和`D`的字符串組合成“foobarbaz”;即,它不是任何父母的TREESAME。
* `E`將`quux`更改為“xyzzy”,其合并`P`將字符串組合為“quux xyzzy”。 `P`是TREESAME到`O`,但不是`E`。
* `X`是一個獨立的根提交,它添加了一個新文件`side`,`Y`修改了它。 `Y`是TREESAME到`X`。它的合并`Q`將`side`添加到`P`,`Q`將TREESAME添加到`P`,但不添加到`Y`。
`rev-list`根據是否使用`--full-history`和/或父改寫(通過`--parents`或`--children`)來回溯歷史記錄,包括或排除提交。可以使用以下設置。
```
Default mode
```
如果對任何父母不是TREESAME,則包含提交(盡管可以更改,請參閱下面的`--sparse`)。如果提交是合并,并且它是一個父級的TREESAME,則只關注該父級。 (即使有幾個TREESAME父母,也只能跟隨他們中的一個。)否則,請跟隨所有父母。
這導致:
```
.-A---N---O
/ / /
I---------D
```
請注意,僅遵循TREESAME父級的規則(如果有的話)將完全從考慮中刪除`B`。 `C`被認為是通過`N`,但是是TREESAME。 Root提交與空樹進行比較,因此`I`是!TREESAME。
父/子關系僅在`--parents`中可見,但這不會影響在默認模式下選擇的提交,因此我們顯示了父行。
```
--full-history without parent rewriting
```
此模式與默認值在一點上不同:始終跟隨合并的所有父項,即使它是其中一個的TREESAME。即使合并的多個方面包含了包含的提交,這并不意味著合并本身就是!在這個例子中,我們得到了
```
I A B N D O P Q
```
`M`被排除在外,因為對父母雙方都是TREESAME。 `E`,`C`和`B`都走了,但只有`B`是!TREESAME,所以沒有出現。
請注意,如果沒有父改寫,就不可能談論提交之間的父/子關系,因此我們將它們顯示為斷開連接。
```
--full-history with parent rewriting
```
只有普通提交才包括在內!TREESAME(雖然可以更改,但請參見下面的`--sparse`)。
合并始終包括在內。但是,它們的父列表會被重寫:沿著每個父項刪除不包含在其中的提交。這導致了
```
.-A---M---N---O---P---Q
/ / / / /
I B / D /
\ / / / /
`-------------'
```
與`--full-history`比較而不重寫上述內容。請注意,`E`被刪除,因為它是TREESAME,但是P的父列表被重寫為包含`E`的父`I`。 `C`和`N`,`X`,`Y`和`Q`也發生了同樣的情況。
除上述設置外,您還可以更改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
\ / /
`---------'
```
注意`N`,`P`和`Q`與`--full-history`的主要差異:
* `N`的父列表刪除了`I`,因為它是另一個父`M`的祖先。仍然,`N`仍然是因為它是!TREESAME。
* `P`的父列表同樣刪除了`I`。 `P`然后被完全刪除,因為它有一個父母并且是TREESAME。
* `Q`的父列表將`Y`簡化為`X`。然后刪除`X`,因為它是TREESAME根。 `Q`然后被完全刪除,因為它有一個父母并且是TREESAME。
最后,還有第五種簡化模式:
```
--ancestry-path
```
將顯示的提交限制為直接在給定提交范圍中的“from”和“to”提交之間的祖先鏈上的提交。即只顯示“to”提交的祖先和“from”提交的后代的提交。
作為示例用例,請考慮以下提交歷史記錄:
```
D---E-------F
/ \ \
B---C---G---H---I---J
/ \
A-------K---------------L--M
```
常規 _D..M_ 計算作為`M`的祖先的提交集,但不包括作為`D`的祖先的提交。這對于從`D`以來導致`M`的歷史發生了什么是有用的,因為“`D`中沒有`M`具有什么`M`”。這個例子中的結果將是所有提交,除了`A`和`B`(當然還有`D`本身)。
當我們想知道`M`中的提交被`D`引入的bug污染并需要修復時,我們可能只想查看實際上 _D..M_ 的子集`D`的后代,即排除`C`和`K`。這正是`--ancestry-path`選項的作用。應用于 _D..M_ 范圍,它會導致:
```
E-------F
\ \
G---H---I---J
\
L--M
```
`--simplify-by-decoration`選項允許您通過省略未由標記引用的提交來僅查看歷史拓撲的大圖。如果(1)它們被標記引用,或(2)它們改變命令行上給出的路徑的內容,則提交被標記為!TREESAME(換句話說,保持在上述歷史簡化規則之后)。所有其他提交都標記為TREESAME(可以簡化)。
### Bisection Helpers
```
--bisect
```
將輸出限制為一個提交對象,該提交對象大致位于包含和排除的提交之間。請注意,錯誤的二分法ref `refs/bisect/bad`被添加到包含的提交(如果存在)中,并且良好的二分refs `refs/bisect/good-*`被添加到被排除的提交(如果它們存在)。因此,假設`refs/bisect/`中沒有引用,如果
```
$ git rev-list --bisect foo ^bar ^baz
```
輸出_中點_,兩個命令的輸出
```
$ git rev-list foo ^midpoint
$ git rev-list midpoint ^bar ^baz
```
將是大致相同的長度。因此,查找引入回歸的更改將簡化為二進制搜索:重復生成并測試新的“中點”,直到提交鏈長度為1。不能與--first-parent結合使用。
```
--bisect-vars
```
這計算與`--bisect`相同,只是不使用`refs/bisect/`中的refs,除了輸出準備好由shell評估的文本。這些行將中點修訂的名稱分配給變量`bisect_rev`,并將`bisect_rev`之后要測試的預期提交次數測試為`bisect_nr`,如果`bisect_rev`轉動則預期要測試的提交次數如果`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”。
```
--in-commit-order
```
按提交順序打印樹和blob id。樹和blob id在它們首次被提交引用后打印。
```
--objects-edge
```
與`--objects`類似,但也打印帶有“ - ”字符的排除提交的ID。 [git-pack-objects [1]](https://git-scm.com/docs/git-pack-objects) 使用它來構建一個“瘦”包,它根據這些被排除的提交中包含的對象以分層的形式記錄對象,以減少網絡流量。
```
--objects-edge-aggressive
```
與`--objects-edge`類似,但它更難以以增加時間為代價查找排除的提交。這用來代替`--objects-edge`為淺層存儲庫構建“瘦”包。
```
--indexed-objects
```
假裝索引使用的所有樹和blob都在命令行中列出。請注意,您可能也想使用`--objects`。
```
--unpacked
```
僅適用于`--objects`;打印不在包中的對象ID。
```
--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 = 1k_ 與 _blob相同:limit = 1024_ 。
形式 _--filter =稀疏:oid =< blob-ish>_ 使用包含在blob(或blob-expression)_< blob-ish>中的稀疏檢驗規范。_ 省略在請求的refs上進行稀疏檢出時不需要的blob。
形式 _--filter = sparse:path =< path>_ 類似地使用< path>中包含的稀疏檢出規范。
形式 _- 過濾器=樹:<深度>_ 省略了從根樹的深度> =< depth>的所有斑點和樹木。 (如果對象位于所遍歷的提交的多個深度處,則為最小深度)。 < depth> = 0將不包含任何樹或blob,除非在命令行中顯式包含(或使用--stdin時的標準輸入)。 < depth> = 1將僅包括由< commit>可到達的提交直接引用的樹和blob。或明確給定的對象。 < depth> = 2類似于< depth> = 1,同時還包括從明確給定的提交或樹中移除一個級別的樹和blob。
```
--no-filter
```
關閉之前的`--filter=`參數。
```
--filter-print-omitted
```
僅適用于`--filter=`;打印過濾器省略的對象列表。對象ID以“?”字符為前綴。
```
--missing=<missing-action>
```
一個調試選項,以幫助未來的“部分克隆”開發。此選項指定如何處理丟失的對象。
表格 _--missing = error_ 請求如果遇到丟失的對象,則rev-list會停止并顯示錯誤。這是默認操作。
如果遇到丟失的對象,表單 _--missing = allow-any_ 將允許對象遍歷繼續。缺少的對象將默默地從結果中省略。
形式 _--missing = allow-promisor_ 就像_允許任何_,但只允許對象遍歷繼續為EXPECTED promisor缺少對象。意外丟失的對象將引發錯誤。
表格 _- 丟失=打印_就像_允許任何_,但也會打印缺失對象的列表。對象ID以“?”字符為前綴。
```
--exclude-promisor-objects
```
(僅供內部使用。)Prefilter對象在promisor邊界處遍歷。這與部分克隆一起使用。這比`--missing=allow-promisor`更強,因為它限制了遍歷,而不是僅僅消除有關丟失對象的錯誤。
```
--no-walk[=(sorted|unsorted)]
```
只顯示給定的提交,但不要遍歷他們的祖先。如果指定了范圍,則無效。如果給出了參數`unsorted`,則提交將按命令行中給出的順序顯示。否則(如果`sorted`或沒有給出參數),提交按提交時間以反向時間順序顯示。不能與`--graph`結合使用。
```
--do-walk
```
覆蓋之前的`--no-walk`。
### 提交格式
使用這些選項, [git-rev-list [1]](https://git-scm.com/docs/git-rev-list) 的行為類似于更專業的提交日志工具系列: [git-log [1]](https://git-scm.com/docs/git-log) , [git-show [1]](https://git-scm.com/docs/git-show) 和 [git-whatchanged [1]](https://git-scm.com/docs/git-whatchanged)
```
--pretty[=<format>]
```
```
--format=<format>
```
以給定格式打印提交日志的內容,其中_< format>_ 可以是 _oneline_ ,_短_,_培養基_,_全_,_更豐富_,_之一電子郵件_,_原始_,_格式:< string>_ 和 _tformat:< string>_ 。當_< format>_ 不屬于上述情況,并且其中包含_%占位符_,其行為就像 _--pretty = tformat:< format>_ 給出了。
有關每種格式的一些其他詳細信息,請參閱“PRETTY FORMATS”部分。當 _=< format>_ 部分省略,默認為 _medium_ 。
注意:您可以在存儲庫配置中指定默認的漂亮格式(請參閱 [git-config [1]](https://git-scm.com/docs/git-config) )。
```
--abbrev-commit
```
而不是顯示完整的40字節十六進制提交對象名稱,而只顯示部分前綴。可以使用“--abbrev =< n>”指定非默認位數(如果顯示,也會修改diff輸出)。
對于使用80列終端的人來說,這應該使“--pretty = oneline”更具可讀性。
```
--no-abbrev-commit
```
顯示完整的40字節十六進制提交對象名稱。這否定了`--abbrev-commit`以及暗示它的選項,例如“--oneline”。它還會覆蓋`log.abbrevCommit`變量。
```
--oneline
```
這是一起使用的“--pretty = oneline --abbrev-commit”的簡寫。
```
--encoding=<encoding>
```
提交對象在其編碼頭中記錄用于日志消息的編碼;此選項可用于告訴命令以用戶首選的編碼重新編碼提交日志消息。對于非管道命令,默認為UTF-8。請注意,如果一個對象聲稱在`X`中編碼并且我們在`X`中輸出,我們將逐字輸出該對象;這意味著原始提交中的無效序列可能會復制到輸出中。
```
--expand-tabs=<n>
```
```
--expand-tabs
```
```
--no-expand-tabs
```
執行選項卡擴展(將每個選項卡替換為足夠的空格以填充到日志消息中的_< n>_ 的倍數的下一個顯示列),然后在輸出中顯示它。 `--expand-tabs`是`--expand-tabs=8`的簡寫,`--no-expand-tabs`是`--expand-tabs=0`的簡寫,它會禁用制表符擴展。
默認情況下,選項卡以相當格式展開,將日志消息縮進4個空格(即 _medium_ ,默認情況下, _full_ 和 _fulller_ )。
```
--show-signature
```
通過將簽名傳遞給`gpg --verify`并顯示輸出來檢查已簽名的提交對象的有效性。
```
--relative-date
```
`--date=relative`的同義詞。
```
--date=<format>
```
僅對以人類可讀格式顯示的日期生效,例如使用`--pretty`時。 `log.date` config變量為日志命令的`--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:...`將格式`...`輸入系統`strftime`,%z和%Z除外,它們在內部處理。使用`--date=format:%c`以系統區域設置的首選格式顯示日期。有關格式占位符的完整列表,請參閱`strftime`手冊。使用`-local`時,正確的語法是`--date=format-local:...`。
+ `--date=default`是默認格式,類似于`--date=rfc2822`,但有一些例外:
* 星期幾之后沒有逗號
* 使用本地時區時,省略時區
```
--header
```
以raw格式打印提交的內容;每個記錄用NUL字符分隔。
```
--parents
```
同時打印提交的父級(以“提交父級”的形式)。也可以啟用父重寫,請參閱上面的_歷史簡化_。
```
--children
```
同時打印提交的子項(以“提交子項...”的形式)。也可以啟用父重寫,請參閱上面的_歷史簡化_。
```
--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`一起使用時,請忽略這些計數中的補丁等效提交,并打印由選項卡分隔的等效提交的計數。
## 漂亮的格式
如果提交是合并,并且如果漂亮格式不是 _oneline_ ,_電子郵件_或 _raw_ ,則在_作者之前插入另一行:_行。該行以“Merge:”開頭,并且打印祖先提交的sha1,用空格分隔。請注意,如果您限制了對歷史記錄的查看,則列出的提交可能不一定是**直接**父提交的列表:例如,如果您只對與某個目錄或文件相關的更改感興趣。
有幾種內置格式,您可以通過設置漂亮的格式來定義其他格式。< name>將選項配置為另一種格式名稱或_格式:_字符串,如下所述(參見 [git-config [1]](https://git-scm.com/docs/git-config) )。以下是內置格式的詳細信息:
* _oneline_
```
<sha1> <title line>
```
這是為了盡可能緊湊。
* _短_
```
commit <sha1>
Author: <author>
```
```
<title line>
```
* _中_
```
commit <sha1>
Author: <author>
Date: <author date>
```
```
<title line>
```
```
<full commit message>
```
* _全_
```
commit <sha1>
Author: <author>
Commit: <committer>
```
```
<title line>
```
```
<full commit message>
```
* _更豐富_
```
commit <sha1>
Author: <author>
AuthorDate: <author date>
Commit: <committer>
CommitDate: <committer date>
```
```
<title line>
```
```
<full commit message>
```
* _電子郵件_
```
From <sha1> <date>
From: <author>
Date: <author date>
Subject: [PATCH] <title line>
```
```
<full commit message>
```
* _原始_
_raw_ 格式顯示完整提交,與存儲在提交對象中完全相同。值得注意的是,無論是否使用--abbrev或--no-abbrev,SHA-1都會完整顯示,并且_父_信息顯示真正的父提交,而不考慮移植或歷史簡化。請注意,此格式會影響提交的顯示方式,但不會影響顯示差異的方式,例如用`git log --raw`。要以原始diff格式獲取完整對象名稱,請使用`--no-abbrev`。
* _格式:< string>_
_格式:< string>_ 格式允許您指定要顯示的信息。它的工作方式有點像printf格式,但有一個值得注意的例外,即你用_%n_ 而不是 _\ n_ 獲得換行符。
例如,_格式:“%h的作者是%an,%ar%n標題是>>%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.<<
```
占位符是:
* _%H_ :提交哈希
* _%h_ :縮寫提交哈希
* _%T_ :樹形哈希
* _%t_ :縮寫樹哈希
* _%P_ :父哈希
* _%p_ :縮寫為父哈希值
* _%和_:作者姓名
* _%aN_ :作者姓名(尊重.mailmap,見 [git-shortlog [1]](https://git-scm.com/docs/git-shortlog) 或 [git-blame [1]](https://git-scm.com/docs/git-blame) )
* _%ae_ :作者電郵
* _%aE_ :作者電子郵件(尊重.mailmap,見 [git-shortlog [1]](https://git-scm.com/docs/git-shortlog) 或 [git-blame [1]](https://git-scm.com/docs/git-blame) )
* _%ad_ :作者日期(格式尊重 - 日期=選項)
* _%aD_ :作者日期,RFC2822風格
* _%ar_ :作者日期,相對
* 的_%:作者日期,UNIX時間戳_
* _%ai_ :作者日期,ISO 8601樣格式
* _%aI_ :作者日期,嚴格的ISO 8601格式
* _%cn_ :提交者名稱
* _%cN_ :提交者名稱(尊重.mailmap,見 [git-shortlog [1]](https://git-scm.com/docs/git-shortlog) 或 [git-blame [1]](https://git-scm.com/docs/git-blame) )
* _%ce_ :提交者電子郵件
* _%cE_ :提交者電子郵件(尊重.mailmap,參見 [git-shortlog [1]](https://git-scm.com/docs/git-shortlog) 或 [git-blame [1]](https://git-scm.com/docs/git-blame) )
* _%cd_ :提交者日期(格式尊重 - 日期=選項)
* _%cD_ :提交者日期,RFC2822樣式
* _%cr_ :提交者日期,相對
* _%ct_ :提交者日期,UNIX時間戳
* _%ci_ :提交者日期,類似ISO 8601的格式
* _%cI_ :提交者日期,嚴格的ISO 8601格式
* _%d_ :引用名稱,如 [git-log [1]](https://git-scm.com/docs/git-log) 的--decorate選項
* _%D_ :沒有“(”,“)”包裝的引用名稱。
* _%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_ :顯示主鍵的指紋,其子鍵用于簽名提交的簽名
* _%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]](https://git-scm.com/docs/git-shortlog) 或 [git-blame [1]](https://git-scm.com/docs/git-blame) )
* _%ge_ :reflog身份電子郵件
* _%gE_ :reflog身份郵件(尊重.mailmap,見 [git-shortlog [1]](https://git-scm.com/docs/git-shortlog) 或 [git-blame [1]](https://git-scm.com/docs/git-blame) )
* _%gs_ :reflog主題
* _%Cred_ :將顏色切換為紅色
* _%Cgreen_ :將顏色切換為綠色
* _%Cblue_ :將顏色切換為藍色
* _%Creset_ :重置顏色
* _%C(...)_:顏色規格,如 [git-config [1]](https://git-scm.com/docs/git-config) 的“CONFIGURATION FILE”部分中的值所述。默認情況下,僅在啟用日志輸出時顯示顏色(通過`color.diff`,`color.ui`或`--color`,并且如果我們要去終端,則尊重前者的`auto`設置)。 `%C(auto,...)`被接受為默認的歷史同義詞(例如,`%C(auto,red)`)。即使沒有啟用顏色,指定`%C(always,...)`也會顯示顏色(盡管只考慮使用`--color=always`為整個輸出啟用顏色,包括這種格式和其他任何git可能顏色的顏色)。單獨`auto`(即`%C(auto)`)將打開下一個占位符的自動著色,直到再次切換顏色。
* _%m_ :左(`<`),右(`>`)或邊界(`-`)標記
* _%n_ :換行符
* _%%_ :原始_%_
* _%x00_ :從十六進制代碼打印一個字節
* _%w([< w> [,< i1> [,< i2>]]])_:切換行換行,類似 [git-shortlog [1]的-w選項](https://git-scm.com/docs/git-shortlog)。
* _%<(< N> [,trunc | ltrunc | mtrunc])_:使下一個占位符至少取N列,如果需要,在右邊填充空格。如果輸出長于N列,則可以選擇在開頭(ltrunc),中間(mtrunc)或結尾(trunc)截斷。請注意,截斷僅適用于N> = 2。
* _%< |(< N>)_:使下一個占位符至少占用第N列,如果需要,在右邊填充空格
* _%>(< N>)_,_%> |(< N>)_:與_%相似,_%< |(< N>)_,但左邊的填充空格_
* _%>(< N>)_,_%> |(< N>)_:類似于_%>(< N>分別是_,_%> |(< N>)_,除非下一個占位符占用的空間多于給定的空間并且左側有空格,請使用這些空格
* _%><(< N>)_,_%>< |(< N>)_:類似于_%<(< N> )_,_%< |(< N>)_,但填充兩側(即文本居中)
* %(預告片[:options]):顯示 [git-interpret-trailers [1]](https://git-scm.com/docs/git-interpret-trailers) 解釋的正文預告片。 `trailers`字符串后面可以跟冒號和零個或多個逗號分隔選項。如果給出了`only`選項,則省略拖車塊中的非拖車線。如果給出`unfold`選項,則表現得就像給出了interpre-trailer的`--unfold`選項一樣。例如,`%(trailers:only,unfold)`兩者都做。
| 注意 | 一些占位符可能依賴于修訂遍歷引擎的其他選項。例如,`%g*` reflog選項將插入一個空字符串,除非我們遍歷reflog條目(例如,通過`git log -g`)。如果命令行中尚未提供`--decorate`,`%d`和`%D`占位符將使用“短”裝飾格式。 |
如果在占位符的_%_之后添加`+`(加號),則在擴展之前插入換行符當且僅當占位符擴展為非空字符串時。
如果在占位符的_%_之后添加`-`(減號),則當且僅當占位符擴展為空字符串時,才會刪除緊接在擴展之前的所有連續換行符。
如果在占位符的_%_之后添加一個“空格”,則在擴展之前插入一個空格,當且僅當占位符擴展為非空字符串時。
* _tformat:_
_格式:_格式與_格式完全相同:_,除了它提供“終結符”語義而不是“分隔符”語義。換句話說,每個提交都附加了消息終止符(通常是換行符),而不是在條目之間放置的分隔符。這意味著單行格式的最終??輸入將使用新行正確終止,就像“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
部分 [git [1]](https://git-scm.com/docs/git) 套件
- git
- git-config
- git-help
- git-init
- git-clone
- git-add
- git-status
- git-diff
- git-commit
- git-reset
- git-rm
- git-mv
- git-branch
- git-checkout
- git-merge
- git-mergetool
- git-log
- git-stash
- git-tag
- git-worktree
- git-fetch
- git-pull
- git-push
- git-remote
- git-submodule
- git-show
- git-log
- git-shortlog
- git-describe
- git-apply
- git-cherry-pick
- git-rebase
- git-revert
- git-bisect
- git-blame
- git-grep
- gitattributes
- giteveryday
- gitglossary
- githooks
- gitignore
- gitmodules
- gitrevisions
- gittutorial
- gitworkflows
- git-am
- git-format-patch
- git-send-email
- git-request-pull
- git-svn
- git-fast-import
- git-clean
- git-gc
- git-fsck
- git-reflog
- git-filter-branch
- git-instaweb
- git-archive
- git-bundle
- git-daemon
- git-update-server-info
- git-cat-file
- git-check-ignore
- git-checkout-index
- git-commit-tree
- git-count-objects
- git-diff-index
- git-for-each-ref
- git-hash-object
- git-ls-files
- git-merge-base
- git-read-tree
- git-rev-list
- git-rev-parse
- git-show-ref
- git-symbolic-ref
- git-update-index
- git-update-ref
- git-verify-pack
- git-write-tree