设置和配置
获取和创建项目
基本快照
分支和合并
共享和更新项目
检查和比较
补丁
调试
电子邮件
外部系统
服务器管理
指南
管理
底层命令
-
2.49.0
2025-03-14
- 2.48.1 没有变化
-
2.48.0
2025-01-10
- 2.45.1 → 2.47.2 没有变化
-
2.45.0
2024-04-29
- 2.43.3 → 2.44.3 没有变化
-
2.43.2
2024-02-13
- 2.43.1 没有变化
-
2.43.0
2023-11-20
- 2.42.1 → 2.42.4 没有变化
-
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.1 → 2.38.5 没有变化
-
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.1 → 2.25.5 没有变化
-
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.17.1 → 2.19.1 没有变化
-
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 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>
-
将提交对象输出限制为具有与指定模式(正则表达式)匹配的 reflog 条目的提交对象。使用多个
--grep-reflog
,将选择 reflog 消息与任何给定模式匹配的提交对象。除非使用--walk-reflogs
,否则使用此选项是错误的。 - --grep=<pattern>
-
将提交对象输出限制为具有与指定模式(正则表达式)匹配的日志消息的提交对象。使用多个
--grep=<pattern>
,将选择消息与任何给定模式匹配的提交对象(但请参见--all-match
)。 - --all-match
-
将提交对象输出限制为与所有给定的
--grep
匹配的提交对象,而不是至少与一个匹配的提交对象。 - --invert-grep
-
将提交对象输出限制为日志消息与
--grep=<pattern>
指定的模式不匹配的提交对象。 - -i
- --regexp-ignore-case
-
匹配正则表达式限制模式而不考虑字母大小写。
- --basic-regexp
-
将限制模式视为基本正则表达式;这是默认设置。
- -E
- --extended-regexp
-
将限制模式视为扩展正则表达式,而不是默认的基本正则表达式。
- -F
- --fixed-strings
-
将限制模式视为固定字符串(不要将模式解释为正则表达式)。
- -P
- --perl-regexp
-
将限制模式视为 Perl 兼容的正则表达式。
对这些类型的正则表达式的支持是一个可选的编译时依赖项。如果 Git 未经支持编译,则提供此选项将导致它终止。
- --remove-empty
-
当给定路径从树中消失时停止。
- --merges
-
仅打印合并提交。这与
--min-parents=2
完全相同。 - --no-merges
-
不打印具有多个父提交的提交。这与
--max-parents=1
完全相同。 - --min-parents=<number>
- --max-parents=<number>
- --no-min-parents
- --no-max-parents
-
仅显示具有至少(或最多)那么多父提交的提交对象。特别是,
--max-parents=1
与--no-merges
相同,--min-parents=2
与--merges
相同。--max-parents=0
给出所有根提交,--min-parents=3
给出所有章鱼合并。--no-min-parents
和--no-max-parents
再次重置这些限制(为无限制)。等效形式为--min-parents=0
(任何提交对象具有 0 个或更多父对象)和--max-parents=-1
(负数表示没有上限)。 - --first-parent
-
在查找要包含的提交对象时,在看到合并提交时仅跟踪第一个父提交对象。当查看特定主题分支的演变时,此选项可以提供更好的概述,因为合并到主题分支中往往只是为了适应不时更新的上游,并且此选项允许您忽略此类合并带入您的历史记录的各个提交对象。
- --exclude-first-parent-only
-
当查找要排除的提交(带有^)时,遇到合并提交时,仅跟踪第一个父提交。当任意合并是有效的Topic Branch更改时,这可以用于查找Topic Branch中与远程分支分离时的更改集。
- --not
-
反转所有后续修订说明符的^前缀(或缺少前缀)的含义,直到下一个
--not
。如果在--stdin之前在命令行上使用,则通过stdin传递的修订将不受其影响。相反,如果通过标准输入传递,则在命令行上传递的修订将不受其影响。 - --all
-
假装
refs/
中的所有引用,以及HEAD
,都作为<commit>在命令行上列出。 - --branches[=<pattern>]
-
假装
refs/heads
中的所有引用都作为<commit>在命令行上列出。如果给出了<pattern>,则将分支限制为与给定的Shell Glob匹配的分支。如果Pattern缺少?,*或[,则暗示末尾的/*。 - --tags[=<pattern>]
-
假装
refs/tags
中的所有引用都作为<commit>在命令行上列出。如果给出了<pattern>,则将标签限制为与给定的Shell Glob匹配的标签。如果Pattern缺少?,*或[,则暗示末尾的/*。 - --remotes[=<pattern>]
-
假装
refs/remotes
中的所有引用都作为<commit>在命令行上列出。如果给出了<pattern>,则将远程跟踪分支限制为与给定的Shell Glob匹配的分支。如果Pattern缺少?,*或[,则暗示末尾的/*。 - --glob=<glob-pattern>
-
假装与Shell Glob <glob-pattern> 匹配的所有引用都作为 <commit> 在命令行上列出。 如果缺少前导的 refs/,则会自动添加。如果 Pattern 缺少 ?, *, 或 [,则暗示末尾的 /*。
- --exclude=<glob-pattern>
-
不要包含与 <glob-pattern> 匹配的引用,否则下一个
--all
,--branches
,--tags
,--remotes
, 或--glob
会考虑这些引用。 重复此选项会将排除模式累加到下一个--all
,--branches
,--tags
,--remotes
, 或--glob
选项(其他选项或参数不会清除累积的模式)。当应用于
--branches
、--tags
或--remotes
时,给定的模式不应以refs/heads
、refs/tags
或refs/remotes
开头,并且当应用于--glob
或--all
时,它们必须以refs/
开头。 如果打算使用尾随的 /*,则必须显式给出。 -
不要包括会被
git-fetch
,git-receive-pack
或git-upload-pack
隐藏的引用,方法是查阅适当的fetch.hideRefs
,receive.hideRefs
或uploadpack.hideRefs
配置以及transfer.hideRefs
(参见 git-config[1])。 此选项会影响下一个伪引用选项--all
或--glob
,并在处理它们后清除。 - --reflog
-
假装Reflog中提到的所有对象都作为
<commit>
在命令行上列出。 - --alternate-refs
-
假装作为备用存储库的引用提示提到的所有对象都已在命令行中列出。备用存储库是指在
objects/info/alternates
中指定了对象目录的任何存储库。包含的对象集可以由core.alternateRefsCommand
等进行修改。请参阅 git-config[1]。 - --single-worktree
-
默认情况下,当有多个工作树时(请参阅 git-worktree[1]),以下选项将检查所有工作树:
--all
,--reflog
和--indexed-objects
。此选项强制它们仅检查当前工作树。 - --ignore-missing
-
在输入中看到无效的对象名称时,假装未给出错误的输入。
- --stdin
-
除了从命令行获取参数之外,还可以从标准输入中读取它们。这接受提交和伪选项,例如
--all
和--glob=
。当看到--
分隔符时,以下输入将被视为路径并用于限制结果。通过标准输入读取的标志(例如--not
)仅适用于以相同方式传递的参数,并且不会影响任何后续命令行参数。 - --quiet
-
不要将任何内容打印到标准输出。此形式主要用于允许调用方测试退出状态,以查看某个对象范围是否完全连接(或未连接)。这比将标准输出重定向到
/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
-
当提交集通过对称差异进行限制时,省略引入与“另一侧”上的另一个提交相同更改的任何提交。
例如,如果您有两个分支
A
和B
,通常列出它们一侧的所有提交的方法是使用--left-right
(请参见下面--left-right
选项的描述中的示例)。但是,它显示了从另一个分支 Cherry-Pick 的提交(例如,“3rd on b”可能从分支 A Cherry-Pick)。使用此选项,此类提交对将从输出中排除。 - --left-only
- --right-only
-
仅列出对称差异各自侧的提交,即仅列出那些将被
--left-right
标记为<
或>
的提交。例如,
--cherry-pick --right-only A...B
会从B
中省略那些在A
中或与A
中的提交具有补丁等效性的提交。换句话说,这会列出git cherry A B
中的+
提交。更准确地说,--cherry-pick --right-only --no-merges
给出了确切的列表。 - --cherry
-
--right-only --cherry-mark --no-merges
的同义词; 有助于将输出限制为我们这边的提交,并标记那些已应用于分支历史另一边的提交,例如git log --cherry upstream...mybranch
,类似于git cherry upstream mybranch
。 - -g
- --walk-reflogs
-
从最新的 reflog 条目到较旧的条目,遍历 reflog 条目,而不是遍历提交祖先链。 使用此选项时,无法指定要排除的提交(即,不能使用 ^commit,commit1..commit2 和 commit1...commit2 标记)。
对于
--pretty
格式(oneline
和reference
之外,原因很明显),这会导致输出包含从 reflog 中获取的两个额外信息行。 输出中的 reflog 指示符可以显示为ref@{<Nth>}
(其中 <Nth> 是 reflog 中的反向时间顺序索引)或ref@{<timestamp>}
(包含该条目的 <timestamp>),具体取决于一些规则-
如果起点指定为
ref@{<Nth>}
,则显示索引格式。 -
如果起点指定为
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
-
输出排除的边界提交。 边界提交以
-
为前缀。 - --use-bitmap-index
-
尝试使用包位图索引(如果可用)来加速遍历。 请注意,当使用
--objects
进行遍历时,树和 Blob 将不会打印其关联的路径。 - --progress=<header>
-
当考虑对象时,在 stderr 上显示进度报告。
<header>
文本将与每次进度更新一起打印。
历史简化
有时您只对历史记录的某些部分感兴趣,例如修改特定 <path> 的提交。 但是 历史记录简化 有两个部分,一部分是选择提交,另一部分是如何执行它,因为有多种简化历史记录的策略。
以下选项选择要显示的提交
请注意,可以显示额外的提交以提供有意义的历史记录。
以下选项影响简化执行的方式
- 默认模式
-
简化历史,解释树的最终状态的最简历史。最简是因为如果最终结果相同(即合并内容相同的分支),则会修剪掉一些侧枝。
- --show-pulls
-
包含默认模式下的所有提交,以及任何对第一个父提交不是 TREESAME (树相同) 但对后面的父提交是 TREESAME 的合并提交。此模式有助于显示“首次引入”更改到分支的合并提交。
- --full-history
-
与默认模式相同,但不修剪某些历史。
- --dense
-
仅显示选定的提交,以及一些有意义的历史记录。
- --sparse
-
显示简化历史中的所有提交。
- --simplify-merges
-
--full-history
的附加选项,用于从结果历史中删除一些不必要的合并,因为没有选定的提交参与此合并。 - --ancestry-path[=<commit>]
-
当给定要显示的提交范围(例如 commit1..commit2 或 commit2 ^commit1)以及该范围内的提交 <commit> 时,仅显示该范围内是 <commit> 的祖先、<commit> 的后代或 <commit> 自身的提交。 如果未指定提交,则使用 commit1 (范围中排除的部分) 作为 <commit>。 可以多次传递; 如果是这样,如果提交是给定的任何提交,或者它是其中一个提交的祖先或后代,则包含该提交。
以下是更详细的解释。
假设您指定 foo
作为 <paths>。 我们将修改 foo
的提交称为 !TREESAME,其余的称为 TREESAME。(在为 foo
过滤的差异中,它们看起来分别不同和相同。)
在下文中,我们将始终参考相同的示例历史来演示简化设置之间的差异。 我们假设您正在此提交图中为文件 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
对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 父级可用,则只遵循 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
。 -
用其简化
P'
替换C'
的每个父级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[=<commit>]
-
将显示的提交限制为 <commit> 的祖先、<commit> 的后代或 <commit> 自身。
作为一个示例用例,请考虑以下提交历史
D---E-------F / \ \ B---C---G---H---I---J / \ A-------K---------------L--M
常规的 D..M 计算作为
M
的祖先的提交集合,但不包括作为D
的祖先的提交。 这对于查看自D
以来导致M
的历史发生了什么很有用,从“M
有什么D
中不存在”的意义上来说。 在此示例中的结果将是所有提交,除了A
和B
(当然还有D
本身)。但是,当我们想要找出
M
中哪些提交被D
引入的错误污染并需要修复时,我们可能只想查看 D..M 中实际上是D
的后代的子集,即排除C
和K
。 这正是--ancestry-path
选项的作用。 应用于 D..M 范围,它导致E-------F \ \ G---H---I---J \ L--M
我们也可以使用
--ancestry-path=D
而不是--ancestry-path
,这在应用于 D..M 范围时意味着相同的事情,但只是更明确。如果我们反而对该范围内的给定主题以及受该主题影响的所有提交感兴趣,我们可能只想查看
D..M
的子集,该子集在其祖先路径中包含该主题。 因此,例如使用--ancestry-path=H D..M
将导致E \ 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
,它被 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
分别不是。
当使用默认模式时,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
包含时,该合并被视为它从另一个分支“拉取”了更改。在此示例中使用--show-pulls
(且没有其他选项)时,生成的图是I---X---R---N
在这里,合并提交
R
和N
被包含,因为它们分别将提交X
和R
拉取到基础分支中。这些合并是提交A
和B
没有出现在默认历史记录中的原因。当
--show-pulls
与--simplify-merges
配对使用时,该图包含所有必要的信息.-A---M--. N / / \ / I B R \ / / \ / / `---X--'
请注意,由于
M
可以从R
访问,因此从N
到M
的边被简化掉了。但是,N
仍然作为重要提交出现在历史记录中,因为它将更改R
"拉取"到主分支中。
--simplify-by-decoration
选项允许您通过省略未被标签引用的提交,仅查看历史拓扑的大致轮廓。如果 (1) 它们被标签引用,或者 (2) 它们更改了命令行上给出的路径的内容,则提交将被标记为 !TREESAME(换句话说,在上述历史简化规则之后保留)。所有其他提交都被标记为 TREESAME(可以被简化掉)。
二分查找助手
- --bisect
-
将输出限制为大致位于包含的提交和排除的提交之间的中间位置的一个提交对象。请注意,坏的二分查找引用
refs/bisect/bad
会被添加到包含的提交(如果存在),而好的二分查找引用refs/bisect/good-*
会被添加到排除的提交(如果存在)。因此,假设refs/bisect/
中没有引用,如果$ git rev-list --bisect foo ^bar ^baz
输出midpoint,则以下两个命令的输出
$ git rev-list foo ^midpoint $ git rev-list midpoint ^bar ^baz
长度大致相同。因此,找到引入回归的更改就简化为二分搜索:重复生成和测试新的“midpoint”,直到提交链的长度为 1。
- --bisect-vars
-
此选项的计算方式与
--bisect
相同,只是不使用refs/bisect/
中的引用,并且此选项会输出可以被 shell eval 的文本。这些行会将中间修订版本的名称分配给变量bisect_rev
,并将测试bisect_rev
后要测试的预期提交数分配给bisect_nr
,如果bisect_rev
结果良好,则要测试的预期提交数分配给bisect_good
,如果bisect_rev
结果不好,则要测试的预期提交数分配给bisect_bad
,以及我们现在正在二分查找的提交数分配给bisect_all
。 - --bisect-all
-
此选项输出包含的提交和排除的提交之间的所有提交对象,并按它们与包含的提交和排除的提交的距离排序。不使用
refs/bisect/
中的引用。离它们最远的首先显示。(这是--bisect
唯一显示的。)这很有用,因为当您想避免测试其中一些时(例如,它们可能无法编译),它可以轻松地选择一个好的提交进行测试。
此选项可以与
--bisect-vars
一起使用,在这种情况下,在所有排序的提交对象之后,将会有与单独使用--bisect-vars
时相同的文本。
提交排序
默认情况下,提交以相反的时间顺序显示。
- --date-order
-
在其所有子提交显示之前不显示任何父提交,但否则以提交时间戳顺序显示提交。
- --author-date-order
-
在其所有子提交显示之前不显示任何父提交,但否则以作者时间戳顺序显示提交。
- --topo-order
-
在其所有子提交显示之前不显示任何父提交,并避免在多个历史记录行中混合显示提交。
例如,在如下提交历史记录中
---1----2----4----7 \ \ 3----5----6----8---
其中数字表示提交时间戳的顺序,带有
--date-order
的git rev-list
和朋友会以时间戳顺序显示提交:8 7 6 5 4 3 2 1。使用
--topo-order
,它们将显示 8 6 5 3 7 4 2 1(或 8 7 4 2 6 5 3 1);一些较旧的提交会显示在较新的提交之前,以避免将来自两个并行开发轨道的提交混合在一起显示。 - --reverse
-
以相反的顺序输出选择要显示的提交(请参阅上面的“提交限制”部分)。不能与
--walk-reflogs
结合使用。
对象遍历
这些选项主要针对 Git 存储库的打包。
- --objects
-
打印列出的提交引用的任何对象的对象 ID。因此,
--objects foo ^bar
表示“如果我有提交对象 bar 而没有 foo,请将我需要下载的所有对象 ID 发送给我”。另请参阅下面的--object-names
。 - --in-commit-order
-
按照提交的顺序打印树和 blob ID。树和 blob ID 在它们第一次被提交引用后打印。
- --objects-edge
-
类似于
--objects
,但也会打印以“-”字符为前缀的排除的提交的 ID。这被 git-pack-objects[1] 用来构建“thin”包,它基于这些排除的提交中包含的对象以 delta 形式记录对象,以减少网络流量。 - --objects-edge-aggressive
-
类似于
--objects-edge
,但它会花费更多时间来查找排除的提交。这用于代替--objects-edge
来为浅层存储库构建“thin”包。 - --indexed-objects
-
假设索引使用的所有树和 blob 都已在命令行上列出。请注意,您可能还需要使用
--objects
。 - --unpacked
-
仅在使用
--objects
时有用;打印不在包中的对象 ID。 - --object-names
-
仅在使用
--objects
时有用;打印找到的对象 ID 的名称。这是默认行为。请注意,每个对象的“名称”都是含糊不清的,主要用作打包对象的提示。特别是:不区分标签、树和 blob 的名称;路径名可能会被修改以删除换行符;并且如果一个对象使用不同的名称多次出现,则仅显示一个名称。 - --no-object-names
-
仅在使用
--objects
时有用;不打印找到的对象 ID 的名称。这会反转--object-names
。此标志允许命令(例如 git-cat-file[1])更容易地解析输出。 - --filter=<filter-spec>
-
仅在使用
--objects*
之一时有用;从打印的对象列表中省略对象(通常是 blob)。<filter-spec> 可以是以下之一形式 --filter=blob:none 省略所有 blob。
形式 --filter=blob:limit=<n>[kmg] 省略大小至少为 n 字节或单位的 blob。n 可以为零。后缀 k、m 和 g 可用于命名 KiB、MiB 或 GiB 中的单位。例如,blob:limit=1k 与 blob:limit=1024 相同。
形式 --filter=object:type=(tag|commit|tree|blob) 省略所有不是请求类型的对象。
--filter=sparse:oid=<blob-ish> 形式使用 blob(或 blob 表达式)<blob-ish> 中包含的稀疏检出规范来省略那些对于请求的引用上的稀疏检出不需要的 blob。
--filter=tree:<depth> 形式省略所有 blob 和树,它们从根树开始的深度 >= <depth>(如果在遍历的提交中,对象位于多个深度,则为最小深度)。<depth>=0 将不包含任何树或 blob,除非在命令行(或使用 --stdin 时为标准输入)中显式包含。<depth>=1 将仅包含由从 <commit> 可达的提交或显式给定的对象直接引用的树和 blob。<depth>=2 类似于 <depth>=1,但也会包含从显式给定的提交或树中移除了一级的树和 blob。
请注意,出于安全原因,已经放弃了想要从文件系统上的任意路径读取的 --filter=sparse:path=<path> 形式。
可以指定多个 --filter= 标志来组合过滤器。仅包含每个过滤器都接受的对象。
--filter=combine:<filter1>+<filter2>+…<filterN> 形式也可用于组合多个过滤器,但这比仅重复 --filter 标志更难,通常没有必要。过滤器通过 + 连接,单个过滤器采用 % 编码(即 URL 编码)。除了 + 和 % 字符外,以下字符是保留的,也必须进行编码:
~!@#$^&*()[]{}\;",<>?
'`
以及所有 ASCII 代码 <=0x20
的字符,包括空格和换行符。其他任意字符也可以编码。例如,combine:tree:3+blob:none 和 combine: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>
显示从包含对象推断出的丢失对象的类型。
如果传递给遍历的某些提示丢失,它们也将被视为丢失,并且遍历将忽略它们。但是,如果我们无法获取它们的 Object ID,则会引发错误。
-
- --exclude-promisor-objects
-
(仅供内部使用。)在 promisor 边界处预过滤对象遍历。这与部分克隆一起使用。这比
--missing=allow-promisor
更强大,因为它限制了遍历,而不仅仅是消除有关缺少对象的错误。 - --no-walk[=(sorted|unsorted)]
-
仅显示给定的提交,但不遍历它们的祖先。如果指定了范围,则此选项无效。如果给出了参数
unsorted
,则按它们在命令行中给出的顺序显示提交。否则(如果给出了sorted
或没有给出参数),则按提交时间的相反时间顺序显示提交。不能与--graph
组合使用。 - --do-walk
-
覆盖先前的
--no-walk
。
提交格式化
使用这些选项,git-rev-list[1] 的行为将类似于更专业的提交日志工具系列:git-log[1]、git-show[1] 和 git-whatchanged[1]
- --pretty[=<format>]
- --format=<format>
-
以给定的格式美观地打印提交日志的内容,其中 <format> 可以是 oneline、short、medium、full、fuller、reference、email、raw、format:<string> 和 tformat:<string> 之一。当 <format> 不是上述任何一种,并且其中包含 %placeholder 时,它的行为就像给出了 --pretty=tformat:<format> 一样。
有关每种格式的一些其他详细信息,请参见“PRETTY FORMATS”部分。当省略 =<format> 部分时,它默认为 medium。
注意:您可以在存储库配置中指定默认的美观格式(请参见 git-config[1])。
- --abbrev-commit
-
不显示完整的 40 字节十六进制提交对象名称,而是显示唯一命名该对象的前缀。"--abbrev=<n>"(如果显示,还会修改 diff 输出)选项可用于指定前缀的最小长度。
这应该使使用 80 列终端的人来说,“--pretty=oneline”的可读性更高。
- --no-abbrev-commit
-
显示完整的 40 字节十六进制提交对象名称。这将否定
--abbrev-commit
,无论是显式的还是由其他选项(如“--oneline”)隐含的。它还会覆盖log.abbrevCommit
变量。 - --oneline
-
这是一起使用的 "--pretty=oneline --abbrev-commit" 的简写。
- --encoding=<encoding>
-
提交对象在其编码标头中记录用于日志消息的字符编码;此选项可用于告诉命令以用户首选的编码重新编码提交日志消息。对于非管道命令,这默认为 UTF-8。请注意,如果对象声明以
X
编码,并且我们以X
输出,我们将逐字输出该对象;这意味着原始提交中的无效序列可能会复制到输出中。同样,如果 iconv(3) 无法转换提交,我们将静默地逐字输出原始对象。 - --expand-tabs=<n>
- --expand-tabs
- --no-expand-tabs
-
在日志消息中执行制表符扩展(将每个制表符替换为足够的空格以填充到下一个显示列,该显示列是 <n> 的倍数),然后在输出中显示它。
--expand-tabs
是--expand-tabs=8
的简写,而--no-expand-tabs
是--expand-tabs=0
的简写,它禁用制表符扩展。默认情况下,制表符在将日志消息缩进 4 个空格的美观格式中展开(即 medium,这是默认格式,full 和 fuller)。
- --show-signature
-
通过将签名传递给
gpg --verify
来检查签名提交对象的有效性并显示输出。 - --relative-date
-
--date=relative
的同义词。 - --date=<format>
-
仅对以人类可读格式显示的日期生效,例如在使用
--pretty
时。log.date
配置变量为 log 命令的--date
选项设置默认值。默认情况下,日期以原始时区(提交者或作者)显示。如果在格式后附加-local
(例如iso-local
),则改为使用用户的本地时区。--date=relative
显示相对于当前时间的日期,例如“2 hours ago”。-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
,但 %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
-
以原始格式打印提交的内容;每个记录都用空字符分隔。
- --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
一起使用时,从这些计数中省略补丁等效提交,并打印等效提交的计数,以制表符分隔。
漂亮的格式
如果提交是合并,并且漂亮格式不是 *oneline*、*email* 或 *raw*,则在 *Author:* 行之前插入一个附加行。此行以“Merge:”开头,并打印祖先提交的哈希值,以空格分隔。请注意,如果您限制了历史的视图,则列出的提交可能不一定是 **direct** 父提交的列表:例如,如果您只对与特定目录或文件相关的更改感兴趣。
有几种内置格式,您可以通过将 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* 信息显示真实的父提交,而不考虑 grafts 或历史简化。请注意,此格式会影响提交的显示方式,但不影响 diff 的显示方式,例如使用
git log --raw
。要在 raw diff 格式中获取完整的对象名称,请使用--no-abbrev
。 -
format:<format-string>
format:<format-string> 格式允许您指定要显示的信息。它的工作方式有点像 printf 格式,但值得注意的是,您使用 %n 而不是 \n 来获取换行符。
例如,format:"The author of %h was %an, %ar%nThe title was >>%s<<%n" 会显示如下内容
The author of fe6e0ee was Junio C Hamano, 23 hours ago The title was >>t4119: test autocomputing -p<n> for traditional diff input.<<
占位符是
-
扩展为单个文字字符的占位符
-
影响后续占位符格式的占位符
- %Cred
-
将颜色切换为红色
- %Cgreen
-
将颜色切换为绿色
- %Cblue
-
将颜色切换为蓝色
- %Creset
-
重置颜色
- %C(…)
-
颜色规范,如 git-config[1] 的“CONFIGURATION FILE”部分中的 Values 下所述。默认情况下,仅当为日志输出启用颜色时(通过
color.diff
、color.ui
或--color
,并尊重前者的auto
设置,如果我们进入终端)。%C(auto,...)
被接受为默认的旧同义词(例如,%C(auto,red)
)。指定%C(always,...)
即使在未以其他方式启用颜色时也会显示颜色(但请考虑仅使用--color=always
来为整个输出启用颜色,包括此格式和 git 可能着色的任何其他内容)。单独的auto
(即%C(auto)
)将打开下一个占位符上的自动着色,直到再次切换颜色。 - %m
-
左侧 (
<
)、右侧 (>
) 或边界 (-
) 标记 - %w([<w>[,<i1>[,<i2>]]])
-
切换换行,类似于 git-shortlog[1] 的 -w 选项。
- %<( <N> [,trunc|ltrunc|mtrunc])
-
使下一个占位符至少占用 N 列宽度,必要时在右侧填充空格。如果输出长度超过 N 列,则可以选择在左侧 (ltrunc)
..ft
、中间 (mtrunc)mi..le
或结尾 (trunc)rig..
处截断(带省略号 *..*)。注意 1:截断仅在 N >= 2 时才能正常工作。注意 2:N 和 M 值周围的空格(见下文)是可选的。注意 3:表情符号和其他宽字符将占用两个显示列,这可能会超出列边界。注意 4:分解的字符组合标记可能会在填充边界处错位。 - %<|( <M> )
-
使下一个占位符至少占用到第 M 个显示列,必要时在右侧填充空格。对从终端窗口右侧边缘测量的列位置使用负 M 值。
- %>( <N> ), %>|( <M> )
-
分别类似于 %<( <N> ), %<|( <M> ),但在左侧填充空格
- %>>( <N> ), %>>|( <M> )
-
分别类似于 %>( <N> ), %>|( <M> ),除非下一个占位符占用的空间多于给定的空间,并且其左侧有空格,则使用这些空格
- %><( <N> ), %><|( <M> )
-
分别类似于 %<( <N> ), %<|( <M> ),但在两侧填充(即文本居中)
-
扩展为从提交中提取的信息的占位符
- %H
-
提交哈希
- %h
-
缩写的提交哈希
- %T
-
树哈希值
- %t
-
缩写的树哈希值
- %P
-
父提交哈希值
- %p
-
缩写的父提交哈希值
- %an
-
作者姓名
- %aN
-
作者姓名 (遵守 .mailmap, 参见 git-shortlog[1] 或 git-blame[1])
- %ae
-
作者邮箱
- %aE
-
作者邮箱 (遵守 .mailmap, 参见 git-shortlog[1] 或 git-blame[1])
- %al
-
作者邮箱的本地部分 (@ 符号之前的部分)
- %aL
-
作者本地部分 (参见 %al) 遵守 .mailmap, 参见 git-shortlog[1] 或 git-blame[1])
- %ad
-
作者日期 (格式遵守 --date= 选项)
- %aD
-
作者日期,RFC2822 样式
- %ar
-
作者日期,相对时间
- %at
-
作者日期,UNIX 时间戳
- %ai
-
作者日期,类似 ISO 8601 的格式
- %aI
-
作者日期,严格的 ISO 8601 格式
- %as
-
作者日期,短格式 (
YYYY-MM-DD
) - %ah
-
作者日期,人类可读的格式 (类似于 git-rev-list[1] 的
--date=human
选项) - %cn
-
提交者姓名
- %cN
-
提交者姓名 (遵守 .mailmap, 参见 git-shortlog[1] 或 git-blame[1])
- %ce
-
提交者邮箱
- %cE
-
提交者邮箱 (遵守 .mailmap, 参见 git-shortlog[1] 或 git-blame[1])
- %cl
-
提交者邮箱的本地部分 (@ 符号之前的部分)
- %cL
-
提交者本地部分 (参见 %cl) 遵守 .mailmap, 参见 git-shortlog[1] 或 git-blame[1])
- %cd
-
提交者日期 (格式遵守 --date= 选项)
- %cD
-
提交者日期,RFC2822 样式
- %cr
-
提交者日期,相对时间
- %ct
-
提交者日期,UNIX 时间戳
- %ci
-
提交者日期,类似 ISO 8601 的格式
- %cI
-
提交者日期,严格的 ISO 8601 格式
- %cs
-
提交者日期,短格式 (
YYYY-MM-DD
) - %ch
-
提交者日期,人类可读的格式 (类似于 git-rev-list[1] 的
--date=human
选项) - %d
-
引用名称,类似于 git-log[1] 的 --decorate 选项
- %D
-
引用名称,不带 " (", ")" 包装。
- %(decorate[:<options>])
-
带有自定义修饰的引用名称。
decorate
字符串后面可以跟一个冒号和零个或多个逗号分隔的选项。选项值可以包含文字格式代码。 这些代码必须用于逗号 (%x2C
) 和右括号 (%x29
),因为它们在选项语法中起作用。-
prefix=<value>: 显示在引用名称列表之前。默认为 "
(
"。 -
suffix=<value>: 显示在引用名称列表之后。默认为 "
)
"。 -
separator=<value>: 显示在引用名称之间。默认为 "
,
"。 -
pointer=<value>: 显示在 HEAD 和它指向的分支之间(如果有)。默认为 "
->
"。 -
tag=<value>: 显示在标签名称之前。默认为 "
tag:
"。
-
例如,要生成没有包装或标签注释,并且空格作为分隔符的修饰
+
%(decorate:prefix=,suffix=,tag=,separator= )
- %(describe[:<options>])
-
人类可读的名称,类似于 git-describe[1];对于无法描述的提交,为空字符串。
describe
字符串后面可以跟一个冒号和零个或多个逗号分隔的选项。当同时添加或删除标签时,描述可能不一致。-
tags[=<bool-value>]: 不仅考虑带注释的标签,还考虑轻量级标签。
-
abbrev=<number>: 不使用缩写对象名称的默认十六进制数字数(这将根据存储库中对象的数量而变化,默认为 7),而是使用 <number> 位数字,或者根据需要使用尽可能多的数字来形成唯一的对象名称。
-
match=<pattern>: 仅考虑与给定的
glob(7)
模式匹配的标签,不包括 "refs/tags/" 前缀。 -
exclude=<pattern>: 不考虑与给定的
glob(7)
模式匹配的标签,不包括 "refs/tags/" 前缀。
-
- %S
-
命令行上给出的引用名称,通过该引用名称到达提交 (类似于
git log --source
),仅适用于git log
- %e
-
编码
- %s
-
主题
- %f
-
经过清理的主题行,适合作为文件名
- %b
-
正文
- %B
-
原始正文 (未包装的主题和正文)
- %GG
-
来自 GPG 的原始验证消息,用于已签名的提交
- %G?
-
对于良好的(有效)签名,显示 "G",对于错误的签名,显示 "B",对于具有未知有效性的良好签名,显示 "U",对于已过期的良好签名,显示 "X",对于由过期密钥创建的良好签名,显示 "Y",对于由撤销密钥创建的良好签名,显示 "R",如果无法检查签名(例如,缺少密钥),显示 "E",对于没有签名,显示 "N"
- %GS
-
显示已签名提交的签名者姓名
- %GK
-
显示用于签署已签名提交的密钥
- %GF
-
显示用于签署已签名提交的密钥的指纹
- %GP
-
显示用于签署已签名提交的子密钥的主密钥的指纹
- %GT
-
显示用于签署已签名提交的密钥的信任级别
- %gD
-
reflog 选择器,例如,
refs/stash@{1}
或refs/stash@{2 minutes ago}
;该格式遵循为-g
选项描述的规则。@
之前的部分是命令行上给出的 refname(因此git log -g refs/heads/master
将产生refs/heads/master@{0}
)。 - %gd
-
缩短的 reflog 选择器;与
%gD
相同,但 refname 部分被缩短以提高人类可读性(因此refs/heads/master
变为仅master
)。 - %gn
-
reflog 身份名称
- %gN
-
reflog 身份名称 (遵守 .mailmap, 参见 git-shortlog[1] 或 git-blame[1])
- %ge
-
reflog 身份邮箱
- %gE
-
reflog 身份邮箱 (遵守 .mailmap, 参见 git-shortlog[1] 或 git-blame[1])
- %gs
-
reflog 主题
- %(trailers[:<options>])
-
显示由 git-interpret-trailers[1] 解释的正文的尾部。
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>]: 仅显示 trailer 的键部分。
-
valueonly[=<bool>]: 仅显示 trailer 的值部分。
-
key_value_separator=<sep>: 指定插入在每个 trailer 的键和值之间的分隔符。默认为 ": "。否则,它与上面的 separator=<sep> 具有相同的语义。
-
-
注意
|
某些占位符可能取决于传递给修订遍历引擎的其他选项。例如,%g* reflog 选项将插入一个空字符串,除非我们正在遍历 reflog 条目(例如,通过 git log -g )。如果命令行上尚未提供 --decorate ,则 %d 和 %D 占位符将使用“短”装饰格式。 |
布尔选项接受可选值 [=<bool-value>]
。 --type=bool
git-config[1] 采用的值,如 yes
和 off
,都被接受。在没有 =<value>
的情况下给出布尔选项等同于使用 =true
给出它。
如果在占位符的 % 之后添加一个 +
(加号),则当且仅当该占位符扩展为非空字符串时,才会在扩展之前立即插入一个换行符。
如果在占位符的 % 之后添加一个 -
(减号),则当且仅当该占位符扩展为空字符串时,才删除紧接在扩展之前的全部连续换行符。
如果在占位符的 % 之后添加一个 ` `(空格),则当且仅当该占位符扩展为非空字符串时,才会在扩展之前立即插入一个空格。
-
tformat
tformat: 格式的工作方式与 format: 完全一样,只是它提供“终止符”语义而不是“分隔符”语义。换句话说,每个提交都有附加的消息终止符字符(通常是换行符),而不是在条目之间放置分隔符。这意味着单行格式的最终条目将被正确地用新行终止,就像“oneline”格式一样。例如
$ git log -2 --pretty=format:%h 4da45bef \ | perl -pe '$_ .= " -- NO NEWLINE\n" unless /\n/' 4da45be 7134973 -- NO NEWLINE $ git log -2 --pretty=tformat:%h 4da45bef \ | perl -pe '$_ .= " -- NO NEWLINE\n" unless /\n/' 4da45be 7134973
此外,任何包含
%
的无法识别的字符串都被解释为前面带有tformat:
。例如,以下两个是等效的$ git log -2 --pretty=tformat:%h 4da45bef $ git log -2 --pretty=%h 4da45bef
示例
-
打印从当前分支可访问的提交列表。
git rev-list HEAD
-
打印此分支上的提交列表,但不存在于上游分支中。
git rev-list @{upstream}..HEAD
-
使用作者和提交消息格式化提交(另请参见 porcelain git-log[1])。
git rev-list --format=medium HEAD
-
格式化提交以及它们的差异(另请参见 porcelain git-log[1],它可以在单个进程中执行此操作)。
git rev-list HEAD | git diff-tree --stdin --format=medium -p
-
打印当前分支上触及
Documentation
目录中任何文件的提交列表。git rev-list HEAD -- Documentation/
-
打印过去一年由您编写的提交列表,位于任何分支、标签或其他引用上。
git rev-list --author=you@example.com --since=1.year.ago --all
-
打印从当前分支可访问的对象列表(即,所有提交以及它们包含的 blobs 和 trees)。
git rev-list --objects HEAD
-
比较所有可访问对象的磁盘大小与从 reflog 可访问的对象的磁盘大小,以及总打包大小。这可以告诉您运行
git repack -ad
是否可以减少存储库大小(通过删除无法访问的对象),以及过期 reflog 是否有帮助。# reachable objects git rev-list --disk-usage --objects --all # plus reflogs git rev-list --disk-usage --objects --all --reflog # total disk size used du -c .git/objects/pack/*.pack .git/objects/??/* # alternative to du: add up "size" and "size-pack" fields git count-objects -v
-
报告每个分支的磁盘大小,不包括当前分支使用的对象。 这可以找到导致存储库大小膨胀的异常值(例如,因为有人不小心提交了大型构建工件)。
git for-each-ref --format='%(refname)' | while read branch do size=$(git rev-list --disk-usage --objects HEAD..$branch) echo "$size $branch" done | sort -n
-
比较一组 ref 中分支的磁盘大小,排除另一组 ref。 如果您将来自多个远程仓库的对象混合到单个存储库中,这可以显示哪些远程仓库正在增加存储库的大小(将
origin
的大小作为基线)。git rev-list --disk-usage --objects --remotes=$suspect --not --remotes=origin
GIT
属于 git[1] 套件的一部分