設定與組態
取得與建立專案
基本快照
分支與合併
分享與更新專案
檢查與比較
修補
除錯
電子郵件
外部系統
伺服器管理
指南
- gitattributes
- 命令列介面規範
- Git 日常使用
- 常見問題 (FAQ)
- 詞彙表
- 掛鉤 (Hooks)
- gitignore
- gitmodules
- 修訂版本 (Revisions)
- 子模組
- 教學
- 工作流程
- 所有指南...
管理
底層命令 (Plumbing Commands)
-
2.55.0
2026-06-29
-
2.54.0
2026-04-20
-
2.53.0
2026-02-02
-
2.52.0
2025-11-17
- 2.51.2 無變更
-
2.51.1
2025-10-15
-
2.51.0
2025-08-18
- 2.50.1 無變更
-
2.50.0
2025-06-16
- 2.49.1 無變更
-
2.49.0
2025-03-14
- 2.48.1 → 2.48.2 無變更
-
2.48.0
2025-01-10
- 2.46.1 → 2.47.3 無變更
-
2.46.0
2024-07-29
- 2.45.4 無變更
-
2.45.3
2024-11-26
- 2.45.1 → 2.45.2 無變更
-
2.45.0
2024-04-29
- 2.44.1 → 2.44.4 無變改
-
2.44.0
2024-02-23
- 2.43.3 → 2.43.7 無變更
-
2.43.2
2024-02-13
- 2.43.1 無變更
-
2.43.0
2023-11-20
- 2.42.2 → 2.42.4 無變更
-
2.42.1
2023-11-02
-
2.42.0
2023-08-21
- 2.41.1 → 2.41.3 無變更
-
2.41.0
2023-06-01
- 2.40.1 → 2.40.4 無變更
-
2.40.0
2023-03-12
- 2.39.1 → 2.39.5 無變更
-
2.39.0
2022-12-12
- 2.38.3 → 2.38.5 無變更
-
2.38.2
2022-12-11
- 2.38.1 無變更
-
2.38.0
2022-10-02
- 2.37.1 → 2.37.7 無變更
-
2.37.0
2022-06-27
- 2.36.1 → 2.36.6 無變更
-
2.36.0
2022-04-18
- 2.35.1 → 2.35.8 無變更
-
2.35.0
2022-01-24
- 2.33.3 → 2.34.8 無變更
-
2.33.2
2022-03-23
-
2.33.1
2021-10-12
-
2.33.0
2021-08-16
- 2.32.1 → 2.32.7 無變更
-
2.32.0
2021-06-06
- 2.31.1 → 2.31.8 無變更
-
2.31.0
2021-03-15
- 2.30.1 → 2.30.9 無變更
-
2.30.0
2020-12-27
- 2.29.1 → 2.29.3 無變更
-
2.29.0
2020-10-19
- 2.28.1 無變更
-
2.28.0
2020-07-27
- 2.27.1 無變更
-
2.27.0
2020-06-01
- 2.26.1 → 2.26.3 無變更
-
2.26.0
2020-03-22
- 2.25.2 → 2.25.5 無變更
-
2.25.1
2020-02-17
-
2.25.0
2020-01-13
- 2.24.1 → 2.24.4 無變更
-
2.24.0
2019-11-04
- 2.23.1 → 2.23.4 無變更
-
2.23.0
2019-08-16
- 2.22.1 → 2.22.5 無變更
-
2.22.0
2019-06-07
- 2.21.1 → 2.21.4 無變更
-
2.21.0
2019-02-24
- 2.20.1 → 2.20.5 無變更
-
2.20.0
2018-12-09
- 2.19.3 → 2.19.6 無變更
-
2.19.2
2018-11-21
- 2.19.1 無變更
-
2.19.0
2018-09-10
- 2.18.1 → 2.18.5 無變更
-
2.18.0
2018-06-21
- 2.17.1 → 2.17.6 無變更
-
2.17.0
2018-04-02
-
2.16.6
2019-12-06
-
2.15.4
2019-12-06
-
2.14.6
2019-12-06
-
2.13.7
2018-05-22
-
2.12.5
2017-09-22
-
2.11.4
2017-09-22
-
2.10.5
2017-09-22
-
2.9.5
2017-07-30
-
2.8.6
2017-07-30
-
2.7.6
2017-07-30
-
2.6.7
2017-05-05
-
2.5.6
2017-05-05
-
2.4.12
2017-05-05
-
2.3.10
2015-09-28
-
2.2.3
2015-09-04
-
2.1.4
2014-12-17
-
2.0.5
2014-12-17
描述
顯示提交紀錄。
列出可以從給定的提交透過追蹤 parent(父提交)連結到達的提交,但排除那些前面帶有 ^ 的提交。輸出預設為反向時間順序。
您可以將其視為集合運算。從命令列給出的任何提交可到達的提交形成一個集合,然後從前面帶有 ^ 的任何提交可到達的提交將從該集合中減去。剩下的提交就是該命令的輸出結果。各種其他選項和路徑參數可用於進一步限制結果。
因此,以下命令
$ git log foo bar ^baz
意為「列出所有可從 foo 或 bar 到達,但無法從 baz 到達的提交」。
特殊的表示法「<commit1>..<commit2>」可以用作「^<commit1> <commit2>」的簡寫。例如,以下兩者可以互換使用
$ git log origin..HEAD $ git log HEAD ^origin
另一個特殊表示法是「<commit1>...<commit2>」,這對合併操作很有用。產生的提交集合是兩個運算元之間的對稱差。以下兩個命令是等價的
$ git log A B --not $(git merge-base --all A B) $ git log A...B
此命令接受適用於 git-rev-list[1] 命令的選項來控制顯示內容和方式,以及適用於 git-diff[1] 命令的選項來控制如何顯示每個提交引入的變更。
選項
--follow-
在重新命名後繼續列出檔案的歷史紀錄(僅適用於單一檔案)。
--no-decorate--decorate[=(short|full|auto|no)]-
列印所顯示任何提交的參照名稱。可用的值為
選項
--decorate是--decorate=short的簡寫。預設使用log.decorate的配置值(如果已設定),否則預設為auto。 --decorate-refs=<pattern>--decorate-refs-exclude=<pattern>-
對於每個候選參照,如果它符合傳遞給
--decorate-refs-exclude的任何 <pattern> 參數,或者如果它不符合傳遞給--decorate-refs的任何 <pattern> 參數,則不要將其用於修飾。配置選項log.excludeDecoration允許從修飾中排除參照,但明確的--decorate-refs模式將覆蓋log.excludeDecoration中的匹配項。如果未給出這些選項或配置設定,則當參照符合
HEAD、refs/heads/、refs/remotes/、refs/stash/或refs/tags/時,將被用作修飾。 --clear-decorations-
當指定此選項時,它會清除所有先前的
--decorate-refs或--decorate-refs-exclude選項,並放寬預設修飾篩選器以包含所有參照。如果設定檔值log.initialDecorationSet被設定為all,則預設採用此選項。 --source-
列印命令列中給出且到達每個提交的參照名稱。
--mailmap--no-mailmap--use-mailmap--no-use-mailmap-
使用 mailmap 檔案將作者和提交者的姓名及電子郵件地址對應到規範的真實姓名和電子郵件地址。請參閱 git-shortlog[1]。
--full-diff-
若沒有此旗標,
gitlog-p<path>... 會顯示觸及指定路徑的提交,以及關於這些指定路徑的差異。加上此參數後,將會顯示觸及指定路徑的提交的完整差異;這意味著「<path>...」僅限制提交,而不限制這些提交的差異。請注意,這會影響所有基於差異的輸出類型,例如由
--stat等產生的輸出。 --log-size-
在每個提交的輸出中包含一行
logsize<number>,其中 <number> 是該提交訊息的位元組長度。旨在透過允許提前分配空間來加速從gitlog輸出讀取日誌訊息的工具。 -L<start>,<end>:<file>-L:<funcname>:<file>-
追蹤由 <start>
,<end> 給出的行範圍,或由 <file> 內的函式名稱正規表示式 <funcname> 給出的演變過程。您不得提供任何路徑規格限制器。這目前僅限於從單一修訂版本開始的遍歷,即您只能提供零個或一個正向修訂版本參數,且 <start> 和 <end>(或 <funcname>)必須存在於起始修訂版本中。您可以多次指定此選項。隱含--patch。可以使用--no-patch抑制修補程式輸出。支援非修補程式差異格式--raw、--name-only、--name-status和--summary。差異統計格式(--stat、--numstat、--shortstat、--dirstat)目前尚未實作。支援修補程式格式化選項(如
--word-diff、--color-moved、--no-prefix)和空白選項(-w、-b),以及挖掘選項(-S、-G)和--diff-filter。<start> 和 <end> 可以採用以下形式之一
-
<number>
如果 <start> 或 <end> 是數字,它指定一個絕對行號(行號從 1 開始計數)。
-
/<regex>/此形式將使用匹配給定 POSIX <regex> 的第一行。如果 <start> 是正規表示式,它將從上一個
-L範圍(如果有)的末尾開始搜尋,否則從檔案開頭開始搜尋。如果 <start> 是^/<regex>/,它將從檔案開頭開始搜尋。如果 <end> 是正規表示式,它將從 <start> 給出的行開始搜尋。 -
+<offset> 或-<offset>這僅對 <end> 有效,並將指定 <start> 給出的行之前或之後的行數。
如果給出
:<funcname> 來代替 <start> 和 <end>,它是一個正規表示式,表示從匹配 <funcname> 的第一個函式名稱行到下一個函式名稱行之間的範圍。:<funcname> 從上一個-L範圍(如果有)的末尾開始搜尋,否則從檔案開頭開始搜尋。^:<funcname> 從檔案開頭開始搜尋。函式名稱的確定方式與gitdiff計算補丁區塊標頭(patch hunk headers)的方式相同(參見 gitattributes[5] 中的 Defining a custom hunk-header)。 -
- <revision-range>
-
僅顯示指定修訂範圍內的提交。當未指定 <revision-range> 時,預設為
HEAD(即導致當前提交的整個歷史紀錄)。origin..HEAD指定所有從當前提交(即HEAD)可到達,但從origin不可到達的提交。如需拼寫 <revision-range> 的完整方法列表,請參閱 gitrevisions[7] 的「指定範圍」(Specifying Ranges) 一節。 - [
--] <path>... -
僅顯示足以解釋符合指定路徑的檔案如何產生的提交。詳細資訊和其他簡化模式請參閱下文的「歷史簡化」(History Simplification)。
當產生混淆時,可能需要在路徑前加上
--以將其與選項或修訂範圍分開。
提交限制
除了使用說明中所述的特殊標記來指定應列出的提交範圍外,還可以套用額外的提交限制。
除非另有說明,否則使用更多選項通常會進一步限制輸出(例如 --since=<日期1> 限制為比 <日期1> 更新的提交,而將其與 --grep=<模式> 配合使用則進一步限制為日誌訊息中有符合 <模式> 之行的提交)。
請注意,這些會在提交排序和格式化選項(例如 --reverse)之前套用。
-<number>-n<number>--max-count=<number>-
將輸出限制為應顯示的前 <number> 個提交。
--max-count-oldest=<number>-
將輸出限制為應顯示的最後 <number> 個提交。
--skip=<number>-
在開始顯示提交輸出之前跳過 <數量> 個提交。
--since=<date>--after=<date>-
顯示比 <date> 更新的提交。作為特殊情況,today 指的是上一個午夜。
--since-as-filter=<date>-
顯示所有比 <日期> 更新的提交。這會訪問範圍內的所有提交,而不是在遇到第一個早於 <日期> 的提交時停止。
--until=<date>--before=<date>-
顯示比 <日期> 更舊的提交。
--author=<pattern>--committer=<pattern>-
將提交輸出限制為作者/提交者欄位符合 <模式> 正規表示式的提交。如果有多個
--author=<模式>,則會選擇作者符合任何一個 <模式> 的提交(多個--committer=<模式> 亦然)。 --grep-reflog=<pattern>-
將提交輸出限制為參照日誌 (reflog) 分錄符合 <模式> 正規表示式的提交。如果有多個
--grep-reflog,則會選擇其參照日誌訊息符合任何給定模式的提交。除非使用了--walk-reflogs,否則使用此選項會發生錯誤。 --grep=<pattern>-
將提交輸出限制為日誌訊息符合 <模式> 正規表示式的提交。如果有多個
--grep=<模式>,則會選擇訊息符合任何一個 <模式> 的提交(但請參閱--all-match)。當
--notes生效時,來自附註 (notes) 的訊息也會進行比對,就好像它是日誌訊息的一部分一樣。 --all-match-
將提交輸出限制為符合所有給定
--grep的提交,而不是符合至少一個的提交。 --invert-grep-
將提交輸出限制為日誌訊息不符合
--grep=<模式> 指定之 <模式> 的提交。 -i--regexp-ignore-case-
在比對正規表示式限制模式時不區分大小寫。
--basic-regexp-
將限制模式視為基本正規表示式 (BRE);這是預設值。
-E--extended-regexp-
將限制模式視為擴展正規表示式 (ERE),而不是預設的基本正規表示式。
-F--fixed-strings-
將限制模式視為固定字串(不將模式解釋為正規表示式)。
-P--perl-regexp-
將限制模式視為 Perl 相容的正規表示式 (PCRE)。
對這些類型的正規表示式的支援是可選的編譯時依賴項。如果 Git 在編譯時未包含對其支援,提供此選項將導致程式終止。
--remove-empty-
當給定路徑從樹中消失時停止。
--merges-
僅列印合併提交。這與
--min-parents=2完全相同。 --no-merges-
不要列印具有多個父提交的提交。這與
--max-parents=1完全相同。 --min-parents=<number>--max-parents=<number>--no-min-parents--no-max-parents-
僅顯示具有至少(或最多)多個父提交的提交。具體來說,
--max-parents=1等同於--no-merges,--min-parents=2等同於--merges。--max-parents=0會給出所有根提交,而--min-parents=3則給出所有章魚合併 (octopus merges)。--no-min-parents和--no-max-parents會再次重設這些限制(設為無限制)。等效形式為--min-parents=0(任何提交都有 0 個或多個父提交)和--max-parents=-1(負數表示無上限)。 --first-parent-
在尋找要包含的提交時,遇到合併提交僅跟隨第一個父提交。在查看特定主題分支的演變時,此選項可以提供更好的概覽,因為合併到主題分支通常只是為了不時調整以適應更新的上游,而此選項允許您忽略此類合併引入到您的歷史記錄中的個別提交。
此選項亦會將合併提交的預設差異格式變更為
first-parent,詳細資訊請參閱--diff-merges=first-parent。 --exclude-first-parent-only-
在尋找要排除的提交時(使用 ^),在遇到合併提交時僅跟隨第一個父提交。這可以用於查找主題分支中從其偏離遠端分支之點開始的變更集,前提是任意合併都可以是有效的主題分支變更。
--maximal-only-
將輸出提交限制為無法從修訂版本範圍內任何其他提交可達的那些提交。
--not-
反轉所有後續修訂版本指定符的 ^ 前綴(或缺少前綴)的含義,直到下一個
--not。當在命令列中的 --stdin 之前使用時,通過 stdin 傳遞的修訂版本將不受其影響。反之,當通過標準輸入傳遞時,在命令列中傳遞的修訂版本將不受其影響。 --all-
假裝命令列中列出了
refs/中的所有參照以及HEAD作為 <提交>。 --branches[=<pattern>]-
假裝命令列中列出了
refs/heads中的所有參照作為 <提交>。如果給定了 <模式>,則將分支限制為符合給定 shell 全域比對模式 (glob) 的分支。如果模式中缺少 ?、* 或 [,則隱含結尾處為 /*。 --tags[=<pattern>]-
假裝命令列中列出了
refs/tags中的所有參照作為 <提交>。如果給定了 <模式>,則將標籤限制為符合給定 shell 全域比對模式的標籤。如果模式中缺少 ?、* 或 [,則隱含結尾處為 /*。 --remotes[=<pattern>]-
假裝命令列中列出了
refs/remotes中的所有參照作為 <提交>。如果給定了 <模式>,則將遠端追蹤分支限制為符合給定 shell 全域比對模式的分支。如果模式中缺少 ?、* 或 [,則隱含結尾處為 /*。 --glob=<glob-pattern>-
假裝命令列中列出了所有符合 shell 全域比對模式 <全域比對模式> 的參照作為 <提交>。如果缺少領頭的 refs/,會自動補上。如果模式中缺少 ?、* 或 [,則隱含結尾處為 /*。
--exclude=<glob-pattern>-
不要包含符合 <全域比對模式> 的參照,否則下一個
--all、--branches、--tags、--remotes或--glob會考慮這些參照。重複此選項會累積排除模式,直到遇到下一個--all、--branches、--tags、--remotes或--glob選項為止(其他選項或引數不會清除累積的模式)。當套用於
--branches、--tags或--remotes時,給定的模式不應分別以refs/heads、refs/tags或refs/remotes開頭;當套用於--glob或--all時,它們必須以refs/開頭。如果需要結尾的 /*,必須明確給出。 -
參考對應的
fetch.hideRefs、receive.hideRefs或uploadpack.hideRefs設定以及transfer.hideRefs,不要包含會被git-fetch、git-receive-pack或git-upload-pack隱藏的參照(請參閱 git-config[1])。此選項會影響下一個虛擬參照選項--all或--glob,並在處理後清除。 --reflog-
假裝參照日誌 (reflog) 提到的所有物件都作為 <提交> 列在命令列中。
--alternate-refs-
假裝備份儲存庫(alternate repositories)的參照頂端提到的所有物件都列在命令列中。備份儲存庫是指在
objects/info/alternates中指定其物件目錄的任何儲存庫。包含的物件集可以由core.alternateRefsCommand等修改。請參閱 git-config[1]。 --single-worktree-
預設情況下,當存在多個工作樹時,下列選項會檢查所有工作樹(請參閱 git-worktree[1]):
--all、--reflog和--indexed-objects。此選項強制它們僅檢查目前工作樹。 --ignore-missing-
在輸入中看到無效的物件名稱時,假裝沒有給出該錯誤輸入。
--bisect-
假裝在命令列中列出了錯誤的二分搜尋參照
refs/bisect/bad,後面跟著--not和正確的二分搜尋參照refs/bisect/good-*。 --stdin-
除了從命令列獲取引數外,也從標準輸入讀取引數。這接受提交和類似
--all和--glob=的虛擬選項。當看到--分隔符時,後續輸入將被視為路徑並用於限制結果。通過標準輸入讀取的標記(如--not)僅對以相同方式傳遞的引數有效,不會影響任何後續的命令列引數。 --cherry-mark-
類似於
--cherry-pick(見下文),但用=標記等效的提交而不是省略它們,並用+標記不等效的提交。 --cherry-pick-
當提交集以對稱差(symmetric difference)受限時,省略任何引入與“另一側”另一個提交相同變更的提交。
例如,如果您有兩個分支
A和B,列出僅在其中一側的所有提交的常用方法是使用--left-right(參見下面--left-right選項說明中的範例)。但是,它會顯示從另一個分支揀選 (cherry-picked) 過來的提交(例如,“3rd on b”可能是從分支 A 揀選的)。使用此選項,此類提交對將從輸出中排除。 --left-only--right-only-
僅列出對稱差中相應一側的提交,即僅列出會被
--left-right標記為 < 或 > 的提交。例如,
--cherry-pick--right-onlyA...B會省略B中位於A中或與A中的提交補丁等效的提交。換句話說,這列出了來自gitcherryAB的+提交。更準確地說,--cherry-pick--right-only--no-merges給出了確切的列表。 --cherry-
--right-only--cherry-mark--no-merges的同義詞;對於將輸出限制在我們這一側的提交,並用gitlog--cherryupstream...mybranch(類似於gitcherryupstreammybranch)標記那些已套用到分叉歷史另一側的提交非常有用。 -g--walk-reflogs-
遍歷參照日誌分錄(從最新到最舊),而不是遍歷提交祖先鏈。使用此選項時,您不能指定要排除的提交(即不能使用
^<提交>、<提交1>..<提交2> 和 <提交1>...<提交2> 記法)。當
--pretty格式不是oneline和reference時(原因顯而易見),這會導致輸出中包含兩行額外的從參照日誌中獲取的資訊。輸出中的參照日誌指定符可以顯示為ref@{<第N個>}(其中 <第N個> 是參照日誌中反向時間順序的索引)或ref@{<時間戳記>}(帶有該分錄的 <時間戳記>),具體取決於一些規則:-
如果起始點被指定為
ref@{<第N個>},則顯示索引格式。 -
如果起始點被指定為
ref@{now},則顯示時間戳記格式。 -
如果兩者都沒使用,但在命令列上給出了
--date,則以--date要求的格式顯示時間戳記。 -
否則,顯示索引格式。
在
--pretty=oneline下,提交訊息在同一行會加上此資訊的前綴。此選項不能與--reverse結合使用。另請參閱 git-reflog[1]。在
--pretty=reference下,根本不會顯示此資訊。 -
--merge-
顯示範圍
HEAD...<other> 內涉及衝突路徑的提交,其中 <other> 是MERGE_HEAD、CHERRY_PICK_HEAD、REVERT_HEAD或REBASE_HEAD中第一個存在的虛擬參照。僅在索引具有未合併分錄時才有效。此選項可用於在解決三方合併衝突時顯示相關提交。 --boundary-
輸出排除的邊界提交。邊界提交以前綴
-標示。
歷史簡化
有時您只對歷史的一部分感興趣,例如修改特定 <路徑> 的提交。但是 歷史簡化 有兩個部分,一部分是選擇提交,另一部分是如何執行,因為有各種策略可以簡化歷史。
以下選項選擇要顯示的提交:
請注意,可以顯示額外的提交以提供有意義的歷史。
以下選項影響執行簡化的方式:
預設模式-
將歷史簡化為解釋樹的最終狀態的最簡歷史。最簡是因為如果最終結果相同(即合併內容相同的分支),它會剪除一些側邊分支。
--show-pulls-
包含預設模式下的所有提交,但也包含任何與第一個父提交不 TREESAME 但與後面的父提交 TREESAME 的合併提交。此模式有助於顯示 "首次引入" 變更至分支的合併提交。
--full-history-
與預設模式相同,但不剪除某些歷史。
--dense-
僅顯示選定的提交,加上一些為了構成有意義歷史的提交。
--sparse-
顯示簡化歷史中的所有提交。
--simplify-merges-
--full-history的附加選項,用於從結果歷史中刪除一些不必要的合併,因為沒有選定的提交對此合併有貢獻。 --ancestry-path[=<commit>]-
當給定要顯示的提交範圍(例如 <提交1>
..<提交2> 或 <提交2>^<提交1>)以及該範圍內的一個提交 <提交> 時,僅顯示該範圍內是 <提交> 的祖先、<提交> 的後代或 <提交> 本身的提交。如果未指定提交,則使用 <提交1>(範圍中排除的部分)作為 <提交>。可以多次傳遞;如果多次傳遞,則提交若為給定的任何提交或其祖先或後代,則會被包含在內。
更詳細的解釋如下。
假設您指定 foo 為 <路徑>。我們將修改 foo 的提交稱為 !TREESAME,其餘的稱為 TREESAME。(在為 foo 過濾的 diff 中,它們分別看起來不同和相同。)
在下文中,我們將始終引用同一個範例歷史來說明簡化設定之間的差異。我們假設您正在過濾此提交圖中的檔案 foo:
.-A---M---N---O---P---Q / / / / / / I B C D E Y \ / / / / / `-------------' X
歷史水平線 A---Q 被視為每個合併的第一個父提交。提交如下:
-
I是初始提交,其中foo存在且內容為asdf,並且檔案quux存在且內容為quux。初始提交與空樹進行比較,因此I是 !TREESAME。 -
在
A中,foo僅包含foo。 -
B包含與A相同的變更。其合併M是微不足道的,因此與所有父提交都是 TREESAME。 -
C沒有更改foo,但其合併N將其更改為foobar,因此它與任何父提交都不是 TREESAME。 -
D將foo設為baz。其合併O將來自N和D的字串組合為foobarbaz;即它與任何父提交都不是 TREESAME。 -
E將quux更改為xyzzy,其合併P將字串組合為quuxxyzzy。P與O是 TREESAME,但與E不是。 -
X是一個獨立的根提交,添加了一個新檔案side,而Y修改了它。Y與X是 TREESAME。其合併Q將side添加到P,且Q與P是 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。E、C和B都被遍歷了,但只有B是 !TREESAME,所以其他的不會出現。請注意,在沒有父提交重寫的情況下,實際上無法談論提交之間的父/子關係,因此我們將它們顯示為斷開的。
--full-history進行父提交重寫-
普通提交僅在它們是 !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 \ / / `---------'
請注意與
--full-history相比,N、P和Q的主要差異:-
N的父列表移除了I,因為它是另一個父提交M的祖先。儘管如此,N仍然保留,因為它是 !TREESAME。 -
P的父列表同樣移除了I。P隨後被完全移除,因為它有一個父提交且是 TREESAME。 -
Q的父列表將Y簡化為X。然後移除了X,因為它是 TREESAME 根提交。隨後Q被完全移除,因為它有一個父提交且是 TREESAME。
-
還有一種簡化模式可用:
--ancestry-path[=<commit>]-
將顯示的提交限制為那些是 <提交> 的祖先、後代或 <提交> 本身的提交。
作為範例用例,請考慮以下提交歷史:
D---E-------F / \ \ B---C---G---H---I---J / \ A-------K---------------L--M
常規的 D..M 計算作為
M祖先但排除作為D祖先的提交集。這對於查看自D以來通往M的歷史發生了什麼非常有用,從某種意義上說,“M擁有什麼是D中不存在的”。在此範例中,結果將是所有提交,除了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=HD..M將導致:E \ C---G---H---I---J \ L--M
而
--ancestry-path=KD..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,該檔案隨後被 A、B 和 X 以不同方式修改。單一父系的提交 C、Z 和 Y 沒有變更 file.txt。合併提交 M 是透過解決合併衝突,納入 A 和 B 的變更所建立的,因此它與兩者皆非 TREESAME。然而,合併提交 R 是透過忽略 M 處 file.txt 的內容,僅採用 X 處 file.txt 的內容所建立的。因此,R 與 X 為 TREESAME,但與 M 不是。最後,建立 N 的自然合併解析是採用 R 處 file.txt 的內容,因此 N 與 R 為 TREESAME,但與 C 不是。合併提交 O 和 P 與其第一父系為 TREESAME,但分別與其第二父系 Z 和 Y 並非 TREESAME。
使用預設模式時,N 和 R 都有一個 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 不太可能是用於合併到重要分支的合併提交。相反,合併 N 用於將 R 和 X 合併到重要分支。此提交的提交訊息中可能包含有關變更 X 為何覆蓋來自 A 和 B 的變更的資訊。
--show-pulls-
除了預設歷史中顯示的提交外,還顯示每個與其第一父提交不是 TREESAME 但與後面父提交是 TREESAME 的合併提交。
當合併提交被
--show-pulls包含時,該合併被視為從另一個分支 "拉取" (pulled) 了變更。在此範例中使用--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(可能會被簡化掉)。
提交排序
預設情況下,提交會按反向時間順序顯示。
--date-order-
在顯示所有子節點之前不顯示父節點,除此之外按提交時間戳記順序顯示提交。
--author-date-order-
在顯示所有子節點之前不顯示父節點,除此之外按作者時間戳記順序顯示提交。
--topo-order-
在顯示所有子節點之前不顯示父節點,並避免交替顯示多條歷史線上的提交。
例如,在如下的提交歷史中
---1----2----4----7 \ \ 3----5----6----8---
其中數字表示提交時間戳記的順序,
gitrev-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結合使用。
提交格式化
--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>(如果顯示,它也會修改差異輸出)選項可用於指定前綴的最小長度。這應該會使
--pretty=oneline對於使用 80 欄終端機的人來說更具可讀性。 --no-abbrev-commit-
顯示完整的 40 位元組十六進位提交物件名稱。這會抵消
--abbrev-commit,無論是顯式的還是由--oneline等其他選項隱含的。它還會覆蓋log.abbrevCommit變數。 --oneline-
這是
--pretty=oneline--abbrev-commit同時使用的簡寫。 --encoding=<encoding>-
提交物件在其編碼標頭中記錄用於日誌訊息的字元編碼;此選項可用於告訴指令以使用者偏好的編碼重新編碼提交日誌訊息。對於非底層指令,預設為 UTF-8。請注意,如果物件聲稱以
X編碼且我們正在以X輸出,我們將原樣輸出該物件;這意味著原始提交中的無效序列可能會被複製到輸出中。同樣地,如果 iconv(3) 無法轉換提交,我們將靜默地原樣輸出原始物件。 --expand-tabs=<n>--expand-tabs--no-expand-tabs-
在顯示之前,在日誌訊息中執行製表符擴展(將每個製表符替換為足夠的空格,以填滿至下一個顯示欄位,該欄位是 <n> 的倍數)。
--expand-tabs是--expand-tabs=8的簡寫,而--no-expand-tabs是--expand-tabs=0的簡寫,後者會停用製表符擴展。預設情況下,在將日誌訊息縮排 4 個空格的美化格式(即預設的
medium、full和fuller)中會擴展製表符。 --notes[=<ref>]-
顯示提交日誌訊息時,同時顯示註解提交的附註(參見 git-notes[1])。當指令列中沒有給定
--pretty、--format或--oneline選項時,這是gitlog、gitshow和gitwhatchanged指令的預設行為。預設情況下,顯示的附註來自
core.notesRef和notes.displayRef變數(或相應的環境變數覆蓋)中列出的附註引用 (refs)。詳情請參見 git-config[1]。使用選用的 <ref> 參數,使用該引用來尋找要顯示的附註。當引用以
refs/notes/開頭時,可以指定完整的引用名稱;當它以notes/、refs/開頭時,否則會加上refs/notes/前綴來形成引用的完整名稱。可以組合多個
--notes選項來控制顯示哪些附註。例如:"--notes=foo" 將僅顯示來自refs/notes/foo的附註;"--notes=foo--notes" 將同時顯示來自 "refs/notes/foo" 和預設附註引用的附註。 --no-notes-
不顯示附註。這會透過重設顯示附註的引用清單來抵消上述
--notes選項。選項按指令列上給出的順序解析,因此例如 "--notes--notes=foo--no-notes--notes=bar" 將僅顯示來自refs/notes/bar的附註。 --show-notes-by-default-
除非給出了顯示特定附註的選項,否則顯示預設附註。
--show-notes[=<ref>]--standard-notes--no-standard-notes-
這些選項已棄用。請改用上述
--notes/--no-notes選項。 --show-signature-
透過將簽名傳遞給
gpg--verify來檢查已簽名提交物件的有效性,並顯示輸出。 --relative-date-
--date=relative的同義詞。 --date=<format>-
僅對以人類可讀格式顯示的日期生效,例如使用
--pretty時。配置變數log.date設定 log 命令的--date選項的預設值。預設情況下,日期以原始時區(提交者或作者的時區)顯示。如果將-local附加到格式(例如iso-local),則改用使用者的本地時區。--date=relative顯示相對於當前時間的日期,例如「2 小時前」。-local選項對--date=relative沒有影響。--date=local是--date=default-local的別名。--date=iso(或--date=iso8601)以類似 ISO 8601 的格式顯示時間戳記。與嚴格 ISO 8601 格式的差異在於-
使用空格代替
T日期/時間分隔符 -
時間和時區之間有一個空格
-
時區的小時和分鐘之間沒有冒號
--date=iso-strict(或--date=iso8601-strict)以嚴格的 ISO 8601 格式顯示時間戳記。--date=rfc(或--date=rfc2822)以 RFC 2822 格式顯示時間戳記,常見於電子郵件訊息中。--date=short僅顯示日期,不顯示時間,格式為YYYY-MM-DD。--date=raw顯示自紀元(1970-01-01 00:00:00 UTC)以來的秒數,後跟一個空格,然後是作為 UTC 偏移量的時區(一個+或-後接四位數字;前兩位是小時,後兩位是分鐘)。即,如同時間戳記是用strftime("%s%z") 格式化一樣。請注意,-local選項不會影響自紀元以來的秒數值(始終以 UTC 為單位計算),但會切換隨附的時區值。--date=human如果時區與當前時區不符,則顯示時區;如果年份符合則不列印年份(即對於「今年」的日期跳過列印年份,如果是最近幾天的日期,我們可以直接說明是星期幾,則跳過完整的日期本身)。對於更早的日期,小時和分鐘也會被省略。--date=unix將日期顯示為 Unix 紀元時間戳記(自 1970 年以來的秒數)。與--raw一樣,這始終以 UTC 為單位,因此-local沒有作用。--date=format:<format> 將 <format> 傳遞給您的系統strftime,但在內部處理的%s、%z和%Z除外。使用--date=format:%c以您系統區域設定的首選格式顯示日期。有關格式佔位符的完整列表,請參閱strftime(3) 手冊。使用-local時,正確的語法是--date=format-local:<format>。--date=default是預設格式,基於 ctime(3) 輸出。它顯示一行包含三個字母的星期幾、三個字母的月份、月份中的日期、HH:MM:SS 格式的小時-分鐘-秒,後接 4 位數年份,外加時區資訊(除非使用本地時區),例如ThuJan100:00:001970+0000。 -
--parents-
同時列印提交的父提交(格式為「commit parent…」)。同時啟用父提交重寫,請參閱上文的「歷史簡化」。
--children-
同時列印提交的子提交(格式為「commit child…」)。同時啟用父提交重寫,請參閱上文的「歷史簡化」。
--left-right-
標記提交可從對稱差的哪一側到達。來自左側的提交加上 < 前綴,來自右側的提交加上 > 前綴。如果與
--boundary結合使用,這些提交將加上-前綴。例如,如果您有此拓撲結構
y---b---b branch B / \ / / . / / \ o---x---a---a branch A
您將得到類似這樣的輸出
$ git rev-list --left-right --boundary --pretty=oneline A...B >bbbbbbb... 3rd on b >bbbbbbb... 2nd on b <aaaaaaa... 3rd on a <aaaaaaa... 2nd on a -yyyyyyy... 1st on b -xxxxxxx... 1st on a
--graph-
在輸出的左側繪製提交歷史紀錄的文字圖形表示。這可能會導致在提交之間列印額外的行,以便正確繪製圖形歷史紀錄。不能與
--no-walk組合使用。這會啟用父提交重寫,請參閱上文的「歷史簡化」。
這預設隱含
--topo-order選項,但也可以指定--date-order選項。 --show-linear-break[=<barrier>]-
當不使用
--graph時,所有歷史紀錄分支都會被扁平化,這可能使人難以看出兩個連續的提交不屬於線性分支。在此情況下,此選項會在它們之間放置一個屏障。如果指定了 <barrier>,它將是代替預設值顯示的字串。 --graph-lane-limit=<n>-
當使用
--graph時,限制要顯示的圖形通道數。超過限制的通道將被截斷標記 ~ 取代。預設值為 0(無限制),零和負值將被忽略並視為無限制。
漂亮格式 (PRETTY FORMATS)
如果該提交是一個合併,且 pretty-format 不是 oneline、email 或 raw,則會在 Author: 行之前插入額外的一行。此行以 "Merge: " 開頭,並列出祖先提交的雜湊值,以空格分隔。請注意,如果您限制了歷史視圖,則列出的提交不一定是「直接」父提交清單:例如,如果您只感興趣於與特定目錄或文件相關的變更。
有幾種內建格式,您可以透過將 pretty.<名稱> 配置選項設定為另一個格式名稱或 format: 字串來定義額外格式,如下所述(參見 git-config[1])。以下是內建格式的詳細資訊:
oneline-
<hash> <title-line>此格式旨在盡可能簡潔。
short-
commit <hash> Author: <author> _ <title-line>_ medium-
commit <hash> Author: <author> Date: <author-date> _ <title-line> <full-commit-message>_ full-
commit <hash> Author: <author> Commit: <committer> _ <title-line> <full-commit-message>_ fuller-
commit <hash> Author: <author> AuthorDate: <author-date> Commit: <committer> CommitDate: <committer-date> _ <title-line> <full-commit-message>_ reference-
<abbrev-hash> (<title-line>,<short-author-date>)此格式用於在提交訊息中引用另一個提交,等同於
--pretty='format:%C(auto)%h(%s,%ad)。預設情況下,日期格式化為--date=short,除非顯式指定了另一個--date選項。與任何帶有格式佔位符的format:一樣,其輸出不受--decorate和--walk-reflogs等其他選項的影響。 email-
From <hash> <date> From: <author> Date: <author-date> Subject: [PATCH] <title-line> _ <full-commit-message>_ mboxrd-
與
email類似,但提交訊息中以 "From " 開頭的行(前面有零個或多個 ">")會用 ">" 括起來,以免被誤認為是新提交的開始。 raw-
raw格式顯示提交物件中完全相同的整個提交。值得注意的是,無論是否使用--abbrev或--no-abbrev,雜湊值都會完整顯示,且「父提交 (parents)」資訊顯示真實的父提交,不考慮嫁接 (grafts) 或歷史簡化。請注意,此格式會影響提交的顯示方式,但不會影響差異 (diff) 的顯示方式(例如使用gitlog--raw)。若要在原始差異格式中獲取完整物件名稱,請使用--no-abbrev。 format:<format-string>-
format:<格式字串> 格式允許您指定想要顯示的資訊。它的工作方式有點像 printf 格式,但顯著的例外是您使用%n而不是 \n 來換行。例如,format:"The author of %h was %an, %ar%nThe title was >>%s<<%n" 將顯示如下內容:
The author of fe6e0ee was Junio C Hamano, 23 hours ago The title was >>t4119: test autocomputing -p<n> for traditional diff input.<<
佔位符如下:
-
擴展為單個字面字元的佔位符:
-
影響後續佔位符格式的佔位符:
%Cred-
切換顏色為紅色
%Cgreen-
切換顏色為綠色
%Cblue-
切換顏色為藍色
%Creset-
重設顏色
%C(<spec>)-
顏色規範,如 git-config[1] 的「設定檔」章節中的 Values 下所述。預設情況下,僅在為日誌輸出啟用顏色時才會顯示顏色(透過
color.diff、color.ui或--color,並在前往終端時尊重前者的auto設定)。%C(auto,<spec>) 被接受作為預設值的歷史同義詞(例如%C(auto,red))。指定%C(always,<spec>) 將即使在未啟用顏色時也會顯示顏色(儘管考慮直接使用--color=always來為整個輸出啟用顏色,包括此格式和 git 可能著色的任何其他內容)。僅auto(即%C(auto))將開啟下一個佔位符的自動著色,直到顏色再次切換。 %m-
左 (<)、右 (>) 或邊界 (
-) 標記 %w([<w>[,<i1>[,<i2>]]])-
切換自動換行,類似於 git-shortlog[1] 的
-w選項。 - %<(<n>[
,(trunc|ltrunc|mtrunc)]) -
使下一個佔位符佔據至少 N 個欄位寬度,必要時在右側填充空格。如果輸出長於 <n> 個欄位,則可選擇在左側 (ltrunc)
..ft、中間 (mtrunc)mi..le或末尾 (trunc)rig..進行截斷(使用省略號..)。注意 1:截斷僅在 <n> >= 2 時正常工作。注意 2:<n> 和 <m>(見下文)值周圍的空格是可選的。注意 3:表情符號 (Emoji) 和其他寬字元將佔據兩個顯示欄位,這可能會超出欄位邊界。注意 4:分解字元的組合標記在填充邊界處可能會錯位。 - %<|(<m> )
-
使下一個佔位符至少佔據到第 <m> 個顯示欄位,必要時在右側填充空格。對於從終端視窗右邊緣測量的欄位位置,請使用負的 <m> 值。
- %>(<n>)
- %>|(<m>)
-
分別類似於 %<(<n>), %<|(<m>),但在左側填充空格
- %>>(<n>)
- %>>|(<m>)
-
分別類似於 %>(<n>), %>|(<m>),但如果下一個佔位符佔用的空間多於給定的空間,且其左側有空格,則使用這些空格
- %><(<n>)
- %><|(<m>)
-
分別類似於 %<(<n>), %<|(<m>),但在兩側填充(即文字居中)
-
擴展為從提交中提取的資訊的佔位符:
%H-
提交雜湊值
%h-
簡短提交雜湊值
%T-
樹狀物件雜湊值
%t-
簡短樹狀物件雜湊值
%P-
父提交雜湊值
%p-
簡短父提交雜湊值
%an-
作者姓名
%aN-
作者姓名(遵循 .mailmap,參見 git-shortlog[1] 或 git-blame[1])
%ae-
作者電子郵件
%aE-
作者電子郵件(遵循 .mailmap,參見 git-shortlog[1] 或 git-blame[1])
%al-
作者電子郵件的使用者名稱部分(
@符號之前的部分) %aL-
作者使用者名稱部分(見
%al)遵循 .mailmap,參見 git-shortlog[1] 或 git-blame[1]) %ad-
作者日期(格式遵循 --date= 選項)
%aD-
作者日期,RFC2822 風格
%ar-
作者日期,相對時間
%at-
作者日期,UNIX 時間戳記
%ai-
作者日期,類 ISO 8601 格式
%aI-
作者日期,嚴格 ISO 8601 格式
%as-
作者日期,簡短格式 (
YYYY-MM-DD) %ah-
作者日期,人性化風格(類似 git-rev-list[1] 的
--date=human選項) %cn-
提交者姓名
%cN-
提交者姓名(遵循 .mailmap,參見 git-shortlog[1] 或 git-blame[1])
%ce-
提交者電子郵件
%cE-
提交者電子郵件(遵循 .mailmap,參見 git-shortlog[1] 或 git-blame[1])
%cl-
提交者電子郵件的使用者名稱部分(
@符號之前的部分) %cL-
提交者使用者名稱部分(見
%cl)遵循 .mailmap,參見 git-shortlog[1] 或 git-blame[1]) %cd-
提交者日期(格式遵循 --date= 選項)
%cD-
提交者日期,RFC2822 風格
%cr-
提交者日期,相對時間
%ct-
提交者日期,UNIX 時間戳記
%ci-
提交者日期,類 ISO 8601 格式
%cI-
提交者日期,嚴格 ISO 8601 格式
%cs-
提交者日期,簡短格式 (
YYYY-MM-DD) %ch-
提交者日期,人性化風格(類似 git-rev-list[1] 的
--date=human選項) %d-
參照名稱,類似 git-log[1] 的 --decorate 選項
%D-
沒有 " (", ")" 包裝的參照名稱。
%(count)-
補丁系列中補丁的編號。僅用於
format-patch中的--commit-list-format %(total)-
補丁系列中補丁的總數。僅用於
format-patch中的--commit-list-format %(decorate[:<option>,...])-
具有自訂裝飾的參照名稱。
decorate字串後可以跟一個冒號和零個或多個以逗號分隔的選項。選項值可以包含字面格式化代碼。由於逗號 (%x2C) 和右括號 (%x29) 在選項語法中的作用,必須對它們使用格式化代碼。例如,要產生沒有包裝或標籤註解,且以空格作為分隔符的裝飾:
%(decorate:prefix=,suffix=,tag=,separator= )
%(describe[:<option>,...])-
人性化可讀的名稱,類似 git-describe[1];對於無法描述的提交,顯示空字串。
describe字串後可以跟一個冒號和零個或多個以逗號分隔的選項。當同時新增或移除標籤時,描述可能會不一致。 %S-
在命令行中給出的用於到達該提交的參照名稱(類似
gitlog--source),僅對gitlog有效 %e-
編碼
%s-
主旨
%f-
經過清理的主旨行,適合用作文件名
%b-
內文
%B-
原始內文(未換行的主旨和內文)
%N-
提交註釋 (commit notes)
%GG-
來自 GPG 對已簽署提交的原始驗證訊息
- %G?
-
顯示 "G" 表示良好(有效)簽名,"B" 表示錯誤簽名,"U" 表示有效但有效性未知的簽名,"X" 表示已過期的良好簽名,"Y" 表示由已過期金鑰製作的良好簽名,"R" 表示由已撤銷金鑰製作的良好簽名,"E" 表示無法檢查簽名(例如缺少金鑰),"N" 表示沒有簽名
%GS-
顯示已簽署提交的簽署者姓名
%GK-
顯示用於簽署已簽署提交的金鑰
%GF-
顯示用於簽署已簽署提交的金鑰指紋
%GP-
顯示其子金鑰用於簽署已簽署提交的主金鑰指紋
%GT-
顯示用於簽署已簽署提交的金鑰信任級別
%gD-
參照日誌 (reflog) 選取器,例如
refs/stash@{1}或refs/stash@{2minutesago};格式遵循為-g選項描述的規則。@之前的部分是命令行中給出的參照名稱(因此gitlog-grefs/heads/master將產生refs/heads/master@{0})。 %gd-
簡短的參照日誌選取器;與
%gD相同,但參照名稱部分為了人類可讀性而縮短(因此refs/heads/master僅變為master)。 %gn-
參照日誌身份名稱
%gN-
參照日誌身份名稱(遵循 .mailmap,參見 git-shortlog[1] 或 git-blame[1])
%ge-
參照日誌身份電子郵件
%gE-
參照日誌身份電子郵件(遵循 .mailmap,參見 git-shortlog[1] 或 git-blame[1])
%gs-
參照日誌主旨
%(trailers[:<option>,...])-
顯示由 git-interpret-trailers[1] 解釋的內文尾註 (trailers)。
trailers字串後可以跟一個冒號和零個或多個以逗號分隔的選項。如果任何選項被多次提供,則以最後一次出現的為準。key=<key>-
僅顯示具有指定 <鍵> 的尾註。匹配不區分大小寫,且末尾冒號是可選的。如果多次給出該選項,則會顯示與任何鍵匹配的尾註行。此選項會自動啟用
only選項,從而隱藏尾註塊中的非尾註行。如果不希望這樣,可以使用only=false禁用它。例如,%(trailers:key=Reviewed-by) 顯示鍵為Reviewed-by的尾註行。 only[=<bool>]-
選擇是否應包含尾註塊中的非尾註行。
separator=<sep>-
指定插入在尾註行之間的分隔符。預設為換行符。字串 <分隔符> 可以包含上述的字面格式化代碼。若要使用逗號作為分隔符,必須使用
%x2C,否則它會被解析為下一個選項。例如,%(trailers:key=Ticket,separator=%x2C) 以逗號和空格分隔顯示所有鍵為Ticket的尾註行。 unfold[=<bool>]-
使其行為如同給出了 interpret-trailer 的
--unfold選項。例如,%(trailers:only,unfold=true) 會展開並顯示所有尾註行。 keyonly[=<bool>]-
僅顯示尾註的鍵部分。
valueonly[=<bool>]-
僅顯示尾註的值部分。
key_value_separator=<sep>-
指定插入在每個尾註的鍵與值之間的分隔符。預設為 ": "。除此之外,它與上述的
separator=<分隔符> 具有相同的語義。
注意某些佔位符可能取決於給予版本遍歷引擎的其他選項。例如,除非我們正在遍歷參照日誌項目(例如透過 gitlog-g),否則%g*參照日誌選項將插入一個空字串。如果在命令行中尚未提供--decorate,則%d和%D佔位符將使用 "short" 裝飾格式。布林選項接受一個可選的值 [
=<布林值>]。git-config[1] 的--type=bool所接受的值(如yes和off)都可被接受。給予不帶=<值> 的布林選項相當於給予帶有=true的選項。如果您在佔位符的
%之後加入+(加號),則當且僅當佔位符擴展為非空字串時,會在擴展前立即插入換行符。如果您在佔位符的
%之後加入-(減號),則當且僅當佔位符擴展為空字串時,會刪除緊接在擴展前的所有連續換行符。如果您在佔位符的
%之後加入 (空格),則當且僅當佔位符擴展為非空字串時,會在擴展前立即插入一個空格。
-
tformat:-
tformat:格式的工作原理與format:完全相同,不同之處在於它提供「結束符 (terminator)」語義而非「分隔符 (separator)」語義。換句話說,每個提交都會附加訊息結束字元(通常是換行符),而不是在項目之間放置分隔符。這意味著單行格式的最後一項將像 "oneline" 格式一樣被換行符正確終止。例如:$ git log -2 --pretty=format:%h 4da45bef \ | perl -pe '$_ .= " -- NO NEWLINE\n" unless /\n/' 4da45be 7134973 -- NO NEWLINE $ git log -2 --pretty=tformat:%h 4da45bef \ | perl -pe '$_ .= " -- NO NEWLINE\n" unless /\n/' 4da45be 7134973
此外,任何包含
%的無法辨識字串都會被解釋為前面帶有tformat:。例如,這兩者是等效的:$ git log -2 --pretty=tformat:%h 4da45bef $ git log -2 --pretty=%h 4da45bef
差異格式
預設情況下,git log 不會產生任何差異輸出。可以使用下方的選項來顯示每個提交所做的變更。
請注意,除非明確給出了 --diff-merges 的變體之一(包括簡短的 -m、-c、--cc 和 --dd 選項),否則合併提交將不會顯示差異,即使選擇了像 --patch 這樣的差異格式,它們也不會符合像 -S 這樣的搜尋選項。例外情況是在使用 --first-parent 時,這種情況下 first-parent 是合併提交的預設格式。
-p-u--patch-
產生修補檔(請參見 使用 -p 產生修補檔文字)。
-s--no-patch-
隱藏差異機制的所有輸出。對於像
gitshow這樣預設顯示修補檔的指令,可以用來壓制其輸出,或者取消指令列中先前在別名中定義的--patch、--stat等選項的效果。 -m-
以預設格式顯示合併提交的差異。這與
--diff-merges=on類似,只是除非同時給出-p,否則-m不會產生輸出。 -c-
為合併提交產生組合差異輸出。
--diff-merges=combined-p的捷徑。 --cc-
為合併提交產生壓縮的組合差異輸出。
--diff-merges=dense-combined-p的捷徑。 --dd-
產生相對於第一父提交的差異,適用於合併提交和一般提交。
--diff-merges=first-parent-p的捷徑。 --remerge-diff-
為合併提交產生重新合併差異輸出。
--diff-merges=remerge-p的捷徑。 --no-diff-merges-
--diff-merges=off的同義詞。 --diff-merges=<format>-
指定用於合併提交的差異格式。除非使用
--first-parent,否則預設為 `off`,在這種情況下first-parent是預設值。支援以下格式
offnone-
停用合併提交的差異輸出。對於覆蓋隱含值很有用。
onm-
使合併提交的差異輸出以預設格式顯示。可以使用
log.diffMerges配置變數變更預設格式,其預設值為separate。 first-parent1-
顯示相對於第一父提交的完整差異。這與
--patch為非合併提交產生的格式相同。 separate-
顯示相對於每個父提交的完整差異。為每個父提交產生單獨的日誌條目和差異。
combinedc-
同時顯示從每個父提交到合併結果的差異,而不是一次顯示一個父提交與結果之間的兩兩差異。此外,它僅列出所有父提交中修改過的檔案。
dense-combinedcc-
透過省略那些在父提交中僅有兩個變體且合併結果未經修改地採用其中之一的非重要區塊,進一步壓縮
--diff-merges=combined產生的輸出。 remerger-
重新合併兩父提交的合併提交以建立一個臨時樹物件——可能包含帶有衝突標記的檔案等。然後顯示該臨時樹與實際合併提交之間的差異。
使用此選項時輸出的內容可能會有所變更,與其他選項的互動也是如此(除非明確記錄)。
--combined-all-paths-
導致組合差異(用於合併提交)列出來自所有父提交的檔案名稱。因此,它僅在
--diff-merges=[dense-]combined正在使用時才有效,並且可能僅在偵測到檔案名稱變更(即已請求重新命名或複製偵測)時才有用。 -U<n>--unified=<n>-
產生具有 <n> 行上下文的差異。上下文行數預設為
diff.context,如果未設定該組態變數則預設為 3。(由於歷史因素,不帶 <n> 的-U會被默認為-p的別名)。隱含--patch。 --output=<file>-
輸出到指定檔案而非標準輸出 (stdout)。
--output-indicator-new=<char>--output-indicator-old=<char>--output-indicator-context=<char>-
指定在產生的修補檔中,用於指示新行、舊行或上下文行的字元。通常分別為
+、-和 ' '。 --raw-
對於每個提交,使用原始差異格式顯示變更摘要。請參閱 git-diff[1] 的「原始輸出格式」(RAW OUTPUT FORMAT) 一節。這與以原始格式顯示日誌本身不同,後者可以透過
--format=raw達成。 --patch-with-raw-
-p--raw的別名。 -t-
在差異輸出中顯示樹物件。
--indent-heuristic-
啟用偏移差異區塊 (hunk) 邊界的啟發式演算法,使修補檔更易於閱讀。這是預設值。
--no-indent-heuristic-
停用縮排啟發式演算法。
--minimal-
花費額外時間以確保產生最小可能的差異。
--patience-
使用 "patience diff" 演算法產生差異。
--histogram-
使用 "histogram diff" 演算法產生差異。
--anchored=<text>-
使用 "anchored diff" 演算法產生差異。
此選項可以指定多次。
如果一行同時存在於來源和目的地,且僅出現一次,並以 <text> 開頭,此演算法會嘗試防止它在輸出中顯示為刪除或新增。它在內部使用 "patience diff" 演算法。
--diff-algorithm=(patience|minimal|histogram|myers)-
選擇差異演算法。變體如下:
例如,如果您將
diff.algorithm變數配置為非預設值,但想使用預設值,則必須使用--diff-algorithm=default選項。 --stat[=<width>[,<name-width>[,<count>]]]-
產生 diffstat。預設情況下,檔名部分將盡可能使用所需的空間,其餘部分用於圖表部分。最大寬度預設為終端寬度,如果未連接到終端,則為 80 個字元,並可由 <寬度> 覆蓋。檔名部分的寬度可以透過在逗號後提供另一個寬度 <名稱寬度> 或透過設定
diff.statNameWidth=<名稱寬度> 來限制。圖表部分的寬度可以透過使用--stat-graph-width=<圖表寬度> 或透過設定diff.statGraphWidth=<圖表寬度> 來限制。使用--stat或--stat-graph-width會影響所有產生統計圖表的指令,而設定diff.statNameWidth或diff.statGraphWidth不會影響gitformat-patch。透過提供第三個參數 <計數>,您可以將輸出限制為前 <計數> 行,如果還有更多行,則後面跟著 ...。這些參數也可以單獨使用
--stat-width=<width>、--stat-name-width=<name-width> 和--stat-count=<count> 來設定。 --compact-summary-
在 diffstat 中輸出擴展標頭資訊的簡要摘要,例如檔案建立或刪除("new" 或 "gone",如果是符號連結則可選擇
+l)和模式更改(分別使用+x或-x表示新增或移除可執行位元)。資訊放在檔案名稱部分和圖形部分之間。隱含--stat。 --numstat-
類似於
--stat,但以十進位表示法顯示新增和刪除的行數,並顯示不含縮寫的路徑名稱,使其對機器更友善。對於二進位檔案,輸出兩個-而非顯示00。 --shortstat-
僅輸出
--stat格式的最後一行,包含修改後的檔案總數,以及新增和刪除的行數。 -X[<param>,...]--dirstat[=<param>,...]-
輸出每個子目錄相對變更量的分佈。透過傳遞逗號分隔的參數清單,可以自訂
--dirstat的行為。預設值由diff.dirstat配置變數控制(參見 git-config[1])。下列參數可用:changes-
透過計算從來源移除或新增到目的地的行數來計算 dirstat 數值。這會忽略檔案內純粹的程式碼移動。換句話說,重新排列檔案中的行不像其他變更那樣被大量計算。這是未提供參數時的預設行為。
lines-
透過執行一般的基於行的差異分析來計算 dirstat 數值,並加總移除/新增的行數。(對於二進位檔案,則計算 64 位元組的區塊,因為二進位檔案沒有自然的「行」概念)。這比
changes行為更耗費資源,但它會將檔案內重新排列的行視為與其他變更一樣重要。產生的輸出與您從其他--*stat選項獲得的結果一致。 files-
透過計算更改的檔案數量來計算 dirstat 數值。每個更改的檔案在 dirstat 分析中的權重相等。這是計算上最便宜的
--dirstat行為,因為它根本不需要查看檔案內容。 cumulative-
同時計算子目錄中對父目錄的變更。請注意,使用
cumulative時,報告的百分比總和可能會超過 100%。預設(非累進)行為可以使用noncumulative參數指定。 - <limit>
-
整數參數指定截斷百分比(預設為 3%)。變更佔比低於此百分比的目錄不會顯示在輸出中。
範例:下列指令將計算更改的檔案,同時忽略變更佔比低於總量 10% 的目錄,並在父目錄中累加子目錄的計數:
--dirstat=files,10,cumulative。 --cumulative-
--dirstat=cumulative的別名。 --dirstat-by-file[=<param>,...]-
--dirstat=files,<param>,...的別名。 --summary-
輸出擴展標頭資訊的簡要摘要,例如建立、重新命名和模式更改。
--patch-with-stat-
-p--stat的別名。 -z-
用 NUL 分隔提交,而不是換行符。
此外,當給出
--raw或--numstat時,不要修改路徑名,並使用 NUL 作為輸出欄位結束符。若不使用此選項,具有「不尋常」字元的路徑名稱將按照配置變數
core.quotePath的說明進行引用(參見 git-config[1])。 --name-only-
僅顯示後映像 (post-image) 樹中每個更改檔案的名稱。檔案名稱通常以 UTF-8 編碼。更多資訊請參見 git-log[1] 手冊頁中有關編碼的討論。
--name-status-
僅顯示每個更改檔案的名稱和狀態。有關狀態字母的含義,請參閱
--diff-filter選項的說明。與--name-only一樣,檔案名稱通常以 UTF-8 編碼。 --submodule[=<format>]-
指定如何顯示子模組中的差異。當指定
--submodule=short時,使用short格式。此格式僅顯示範圍開頭和結尾的提交名稱。當指定--submodule或--submodule=log時,使用log格式。此格式列出範圍內的提交,如同 git-submodule[1] 的summary所做的那樣。當指定--submodule=diff時,使用diff格式。此格式顯示提交範圍之間子模組內容變更的內聯差異。預設為diff.submodule,如果未設定該配置選項,則為short格式。 --color[=<when>]-
顯示有顏色的差異。
--color(即不含=<when>)與--color=always相同。<when> 可以是always、never或auto之一。 --no-color-
關閉彩色差異。這與
--color=never相同。 --color-moved[=<mode>]-
移動的程式碼行會以不同的顏色顯示。如果不提供該選項,<mode> 預設為
no;如果提供不帶模式的選項,則預設為zebra。模式必須是下列之一:no-
移動的行不突出顯示。
default-
zebra的別名。這在未來可能會改為更合理的模式。 plain-
在一個位置新增且在另一個位置移除的任何行將以
color.diff.newMoved著色。類似地,color.diff.oldMoved將用於在差異中其他位置新增的移除行。此模式會識別任何移動的行,但在檢閱中對於確定程式碼區塊是否在沒有置換的情況下移動並非很有用。 blocks-
貪婪地偵測至少 20 個英數字元的移動文字區塊。偵測到的區塊使用
color.diff.(old|new)Moved顏色繪製。相鄰區塊無法區分。 zebra-
如同
blocks模式偵測移動文字區塊。區塊使用color.diff.(old|new)Moved顏色或color.diff.(old|new)MovedAlternative顏色繪製。兩種顏色之間的切換表示偵測到了新區塊。 dimmed-zebra-
類似於
zebra,但會對移動程式碼中不感興趣的部分進行額外變暗處理。兩個相鄰區塊的邊界行被認為是有趣的,其餘部分是不感興趣的。dimmed_zebra是已棄用的別名。
--no-color-moved-
關閉移動偵測。這可用於覆蓋組態設定。這與
--color-moved=no相同。 --color-moved-ws=<mode>,...-
這配置了執行
--color-moved的移動偵測時如何忽略空白。這些模式可以作為逗號分隔的清單提供: --no-color-moved-ws-
執行移動偵測時不要忽略空白。這可用於覆蓋組態設定。這與
--color-moved-ws=no相同。 --word-diff[=<mode>]-
預設情況下,單字由空白分隔;請參見下文的
--word-diff-regex。<mode> 預設為plain,且必須是下列之一:請注意,儘管第一種模式有名稱,但如果啟用了顏色,則在所有模式下都會使用顏色來突出顯示更改的部分。
--word-diff選項的操作方式是採用不加該選項時所產生的逐行差異,並計算每個區塊內的逐字變更。這可能會產生比專用逐字差異工具更大的差異。如果 Git 將來採用了不同的實作,輸出可能會改變。請注意,這類似於--diff-algorithm選項,該選項也可能會改變輸出。 --word-diff-regex=<regex>-
使用 <regex> 來決定什麼是一個單字,而不是將非空白序列視為單字。除非已經啟用,否則也隱含
--word-diff。<regex> 的每個非重疊匹配項都被視為一個單字。這些匹配項之間的任何內容都被視為空白,並且在尋找差異時會被忽略(!)。您可能希望在正規表示式中附加 |[
^[:space:]],以確保它匹配所有非空白字元。包含換行符的匹配項會在換行符處靜默截斷(!)。例如,
--word-diff-regex=.將每個字元視為一個單字,並相應地逐字元顯示差異。正規表示式也可以透過差異驅動程式或配置選項設定,參見 gitattributes[5] 或 git-config[1]。顯式指定它會覆蓋任何差異驅動程式或配置設定。差異驅動程式會覆蓋組態設定。
--color-words[=<regex>]-
相當於
--word-diff=color加上(如果指定了正規表示式)--word-diff-regex=<regex>。 --no-renames-
關閉重新命名偵測,即使配置檔案預設為開啟。
--rename-empty--no-rename-empty-
是否使用空白內容物件作為重新命名來源。
--check-
如果變更引入了衝突標記或空白錯誤,則發出警告。什麼被視為空白錯誤由
core.whitespace配置控制。預設情況下,尾隨空白(包括僅由空白組成的行)和在行初始縮排內緊隨製表符 (tab) 之後的空格字元被視為空白錯誤。如果發現問題,則以非零狀態碼退出。與--exit-code不相容。 --ws-error-highlight=<kind>-
在差異的
context、old或new行中突出顯示空白錯誤。多個值由逗號分隔,none重設先前的值,default將清單重設為new,而all是old,new,context的簡寫。當未提供此選項,且配置變數diff.wsErrorHighlight未設定時,僅突出顯示new行中的空白錯誤。空白錯誤使用color.diff.whitespace著色。 --full-index-
在產生修補檔格式輸出時,在 "index" 行顯示完整的前映像和後映像內容物件名稱,而非僅顯示前幾個字元。
--binary-
除了
--full-index之外,還產生一個可以使用git-apply套用的二進位差異。隱含--patch。 --abbrev[=<n>]-
在 diff-raw 格式輸出和 diff-tree 標頭行中,不顯示完整的 40 位元組十六進位物件名稱,而是顯示唯一引用該物件的長度至少為 <n> 個十六進位位元的縮寫。在 diff-patch 輸出格式中,
--full-index優先權較高,即如果指定了--full-index,則無論是否指定--abbrev,都會顯示完整的內容物件名稱。非預設的位元數可以使用--abbrev=<n> 指定。 -B[<n>][/<m>]--break-rewrites[=[<n>][/<m>]]-
將完全重寫的變更拆分為刪除和建立對。這有兩個目的:
它影響變更的方式,將檔案的完全重寫不視為一系列刪除和插入混合在一起(其中只有極少數行恰好在文字上匹配作為上下文),而是視為單次刪除所有舊內容,後接單次插入所有新內容。數字 <m> 控制
-B選項的這一方面(預設為 60%)。-B/70%指定結果中應保留少於 30% 的原始內容,Git 才會將其視為完全重寫(否則產生的修補檔將是一系列混合了上下文行的刪除和插入)。當與
-M一起使用時,完全重寫的檔案也被視為重新命名的來源(通常-M僅將消失的檔案視為重新命名的來源),數字 <n> 控制-B選項的這一方面(預設為 50%)。-B20%指定與檔案大小的 20% 或更多相比具有新增和刪除的變更有資格被選為可能的重新命名到另一個檔案的來源。 -M[<n>]--find-renames[=<n>]-
若要產生差異(diffs),請為每個提交偵測並報告重新命名。若要在走訪歷史記錄時追蹤檔案重新命名,請參閱
--follow。若指定了 <n>,則它是相似度索引的閾值(即相較於檔案大小的新增/刪除量)。例如,-M90%表示若檔案有超過 90% 的內容未變更,Git 應將刪除/新增對視為重新命名。若沒有%符號,該數字將被視為分數,且小數點位於其前方。即-M5變為 0.5,因此與-M50%相同。同樣地,-M05與-M5%相同。若要將偵測限制為精確的重新命名,請使用-M100%。預設的相似度索引為 50%。 -C[<n>]--find-copies[=<n>]-
偵測複製以及重新命名。另請參見
--find-copies-harder。如果指定了 <n>,其含義與-M<n> 相同。 --find-copies-harder-
出於效能原因,預設情況下,僅當複製的原始檔案在同一個變更集中被修改時,
-C選項才會尋找複製。此旗標使指令檢查未修改的檔案作為複製來源的候選者。對於大型專案來說,這是一項非常耗資源的操作,請謹慎使用。提供多個-C選項具有相同的效果。 -D--irreversible-delete-
省略刪除的前映像,即僅列印標頭,而不列印前映像與
/dev/null之間的差異。產生的修補檔不打算使用patch或gitapply套用;這僅適用於只想專注於檢閱變更後文字的人員。此外,輸出顯然缺乏足夠的資訊來反向套用此類修補檔,即使是手動套用也是如此,這就是該選項名稱的由來。與
-B一起使用時,也會省略刪除/建立對中刪除部分的前映像。 -l<num>-
-M和-C選項涉及一些初步步驟,可以廉價地偵測重新命名/複製的子集,然後是一個詳盡的後備部分,將所有剩餘的未配對目的地與所有相關來源進行比較。(對於重新命名,僅剩餘的未配對來源是相關的;對於複製,所有原始來源都是相關的。)對於 N 個來源和目的地,此詳盡檢查的複雜度為 O(N^2)。如果涉及的來源/目的地檔案數量超過指定數量,此選項可防止執行重新命名/複製偵測的詳盡部分。預設為diff.renameLimit。請注意,值 0 被視為無限制。 --diff-filter=[(A|C|D|M|R|T|U|X|B)...[*]]-
僅選擇已新增 (
A)、已複製 (C)、已刪除 (D)、已修改 (M)、已重新命名 (R)、類型(即一般檔案、符號連結、子模組等)已變更 (T)、未合併 (U)、未知 (X) 或配對已斷開 (B) 的檔案。可以使用過濾字元的任何組合(包括無)。當組合中加入*(全選或不選) 時,如果比較中有任何檔案符合其他標準,則選擇所有路徑;如果沒有檔案符合其他標準,則不選擇任何內容。此外,這些大寫字母可以改為小寫以排除。例如,
--diff-filter=ad排除新增和刪除的路徑。請注意,並非所有差異都能具備所有類型。例如,如果停用了對這些類型的偵測,則無法出現複製和重新命名的項目。
-S<string>-
尋找更改檔案中指定 <string> 出現次數(即新增/刪除)的差異。供腳本編寫者使用。
當您正在尋找特定的程式碼區塊(如結構體)並想知道該區塊自最初產生以來的歷史記錄時,這非常有用:反覆使用此功能將前映像中有趣的區塊饋送回
-S,並一直繼續下去,直到獲得該區塊的最早版本。也會搜尋二進位檔案。
-G<regex>-
尋找修補檔文字中包含符合 <regex> 的新增/移除行的差異。
為了說明
-S<regex>--pickaxe-regex和-G<regex> 之間的區別,請考慮同一個檔案中具有以下差異的提交:+ return frotz(nitfol, two->ptr, 1, 0); ... - hit = frotz(nitfol, mf2.ptr, 1, 0);
雖然 git log -G"frotz\(nitfol" 會顯示此提交,但 git log -S"frotz\(nitfol" --pickaxe-regex 則不會(因為該字串的出現次數沒有改變)。
除非提供
--text,否則沒有 textconv 過濾器的二進位檔案修補檔將被忽略。更多資訊請參閱 gitdiffcore[7] 中的 pickaxe 條目。
--find-object=<object-id>-
尋找更改指定物件出現次數的差異。類似於
-S,只是參數不同,它不是搜尋特定字串,而是搜尋特定的物件識別碼 (ID)。該物件可以是內容物件 (blob) 或子模組提交。它在
git-log中隱含-t選項以同時尋找樹狀物件。 --pickaxe-all-
當
-S或-G找到變更時,顯示該變更集中的所有變更,而不僅僅是包含 <string> 變更的檔案。 --pickaxe-regex-
將提供給
-S的 <string> 視為擴展的 POSIX 正規表示式進行匹配。 -O<orderfile>-
控制檔案在輸出中顯示的順序。這會覆蓋
diff.orderFile配置變數(參見 git-config[1])。要取消diff.orderFile,請使用-O/dev/null。輸出順序由 <orderfile> 中的通配符模式 (glob pattern) 順序決定。所有路徑名稱符合第一個模式的檔案先輸出,所有路徑名稱符合第二個模式(但不符合第一個)的檔案接著輸出,依此類推。所有路徑名稱不符合任何模式的檔案最後輸出,就像檔案末尾有一個隱含的全部匹配模式一樣。如果多個路徑名稱具有相同的層級(它們符合相同的模式,但不符合先前的任何模式),則它們彼此之間的相對輸出順序為正常順序。
<orderfile> 的解析方式如下:
-
空行將被忽略,因此它們可用作分隔符號以提高可讀性。
-
以井字號 ("
#") 開頭的行將被忽略,因此可用於注釋。如果模式以井字號開頭,請在模式開頭添加反斜線 ("\")。 -
其他每一行都包含一個模式。
模式的語法和語意與不帶
FNM_PATHNAME旗標的fnmatch(3) 所使用的模式相同,但如果移除任意數量的最後路徑組件後路徑名稱符合模式,則路徑名稱也符合模式。例如,模式 "foo*bar" 符合 "fooasdfbar" 和 "foo/bar/baz/asdf",但不符合 "foobarx"。 -
--skip-to=<file>--rotate-to=<file>-
從輸出中丟棄指定 <file> 之前的檔案(即 跳至 (skip to)),或將它們移動到輸出的末尾(即 旋轉至 (rotate to))。這些選項主要是為了
gitdifftool指令發明的,在其他情況下可能不太有用。 -R-
交換兩個輸入;也就是說,顯示從索引或磁碟檔案到樹內容的差異。
--relative[=<path>]--no-relative-
當從專案的子目錄執行時,可以使用此選項告訴它排除該目錄之外的更改,並顯示相對於該目錄的路徑名稱。當您不在子目錄中(例如在赤裸儲存庫中)時,可以透過提供 <path> 作為參數來命名使輸出相對於哪個子目錄。
--no-relative可用於抵消diff.relative配置選項和先前的--relative。 -a--text-
將所有檔案視為文字。
--ignore-cr-at-eol-
進行比較時忽略行尾的回車符 (carriage-return)。
--ignore-space-at-eol-
忽略行尾 (EOL) 的空白變更。
-b--ignore-space-change-
忽略空白數量的變更。這會忽略行尾的空白,並將所有其他一個或多個空白字元的序列視為等效。
-w--ignore-all-space-
比較行時忽略空白。即使一行有空白而另一行沒有,這也會忽略差異。
--ignore-blank-lines-
忽略行全是空白的變更。
-I<regex>--ignore-matching-lines=<regex>-
忽略所有行均符合 <regex> 的變更。此選項可以指定多次。
--inter-hunk-context=<number>-
顯示差異修改塊之間的內容,最多到指定的 <n> 行,從而融合彼此接近的修改塊。預設為
diff.interHunkContext,如果未設定配置選項則為 0。 -W--function-context-
顯示整個函式作為每次變更的上下文行。函式名稱的確定方式與
gitdiff算出修補檔區塊標頭的方式相同(參見 gitattributes[5] 中的「定義自訂區塊標頭」)。 --ext-diff-
允許執行外部差異輔助程式。如果您使用 gitattributes[5] 設定了外部差異驅動程式,則需要將此選項與 git-log[1] 及其相關指令一起使用。
--no-ext-diff-
禁止外部差異驅動程式。
--textconv--no-textconv-
比較二進位檔案時允許(或禁止)執行外部文字轉換過濾器。詳細資訊請參見 gitattributes[5]。由於文字轉換過濾器通常是單向轉換,因此產生的差異適合人類閱讀,但無法套用。出於這個原因,文字轉換過濾器預設僅對 git-diff[1] 和 git-log[1] 啟用,而不對 git-format-patch[1] 或差異底層 (plumbing) 指令啟用。
--ignore-submodules[=(none|untracked|dirty|all)]-
在差異產生中忽略子模組的變更。
all是預設值。使用none會將包含未追蹤或已修改檔案的子模組視為已修改,或者當其HEAD與超級專案中記錄的提交不同時,也可用於覆蓋 git-config[1] 或 gitmodules[5] 中ignore選項的任何設定。當使用untracked時,如果子模組僅包含未追蹤的內容,則不會將其視為髒污(但仍會掃描其是否包含已修改的內容)。使用dirty會忽略對子模組工作樹的所有變更,僅顯示對儲存在超級專案中的提交的變更(這是 1.7.0 之前的行為)。使用all會隱藏對子模組的所有變更。 --src-prefix=<prefix>-
顯示指定的來源 <prefix> 而非 "a/"。
--dst-prefix=<prefix>-
顯示指定的目的地 <prefix> 而非 "b/"。
--no-prefix-
不顯示任何來源或目的地前綴。
--default-prefix-
使用預設的來源和目的地前綴("a/" 和 "b/")。這會覆蓋配置變數,例如
diff.noprefix、diff.srcPrefix、diff.dstPrefix和diff.mnemonicPrefix(參見 git-config[1])。 --line-prefix=<prefix>-
在輸出的每一行前面附加一個額外的 <prefix>。
--ita-invisible-in-index-
預設情況下,由
gitadd-N新增的項目在gitdiff中顯示為現有的空檔案,在gitdiff--cached中顯示為新檔案。此選項使該項目在gitdiff中顯示為新檔案,在gitdiff--cached中顯示為不存在。可以使用--ita-visible-in-index還原此選項。這兩個選項都是實驗性的,將來可能會被移除。 - --max-depth=<depth>
-
對於指令列上提供的每個路徑規格 (pathspec),最多下降 <depth> 層目錄。值為
-1表示無限制。不能與路徑規格中的通配符結合使用。給定一個包含foo/bar/baz的樹,下列清單顯示了每組選項產生的匹配項:-
--max-depth=0--foo:foo -
--max-depth=1--foo:foo/bar -
--max-depth=1--foo/bar:foo/bar/baz -
--max-depth=1--foofoo/bar:foo/bar/baz -
--max-depth=2--foo:foo/bar/baz
如果未提供路徑規格,則測量深度的基準如同指定了所有頂級條目一樣。請注意,這與從根目錄測量不同,因為
--max-depth=0仍會返回foo。這允許您在請求頂級條目子集的同時限制深度。請注意,此選項僅支援樹狀物件之間的差異,不支援針對索引或工作區的差異。
-
有關這些常用選項的更詳細說明,另請參閱 gitdiffcore[7]。
使用 -p 產生修補檔文字
執行帶有 -p 選項的 git-diff[1]、git-log[1]、git-show[1]、git-diff-index[1]、git-diff-tree[1] 或 git-diff-files[1] 會產生修補檔文字。您可以透過 GIT_EXTERNAL_DIFF 和 GIT_DIFF_OPTS 環境變數(參見 git[1])以及 diff 屬性(參見 gitattributes[5])來自訂修補檔文字的產生方式。
-p 選項產生的內容與傳統的 diff 格式略有不同
-
它前面有一個 "git diff" 標頭,看起來像這樣
diff --git a/file1 b/file2
除非涉及重新命名/複製,否則
a/和b/檔名是相同的。特別是,即使是建立或刪除,也不會使用/dev/null來代替a/或b/檔名。當涉及重新命名/複製時,
file1和file2分別顯示重新命名/複製的源檔案名稱和重新命名/複製產生的檔案名稱。 -
後面跟著一行或多行擴充標頭
oldmode<mode>newmode<mode>deletedfilemode<mode>newfilemode<mode>copyfrom<path>copyto<path>renamefrom<path>renameto<path>similarityindex<number>dissimilarityindex<number>index<hash>..<hash> <mode>檔案模式 <mode> 以 6 位八進位數字印出,包含檔案類型和檔案權限位元。
擴充標頭中的路徑名不包含
a/和b/前綴。相似度指數 (similarity index) 是未變更列數的百分比,而不相似度指數 (dissimilarity index) 是已變更列數的百分比。它是一個無條件捨去的整數,後接百分比符號。100% 的相似度指數值保留給兩個完全相同的檔案,而 100% 的不相似度則表示舊檔案中沒有任何一行進入新檔案。
index 行包含變更前後的 blob 物件名稱。如果檔案模式沒有變更,則包含 <mode>;否則會用單獨的行指示舊模式和新模式。
-
含有「不尋常」字元的路徑名會按照配置變數
core.quotePath的說明加上引號(參見 git-config[1])。 -
輸出中所有的
file1檔案都是指提交前的檔案,而所有的file2檔案則是指提交後的檔案。按順序將每個變更套用到每個檔案是不正確的。例如,這個修補檔將會交換 a 和 bdiff --git a/a b/b rename from a rename to b diff --git a/b b/a rename from b rename to a
-
區塊 (Hunk) 標頭會提到該區塊套用的函式名稱。有關如何針對特定語言調整此項目的詳細資訊,請參見 gitattributes[5] 中的「自訂區塊標頭 (Defining a custom hunk-header)」。
組合差異格式
任何產生差異的命令都可以接受 -c 或 --cc 選項,在顯示合併時產生 組合差異 (combined diff)。這是使用 git-diff[1] 或 git-show[1] 顯示合併時的預設格式。另外請注意,您可以給這些命令任何適合的 --diff-merges 選項,以強制以特定格式產生差異。
「組合差異」格式看起來像這樣
diff --combined describe.c
index fabadb8,cc95eb0..4866510
--- a/describe.c
+++ b/describe.c
@@@ -98,20 -98,12 +98,20 @@@
return (a_date > b_date) ? -1 : (a_date == b_date) ? 0 : 1;
}
- static void describe(char *arg)
-static void describe(struct commit *cmit, int last_one)
++static void describe(char *arg, int last_one)
{
+ unsigned char sha1[20];
+ struct commit *cmit;
struct commit_list *list;
static int initialized = 0;
struct commit_name *n;
+ if (get_sha1(arg, sha1) < 0)
+ usage(describe_usage);
+ cmit = lookup_commit_reference(sha1);
+ if (!cmit)
+ usage(describe_usage);
+
if (!initialized) {
initialized = 1;
for_each_ref(get_name);
-
它前面有一個 "git diff" 標頭,看起來像這樣(當使用
-c選項時)diff --combined file
或者像這樣(當使用
--cc選項時)diff --cc file
-
後面跟著一行或多行擴充標頭(本例顯示與兩個父節點的合併)
index<hash>,<hash>..<hash>mode<mode>,<mode>..<mode>newfilemode<mode>deletedfilemode<mode>,<mode>mode<mode>,<mode>..<mode> 行僅在至少有一個 <mode> 與其他模式不同時才會出現。帶有偵測到的內容移動(重新命名和複製偵測)資訊的擴充標頭旨在用於兩個 <tree-ish> 的差異,不被組合差異格式所使用。 -
後面跟著兩行的 from-file/to-file 標頭
--- a/file +++ b/file
與傳統 unified diff 格式的兩行標頭類似,
/dev/null用於表示建立或刪除的檔案。但是,如果提供了 --combined-all-paths 選項,您將得到 N+1 行的 from-file/to-file 標頭,而不是兩行,其中 N 是合併提交中父節點的數量
--- a/file --- a/file --- a/file +++ b/file
如果啟用了重新命名或複製偵測,這種擴充格式會非常有用,它能讓您看到檔案在不同父節點中的原始名稱。
-
區塊標頭格式經過修改,以防止人們意外地將其餵給
patch-p1。組合差異格式是為審查合併提交的變更而建立的,並非為了套用。此變更與擴充 index 標頭中的變更類似@@@ <from-file-range> <from-file-range> <to-file-range> @@@
組合差異格式的區塊標頭中有 (父節點數量 + 1) 個
@字元。
傳統的 unified diff 格式顯示兩個檔案 A 和 B,並使用單一列,其前綴為 -(減號 — 出現在 A 中但在 B 中移除)、+(加號 — A 中缺失但在 B 中新增)或 " "(空格 — 未變更);與此不同,此格式將兩個或多個檔案 file1, file2,… 與一個檔案 X 進行比較,並顯示 X 與每個 fileN 的不同之處。每個 fileN 都有一列會加在輸出行的前面,以說明 X 的該行與其有何不同。
第 N 列中的 - 字元表示該行出現在 fileN 中,但不在結果中。第 N 列中的 + 字元表示該行出現在結果中,而 fileN 沒有該行(換句話說,從該父節點的角度來看,該行是被新增的)。
在上述範例輸出中,函式簽名從兩個檔案中都被變更了(因此從 file1 和 file2 中分別移除了一個 -,加上 ++ 表示新增的一行在 file1 或 file2 中都沒有出現)。此外,還有其他八行與 file1 相同,但未出現在 file2 中(因此前綴為 +)。
當由 git diff-tree -c 顯示時,它會將合併提交的父節點與合併結果進行比較(即 file1..fileN 是父節點)。當由 git diff-files -c 顯示時,它會將兩個未解決的合併父節點與工作區檔案進行比較(即 file1 是 stage 2,亦即「我們的版本」,file2 是 stage 3,亦即「他們的版本」)。
範例
gitlog--no-merges-
顯示完整的提交歷史,但跳過任何合併(merges)。
gitlogv2.6.12..include/scsidrivers/scsi-
顯示自 v2.6.12 版本以來,所有變更過
include/scsi或drivers/scsi子目錄中任何檔案的提交。 gitlog--since="2weeksago"--gitk-
顯示過去兩週內對
gitk檔案的變更。--是必要的,以避免與名為gitk的分支混淆。 gitlog--name-statusrelease..test-
顯示位於「
test」分支但尚未合併至「release」分支的提交,並列出每個提交所修改的路徑。 gitlog--followbuiltin/rev-list.c-
顯示變更
builtin/rev-list.c的提交,包括在檔案重新命名為現有名稱之前的那些提交。 gitlog--branches--not--remotes=origin-
顯示所有位於任何本地分支,但不在
origin的任何遠端追蹤分支中的提交(即您擁有但 origin 沒有的提交)。 gitlogmaster--not--remotes=*/master-
顯示所有位於本地 master 分支,但不在任何遠端儲存庫 master 分支中的提交。
gitlog-p-m--first-parent-
顯示歷史記錄包含變更差異,但僅從「主分支」觀點出發,跳過來自合併分支的提交,並顯示合併所引入的完整差異。這僅在嚴格執行將所有主題分支合併到單一整合分支的原則時才有意義。
gitlog-L/intmain/',/^}/:main.c-
顯示檔案
main.c中的main() 函式如何隨時間演進。 gitlog-3-
將顯示的提交數量限制為 3 個。
討論
Git 在某種程度上與字元編碼無關。
-
blob 物件的內容是未經解釋的位元組序列。在核心層級沒有編碼轉換。
-
路徑名以 UTF-8 正規化形式 C (Normalization Form C) 編碼。這適用於樹狀物件、索引檔案、參照名稱,以及命令列參數、環境變數和設定檔(
.git/config(請參閱 git-config[1])、gitignore[5]、gitattributes[5] 和 gitmodules[5])中的路徑名。請注意,Git 在核心層級將路徑名僅視為非 NUL 位元組的序列,沒有路徑名編碼轉換(Mac 和 Windows 除外)。因此,使用非 ASCII 路徑名即便在採用舊式擴展 ASCII 編碼的平台和文件系統上大抵也能正常工作。然而,在此類系統上建立的儲存庫將無法在基於 UTF-8 的系統(如 Linux、Mac、Windows)上正常運作,反之亦然。此外,許多基於 Git 的工具直接假設路徑名為 UTF-8,且無法正確顯示其他編碼。
-
提交日誌訊息通常以 UTF-8 編碼,但也支援其他擴展 ASCII 編碼。這包括 ISO-8859-x、CP125x 等多種編碼,但「不包括」UTF-16/32、EBCDIC 和 CJK 多位元組編碼(GBK、Shift-JIS、Big5、EUC-x、CP9xx 等)。
雖然我們鼓勵將提交日誌訊息以 UTF-8 編碼,但核心和 Git Porcelain 的設計都不會強迫專案使用 UTF-8。如果特定專案的所有參與者都覺得使用舊式編碼更方便,Git 並不禁止。但是,有幾件事需要記住。
-
如果提供的提交日誌訊息看起來不是有效的 UTF-8 字串,
gitcommit和gitcommit-tree會發出警告,除非您明確說明您的專案使用舊式編碼。說明方式是在.git/config檔案中設定i18n.commitEncoding,如下所示:[i18n] commitEncoding = ISO-8859-1
使用上述設定建立的提交物件會在其
encoding標頭中記錄i18n.commitEncoding的值。這是為了幫助以後查看的人。缺少此標頭意味著提交日誌訊息是以 UTF-8 編碼的。 -
gitlog、gitshow、gitblame及其相關指令會查看提交物件的encoding標頭,除非另有指定,否則會嘗試將日誌訊息重新編碼為 UTF-8。您可以使用.git/config檔案中的i18n.logOutputEncoding指定所需的輸出編碼,如下所示:[i18n] logOutputEncoding = ISO-8859-1
如果您沒有此設定變數,則會改用
i18n.commitEncoding的值。
請注意,我們刻意選擇不在建立提交時重新編碼提交日誌訊息以在提交物件層級強推 UTF-8,因為重新編碼為 UTF-8 不一定是可逆的操作。
組態設定 (CONFIGURATION)
請參閱 git-config[1] 以取得核心變數,並參閱 git-diff[1] 以取得與產生差異相關的設定。
本節此行以上的所有內容均未包含在 git-config[1] 說明文件中。接下來的內容與該處內容相同:
log.abbrevCommit-
若為
true,則使 git-log[1]、git-show[1] 和 git-whatchanged[1] 預設使用--abbrev-commit。您可以使用--no-abbrev-commit來覆寫此選項。 log.date-
為
log指令設定預設的日期時間模式。設定 log.date 的值類似於使用gitlog的--date選項。詳細資訊請參閱 git-log[1]。若格式設為「auto:foo」且正在使用分頁器,則會將「foo」作為日期格式。否則,將使用「default」。
log.decorate-
列出 log 指令所顯示的任何提交的參考名稱。可能的值為
這與
gitlog的--decorate選項相同。 log.initialDecorationSet-
預設情況下,
gitlog僅顯示特定已知參考命名空間的修飾。若指定了 all,則顯示所有參考作為修飾。 log.excludeDecoration-
從記錄修飾中排除指定的模式。這類似於命令列選項
--decorate-refs-exclude,但此設定選項可被--decorate-refs選項覆寫。 log.diffMerges-
設定指定
--diff-merges=on時使用的差異格式,詳細資訊請參閱 git-log[1] 中的--diff-merges。預設為separate。 log.follow-
若為
true,當僅給定單一 <path> 時,gitlog的行為就像使用了--follow選項一樣。這具有與--follow相同的限制,即無法用來追蹤多個檔案,且在非線性歷史中運作不佳。 log.graphColors-
以逗號分隔的顏色列表,可用於繪製
gitlog--graph中的歷史線條。 log.showRoot-
若為 true,初始提交將顯示為一個大型建立事件。這等同於與空樹狀結構的差異。通常會隱藏根提交的工具(如 git-log[1] 或 git-whatchanged[1])現在將會顯示它。預設為 True。
log.showSignature-
若為 true,使 git-log[1]、git-show[1] 和 git-whatchanged[1] 預設使用
--show-signature。 log.mailmap-
若為 true,使 git-log[1]、git-show[1] 和 git-whatchanged[1] 預設使用
--use-mailmap,否則預設使用--no-use-mailmap。預設為 True。 notes.mergeStrategy-
解決註記 (notes) 衝突時預設選擇的合併策略。必須是
manual、ours、theirs、union或cat_sort_uniq其中之一。預設為manual。有關各個策略的更多資訊,請參閱 git-notes[1] 的 "NOTES MERGE STRATEGIES" 章節。此設定可透過向 git-notes[1] 傳遞
--strategy選項來覆寫。 notes.<name>.mergeStrategy-
執行合併註記至
refs/notes/<name> 時選擇的合併策略。這會覆寫更一般的notes.mergeStrategy。有關可用策略的更多資訊,請參閱 git-notes[1] 中的 "NOTES MERGE STRATEGIES" 章節。 notes.displayRef-
使用
gitlog系列命令顯示提交訊息時,除了core.notesRef或GIT_NOTES_REF設定的預設值外,還要從哪個(或哪些,如果是 glob 或指定多次)參照讀取註記。此設定可用
GIT_NOTES_DISPLAY_REF環境變數覆寫,該變數必須是以冒號分隔的參照或 glob 清單。對於不存在的參照將發出警告,但如果不匹配任何參照的 glob 則會被忽略。
此設定可透過 git-log[1] 系列命令的
--no-notes選項,或是這些命令所接受的--notes=<ref> 選項來停用。core.notesRef的有效值(可能被GIT_NOTES_REF覆寫)也會隱含地加入到要顯示的參照清單中。 notes.rewrite.<command>-
當使用 <command>(目前為
amend或rebase)重寫提交時,若此變數為false,則 Git 不會將註記從原始提交複製到重寫後的提交。預設為true。另請參閱下方的notes.rewriteRef。此設定可用
GIT_NOTES_REWRITE_REF環境變數覆寫,該變數必須是以冒號分隔的參照或 glob 清單。 notes.rewriteMode-
在重寫期間複製註記時(參見
notes.rewrite.<command> 選項),決定當目標提交已有名稱時該如何處理。必須是overwrite、concatenate、cat_sort_uniq或ignore之一。預設為concatenate。此設定可用
GIT_NOTES_REWRITE_MODE環境變數覆寫。 notes.rewriteRef-
在重寫期間複製註記時,指定應複製其註記的(全名)參照。可以是 glob,在這種情況下將複製所有匹配參照中的註記。您也可以多次指定此配置。
沒有預設值;您必須配置此變數才能啟用註記重寫。將其設定為
refs/notes/commits以啟用預設提交註記的重寫。可用
GIT_NOTES_REWRITE_REF環境變數覆寫。其格式的進一步說明請參見上方的notes.rewrite.<command>。
GIT
git[1] 套件的一部分