设置和配置
获取和创建项目
基本快照
分支和合并
共享和更新项目
检查和比较
补丁
调试
外部系统
服务器管理
指南
管理
底层命令
-
2.49.0
2025-03-14
- 2.48.1 无变更
-
2.48.0
2025-01-10
- 2.46.1 → 2.47.2 无变更
-
2.46.0
2024-07-29
-
2.45.3
2024-11-26
- 2.45.1 → 2.45.2 无变更
-
2.45.0
2024-04-29
- 2.44.1 → 2.44.3 无变更
-
2.44.0
2024-02-23
- 2.43.1 → 2.43.6 无变更
-
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.36.1 → 2.39.5 无变更
-
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.22.1 → 2.23.4 无变更
-
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.1 → 2.19.6 无变更
-
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 无变更
-
2.6.7
2017-05-05
-
2.5.6
2017-05-05
-
2.4.12
2017-05-05
- 2.3.10 无变更
-
2.2.3
2015-09-04
-
2.1.4
2014-12-17
-
2.0.5
2014-12-17
描述
显示一个或多个对象(blobs, trees, tags 和 commits)。
对于 commits,它显示日志消息和文本差异。它还以特殊格式呈现合并 commit,由 git diff-tree --cc 生成。
对于 tags,它显示 tag 消息和引用的对象。
对于 trees,它显示名称(相当于 git ls-tree 与 --name-only)。
对于纯 blobs,它显示纯内容。
git log 命令理解的一些选项可用于控制 commit 引入的更改的显示方式。
本手册页仅描述最常用的选项。
选项
- <object>…
-
要显示的对象的名称(默认为 HEAD)。有关拼写对象名称的更完整列表,请参阅 gitrevisions[7] 中的“指定修订”部分。
- --pretty[=<format>]
- --format=<format>
-
以给定的格式漂亮地打印 commit 日志的内容,其中 <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 字节十六进制 commit 对象名称,而是显示唯一标识对象的前缀。 "--abbrev=<n>"(如果显示的话,也会修改 diff 输出)选项可用于指定前缀的最小长度。
对于使用 80 列终端的人来说,这应该使 "--pretty=oneline" 更具可读性。
- --no-abbrev-commit
-
显示完整的 40 字节十六进制 commit 对象名称。这否定了
--abbrev-commit
,无论是显式的还是由其他选项(例如 "--oneline")暗示的。它还会覆盖log.abbrevCommit
变量。 - --oneline
-
这是 "--pretty=oneline --abbrev-commit" 一起使用的简写。
- --encoding=<encoding>
-
Commit 对象在其编码头中记录了用于日志消息的字符编码;此选项可用于告诉命令以用户首选的编码重新编码 commit 日志消息。对于非底层命令,这默认为 UTF-8。请注意,如果一个对象声明以
X
编码,并且我们以X
输出,我们将逐字输出该对象;这意味着原始 commit 中的无效序列可能会被复制到输出中。同样,如果 iconv(3) 无法转换 commit,我们将安静地逐字输出原始对象。 - --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>]
-
当显示 commit 日志消息时,显示注释 commit 的 notes(请参见 git-notes[1])。当命令行上没有给出
--pretty
、--format
或--oneline
选项时,这是git log
、git show
和git whatchanged
命令的默认设置。默认情况下,显示的 notes 来自
core.notesRef
和notes.displayRef
变量(或相应的环境覆盖)中列出的 notes refs。有关更多详细信息,请参见 git-config[1]。使用可选的 <ref> 参数,使用 ref 查找要显示的 notes。当 ref 以
refs/notes/
开头时,可以指定完整的 refname;当它以notes/
开头时,refs/
,否则refs/notes/
将被添加到前缀以形成 ref 的完整名称。可以组合多个 --notes 选项来控制正在显示的 notes。示例:“--notes=foo”将仅显示来自“refs/notes/foo”的 notes;“--notes=foo --notes”将显示来自“refs/notes/foo”和默认 notes ref 的 notes。
- --no-notes
-
不显示 notes。这否定了上面的
--notes
选项,方法是从中显示 notes 的 notes refs 列表中重置。 选项按照命令行给出的顺序进行解析,因此例如“--notes --notes=foo --no-notes --notes=bar”将仅显示来自“refs/notes/bar”的 notes。 - --show-notes-by-default
-
除非给出了显示特定 notes 的选项,否则显示默认 notes。
- --show-notes[=<ref>]
- --[no-]standard-notes
-
这些选项已弃用。请改用上面的 --notes/--no-notes 选项。
- --show-signature
-
通过将签名传递给
gpg --verify
来检查已签名 commit 对象的有效性,并显示输出。
PRETTY FORMATS
如果 commit 是合并,并且 pretty-format 不是 oneline、email 或 raw,则在 Author: 行之前插入一行附加行。 该行以 "Merge: " 开头,并打印祖先 commit 的哈希值,以空格分隔。 请注意,如果您限制了历史记录的视图,则列出的 commit 可能不一定是 直接 父 commit 的列表:例如,如果您只对与某个目录或文件相关的更改感兴趣。
有几种内置格式,您可以通过将 pretty.<name> 配置选项设置为另一个格式名称或 format: 字符串来定义其他格式,如下所述(请参见 git-config[1])。 以下是内置格式的详细信息
-
oneline
<hash> <title-line>
这旨在尽可能紧凑。
-
short
commit <hash> Author: <author>
<title-line>
-
中等
commit <hash> Author: <author> Date: <author-date>
<title-line>
<full-commit-message>
-
完整
commit <hash> Author: <author> Commit: <committer>
<title-line>
<full-commit-message>
-
更完整
commit <hash> Author: <author> AuthorDate: <author-date> Commit: <committer> CommitDate: <committer-date>
<title-line>
<full-commit-message>
-
参考
<abbrev-hash> (<title-line>, <short-author-date>)
此格式用于在提交消息中引用另一个提交,并且与
--pretty='format:%C(auto)%h (%s, %ad)'
相同。默认情况下,日期格式为--date=short
,除非显式指定了另一个--date
选项。与任何带有格式占位符的format:
一样,其输出不受其他选项(如--decorate
和--walk-reflogs
)的影响。 -
电子邮件
From <hash> <date> From: <author> Date: <author-date> Subject: [PATCH] <title-line>
<full-commit-message>
-
mboxrd
与电子邮件类似,但提交消息中以 "From " 开头(前面有零个或多个 ">")的行用 ">" 引起来,这样它们就不会被误认为是开始一个新的提交。
-
原始
raw 格式完全按照提交对象中存储的方式显示整个提交。值得注意的是,无论是否使用 --abbrev 或 --no-abbrev,哈希都以完整形式显示,并且parents信息显示真正的父提交,而不考虑 grafts 或历史简化。请注意,此格式影响提交的显示方式,但不影响 diff 的显示方式,例如使用
git log --raw
。要在原始 diff 格式中获取完整的对象名称,请使用--no-abbrev
。 -
format:<format-string>
format:<format-string> 格式允许您指定要显示的信息。它的工作方式有点像 printf 格式,但值得注意的是,您使用 %n 而不是 \n 来获取换行符。
例如,format:"%h 的作者是 %an, %ar%nThe 标题是 >>%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
-
原始正文(未包装的主题和正文)
- %N
-
提交说明
- %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。
trailers
字符串后可跟一个冒号和零个或多个逗号分隔的选项。如果多次提供任何选项,则最后一个出现项获胜。-
key=<key>: 仅显示具有指定 <key> 的 trailers。匹配不区分大小写,并且尾随冒号是可选的。如果多次给出选项,则显示与任何键匹配的 trailer 行。此选项会自动启用
only
选项,以便隐藏 trailer 块中的非 trailer 行。如果不希望这样做,可以使用only=false
禁用它。例如,%(trailers:key=Reviewed-by)
显示键为Reviewed-by
的 trailer 行。 -
only[=<bool>]: 选择是否应包含 trailer 块中的非 trailer 行。
-
separator=<sep>: 指定在 trailer 行之间插入的分隔符。默认为换行符。字符串 <sep> 可以包含上面描述的文字格式化代码。要使用逗号作为分隔符,必须使用
%x2C
,否则它将被解析为下一个选项。例如,%(trailers:key=Ticket,separator=%x2C )
显示所有键为 "Ticket" 的 trailer 行,并以逗号和空格分隔。 -
unfold[=<bool>]: 使其行为就像给出了 interpret-trailer 的
--unfold
选项一样。例如,%(trailers:only,unfold=true)
展开并显示所有 trailer 行。 -
keyonly[=<bool>]: 仅显示 trailer 的键部分。
-
valueonly[=<bool>]: 仅显示 trailer 的值部分。
-
key_value_separator=<sep>: 指定在每个 trailer 的键和值之间插入的分隔符。默认为 ": "。否则,它与上面的 separator=<sep> 共享相同的语义。
-
-
注意
|
某些占位符可能取决于提供给修订遍历引擎的其他选项。例如,除非我们正在遍历 reflog 条目(例如,通过 git log -g ),否则 %g* reflog 选项将插入一个空字符串。如果命令行上尚未提供 --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
DIFF 格式
可以使用以下选项来更改 git show
生成差异输出的方式。
-
-p
-
-u
-
--patch
-
生成补丁(请参阅 使用 -p 生成补丁文本)。
-
-s
-
--no-patch
-
禁止来自 diff 机制的所有输出。对于像
git show
这样的默认显示补丁的命令,可以用来抑制它们的输出,或者取消命令行上较早出现的--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
-
为合并提交生成 remerge-diff 输出。
--diff-merges=remerge -p
的快捷方式。 - --no-diff-merges
-
--diff-merges=off
的同义词。 - --diff-merges=<format>
-
指定用于合并提交的差异格式。除非使用
--first-parent
,否则默认为 `dense-combined`,在这种情况下,first-parent
是默认值。支持以下格式
- off, none
-
禁用合并提交的差异输出。可用于覆盖隐含值。
- on, m
-
使合并提交的差异输出以默认格式显示。可以使用
log.diffMerges
配置变量更改默认格式,其默认值为separate
。 - first-parent, 1
-
显示相对于第一个父级的完整差异。这与
--patch
为非合并提交生成的格式相同。 - separate
-
显示相对于每个父级的完整差异。为每个父级生成单独的日志条目和差异。
- combined, c
-
同时显示从每个父级到合并结果的差异,而不是一次显示父级和结果之间的成对差异。此外,它仅列出从所有父级修改过的文件。
- dense-combined, cc
-
进一步压缩由
--diff-merges=combined
产生的输出,方法是省略不重要的 Hunk,这些 Hunk 在父版本中仅有两种变体,且合并结果未经修改地选取了其中一种。 - remerge, r
-
重新合并双亲合并提交以创建临时树对象——可能包含带有冲突标记等的文件。然后,在临时树和实际合并提交之间显示差异。
使用此选项时发出的输出可能会发生变化,它与其他选项的交互作用也是如此(除非明确记录)。
- --combined-all-paths
-
使组合差异(用于合并提交)列出所有父版本中的文件名。因此,仅当使用
--diff-merges=[dense-]combined
时才有效,并且可能仅在检测到文件名更改时才有用(即,当请求重命名或复制检测时)。 -
-U<n>
-
--unified=<n>
-
生成带有 <n> 行上下文的差异,而不是通常的三行。暗示
--patch
。 -
--output=<file>
-
输出到特定文件,而不是 stdout。
-
--output-indicator-new=<char>
-
--output-indicator-old=<char>
-
--output-indicator-context=<char>
-
指定用于指示生成补丁中的新行、旧行或上下文行的字符。通常它们分别是
+
、-
和 ' '。 -
--raw
-
对于每个提交,使用原始差异格式显示更改摘要。 请参阅 git-diff[1] 的“原始输出格式”部分。 这与以原始格式显示日志本身不同,您可以使用
--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 列,可以通过 <width> 覆盖。 可以通过在逗号后提供另一个宽度 <name-width> 或设置
diff.statNameWidth=<name-width>
来限制文件名部分的宽度。 可以使用--stat-graph-width=<graph-width>
或设置diff.statGraphWidth=<graph-width>
来限制图形部分的宽度。 使用--stat
或--stat-graph-width
会影响生成统计图的所有命令,而设置diff.statNameWidth
或diff.statGraphWidth
不会影响git format-patch
。 通过提供第三个参数 <count>,您可以将输出限制为前 <count> 行,如果还有更多行,则显示...
。这些参数也可以分别通过
--stat-width=<width>
、--stat-name-width=<name-width>
和--stat-count=<count>
设置。 -
--compact-summary
-
在 diffstat 中输出扩展标头信息的浓缩摘要,例如文件创建或删除(“new”或“gone”,如果是符号链接,则可选
+l
)和模式更改(分别为添加或删除可执行位的+x
或-x
)。 该信息位于文件名部分和图形部分之间。 暗示--stat
。 -
--numstat
-
与
--stat
类似,但以十进制表示法显示添加和删除的行数,以及不带缩写的路径名,使其更易于机器处理。 对于二进制文件,输出两个-
,而不是说0 0
。 -
--shortstat
-
仅输出包含修改文件总数以及添加和删除行数的
--stat
格式的最后一行。 -
-X [<param>,...]
-
--dirstat[=<param>,...]
-
输出每个子目录的相对更改量的分布。 可以通过传递逗号分隔的参数列表来自定义
--dirstat
的行为。 默认值由diff.dirstat
配置变量控制(请参阅 git-config[1])。 以下参数可用-
changes
-
通过计算从源中删除或添加到目标的行来计算 dirstat 数字。 这忽略了文件中纯代码移动的数量。 换句话说,重新排列文件中的行不像其他更改那样被计数。 这是未给出参数时的默认行为。
-
lines
-
通过执行常规的基于行的差异分析并对删除/添加的行数求和来计算 dirstat 数字。(对于二进制文件,计算 64 字节的块,因为二进制文件没有行的自然概念)。 这是一种比
changes
行为更昂贵的--dirstat
行为,但它确实像其他更改一样计数文件中的重新排列行。 生成的输出与您从其他--*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
-
仅显示后映像树中每个更改文件的名称。 文件名通常以 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-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
-
关闭重命名检测,即使配置文件给出了默认值也如此。
-
--[no-]rename-empty
-
是否使用空 blob 作为重命名源。
-
--check
-
如果更改引入了冲突标记或空格错误,则发出警告。什么被认为是空格错误由
core.whitespace
配置控制。默认情况下,尾随空格(包括仅由空格组成的行)以及紧跟在行初始缩进中的制表符空格字符被认为是空格错误。如果发现问题,则以非零状态退出。与--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" 行上的完整前映像和后映像 blob 对象名称。
-
--binary
-
除了
--full-index
之外,还输出可以使用git-apply
应用的二进制差异。暗示--patch
。 -
--abbrev[=<n>]
-
不要在 diff-raw 格式输出和 diff-tree 标题行中显示完整的 40 字节十六进制对象名称,而是显示至少 <n> 位十六进制数字的最短前缀,该前缀唯一地引用该对象。在 diff-patch 输出格式中,
--full-index
具有更高的优先级,即,如果指定了--full-index
,则无论--abbrev
如何,都会显示完整的 blob 名称。可以使用--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>]
-
如果生成差异,则检测并报告每个提交的重命名。 要在遍历历史记录时跟踪跨重命名的文件,请参阅
--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
或git apply
; 这仅适用于只想专注于在更改后查看文本的人员。 此外,输出显然缺乏足够的信息来反向应用此类补丁,即使是手动应用,因此该选项的名称如此。与
-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 模式的顺序确定。 首先输出所有路径名与第一个模式匹配的文件,接下来输出所有路径名与第二个模式匹配的文件(但不与第一个模式匹配的文件),依此类推。 所有路径名与任何模式都不匹配的文件最后输出,就像文件末尾存在一个隐式匹配所有模式一样。 如果多个路径名具有相同的等级(它们匹配相同的模式但不匹配更早的模式),则它们相对于彼此的输出顺序是正常顺序。
<orderfile> 的解析方式如下
-
忽略空行,因此可以将它们用作分隔符以提高可读性。
-
忽略以散列 ("
#
") 开头的行,因此可以将它们用于注释。 如果模式以散列开头,请在模式的开头添加反斜杠 ("\
")。 -
其他每一行都包含一个模式。
模式的语法和语义与用于
fnmatch
(3) 的模式相同,但不包括FNM_PATHNAME
标志,除非删除任意数量的最终路径名组件后,路径名也与模式匹配。 例如,模式 "foo*bar
" 匹配 "fooasdfbar
" 和 "foo/bar/baz/asdf
" 但不匹配 "foobarx
"。 -
-
--skip-to=<file>
-
--rotate-to=<file>
-
从输出中丢弃指定 <file> 之前的文件(即跳到),或将它们移动到输出的末尾(即旋转到)。 这些选项最初是为了
git difftool
命令的使用而发明的,否则可能不是很有用。 -
-R
-
交换两个输入; 也就是说,显示从索引或磁盘文件到树内容的差异。
-
--relative[=<path>]
-
--no-relative
-
从项目的子目录运行时,可以告诉它排除目录外的更改,并使用此选项显示相对于该目录的路径名。 当您不在子目录中(例如,在裸存储库中)时,您可以通过将 <path> 作为参数来指定要使输出相对于哪个子目录。
--no-relative
可用于抵消diff.relative
配置选项和先前的--relative
。 -
-a
-
--text
-
将所有文件视为文本。
-
--ignore-cr-at-eol
-
在进行比较时,忽略行尾的回车符。
-
--ignore-space-at-eol
-
忽略行尾空格的变化。
-
-b
-
--ignore-space-change
-
忽略空格量的变化。这会忽略行尾的空格,并认为所有其他一个或多个空格字符的序列是等效的。
-
-w
-
--ignore-all-space
-
比较行时忽略空格。即使一行有空格而另一行没有空格,这也会忽略差异。
-
--ignore-blank-lines
-
忽略所有行都为空白的更改。
-
-I<regex>
-
--ignore-matching-lines=<regex>
-
忽略所有行都与 <regex> 匹配的更改。 可以多次指定此选项。
-
--inter-hunk-context=<number>
-
显示差异块之间的上下文,最多为指定行数的 <number> 行,从而融合彼此靠近的块。 默认为
diff.interHunkContext
,如果未设置配置选项,则为 0。 -
-W
-
--function-context
-
将整个函数显示为每个更改的上下文行。 函数名称的确定方式与
git diff
计算补丁块标头的方式相同(请参阅 gitattributes[5] 中的 "Defining a custom hunk-header")。 -
--ext-diff
-
允许执行外部差异帮助程序。 如果您使用 gitattributes[5] 设置了外部差异驱动程序,则需要将此选项与 git-log[1] 及其同伴一起使用。
-
--no-ext-diff
-
不允许外部差异驱动程序。
-
--textconv
-
--no-textconv
-
允许(或不允许)在比较二进制文件时运行外部文本转换过滤器。 有关详细信息,请参见 gitattributes[5]。 由于 textconv 过滤器通常是单向转换,因此生成的差异适合人类使用,但无法应用。 因此,默认情况下仅为 git-diff[1] 和 git-log[1] 启用 textconv 过滤器,但不为 git-format-patch[1] 或差异管道命令启用。
-
--ignore-submodules[=(none|untracked|dirty|all)]
-
忽略 diff 生成中子模块的更改。
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
-
默认情况下,由
git add -N
添加的条目在git diff
中显示为现有的空文件,在git diff --cached
中显示为新文件。此选项使条目在git diff
中显示为新文件,在git diff --cached
中显示为不存在。可以使用--ita-visible-in-index
撤消此选项。这两个选项都是实验性的,将来可能会被删除。
有关这些常用选项的更详细说明,另请参见 gitdiffcore[7]。
使用 -p 生成补丁文本
运行 git-diff[1]、git-log[1]、git-show[1]、git-diff-index[1]、git-diff-tree[1] 或 git-diff-files[1] 并使用 -p
选项会生成补丁文本。您可以通过 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
分别显示重命名/复制的源文件的名称和重命名/复制产生的文件名。 -
它后面跟着一个或多个扩展头部行
old mode <mode> new mode <mode> deleted file mode <mode> new file mode <mode> copy from <path> copy to <path> rename from <path> rename to <path> similarity index <number> dissimilarity index <number> index <hash>..<hash> <mode>
文件模式 <mode> 以 6 位八进制数打印,包括文件类型和文件权限位。
扩展头部中的路径名不包含
a/
和b/
前缀。相似性索引是不变行的百分比,而相异性索引是更改行的百分比。这是一个向下舍入的整数,后跟一个百分号。因此,100% 的相似性索引值保留给两个相等的文件,而 100% 的相异性意味着旧文件中的任何行都没有进入新文件。
索引行包括更改前后的 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 头部提到了 hunk 应用于的函数的名称。有关如何根据特定语言定制此信息的详细信息,请参见 gitattributes[5] 中的 "定义自定义 hunk 头部"。
合并 diff 格式
任何生成 diff 的命令都可以使用 -c
或 --cc
选项来生成在显示合并时的合并 diff。这是使用 git-diff[1] 或 git-show[1] 显示合并时的默认格式。另请注意,您可以为这些命令提供合适的 --diff-merges
选项,以强制生成特定格式的 diff。
“合并 diff” 格式如下所示
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> new file mode <mode> deleted file mode <mode>,<mode>只有当至少有一个 <mode> 与其余 <mode> 不同时,才会出现
mode <mode>,<mode>..<mode>
行。带有关于检测到的内容移动(重命名和复制检测)的信息的扩展头部设计用于两个 <tree-ish> 的 diff,不被合并 diff 格式使用。 -
它后面跟着一个双行的 from-file/to-file 头部
--- a/file +++ b/file
与传统的统一 diff 格式的双行头部类似,
/dev/null
用于指示创建或删除的文件。但是,如果提供了 --combined-all-paths 选项,则您将获得一个 N+1 行的 from-file/to-file 头部,而不是双行的 from-file/to-file 头部,其中 N 是合并提交中的父级数量
--- a/file --- a/file --- a/file +++ b/file
如果重命名或复制检测处于活动状态,则此扩展格式可能很有用,它允许您查看不同父级中文件的原始名称。
-
Chunk 头部格式已修改,以防止人们不小心将其馈送到
patch -p1
。创建合并 diff 格式是为了审查合并提交更改,而不是为了应用。@@@ <from-file-range> <from-file-range> <to-file-range> @@@
合并 diff 格式的 chunk 头部中有(父级数量 + 1)个
@
字符。
与传统的统一 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 是阶段 2,也称为 "我们的版本",file2 是阶段 3,也称为 "他们的版本")。
示例
-
git show v1.0.0
-
显示标签
v1.0.0
,以及标签指向的对象。 -
git show v1.0.0^{tree}
-
显示标签
v1.0.0
指向的树。 -
git show -s --format=%s v1.0.0^{commit}
-
显示标签
v1.0.0
指向的提交的主题。 -
git show next~10:Documentation/README
-
显示
Documentation/README
文件的内容,因为它们在分支next
的倒数第 10 次提交中是当前的。 -
git show master:Makefile master:t/Makefile
-
连接分支
master
头部中 Makefile 的内容。
讨论
Git 在某种程度上与字符编码无关。
-
Blob 对象的内容是未解释的字节序列。核心级别没有编码转换。
-
路径名以 UTF-8 规范化形式 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 和 Git Porcelain 的设计均未强制项目使用 UTF-8。 如果特定项目的所有参与者都觉得使用旧版编码更方便,Git 也不会禁止。 但是,需要记住以下几点。
-
如果提供给
git commit
和git commit-tree
的提交日志消息看起来不像有效的 UTF-8 字符串,则它们会发出警告,除非您明确声明您的项目使用旧版编码。 声明此编码的方式是在.git/config
文件中设置i18n.commitEncoding
,如下所示:[i18n] commitEncoding = ISO-8859-1
使用上述设置创建的提交对象会在其
encoding
标头中记录i18n.commitEncoding
的值。 这是为了帮助以后查看这些提交对象的人。 缺少此标头表示提交日志消息使用 UTF-8 编码。 -
git log
、git show
、git blame
等命令会查看提交对象的encoding
标头,并尝试将日志消息重新编码为 UTF-8,除非另有指定。 您可以使用.git/config
文件中的i18n.logOutputEncoding
指定所需的输出编码,如下所示:[i18n] logOutputEncoding = ISO-8859-1
如果您没有此配置变量,则改用
i18n.commitEncoding
的值。
请注意,我们特意选择不在提交时重新编码提交日志消息以强制在提交对象级别使用 UTF-8,因为重新编码为 UTF-8 不一定是可逆操作。