Setup and Config
Getting and Creating Projects
Basic Snapshotting
Branching and Merging
Sharing and Updating Projects
Inspection and Comparison
Patching
Debugging
External Systems
Server Admin
Guides
- gitattributes
- Command-line interface conventions
- Everyday Git
- Frequently Asked Questions (FAQ)
- Glossary
- Hooks
- gitignore
- gitmodules
- Revisions
- Submodules
- Tutorial
- Workflows
- All guides...
Administration
Plumbing Commands
-
2.49.0
2025-03-14
- 2.48.1 no changes
-
2.48.0
2025-01-10
- 2.46.1 → 2.47.2 no changes
-
2.46.0
2024-07-29
-
2.45.3
2024-11-26
- 2.45.1 → 2.45.2 no changes
-
2.45.0
2024-04-29
- 2.44.1 → 2.44.3 no changes
-
2.44.0
2024-02-23
- 2.43.1 → 2.43.6 no changes
-
2.43.0
2023-11-20
- 2.42.2 → 2.42.4 no changes
-
2.42.1
2023-11-02
-
2.42.0
2023-08-21
- 2.41.1 → 2.41.3 no changes
-
2.41.0
2023-06-01
- 2.40.1 → 2.40.4 no changes
-
2.40.0
2023-03-12
- 2.36.1 → 2.39.5 no changes
-
2.36.0
2022-04-18
- 2.35.1 → 2.35.8 no changes
-
2.35.0
2022-01-24
- 2.33.3 → 2.34.8 no changes
-
2.33.2
2022-03-23
-
2.33.1
2021-10-12
-
2.33.0
2021-08-16
- 2.32.1 → 2.32.7 no changes
-
2.32.0
2021-06-06
- 2.31.1 → 2.31.8 no changes
-
2.31.0
2021-03-15
- 2.30.1 → 2.30.9 no changes
-
2.30.0
2020-12-27
- 2.29.1 → 2.29.3 no changes
-
2.29.0
2020-10-19
- 2.28.1 no changes
-
2.28.0
2020-07-27
- 2.27.1 no changes
-
2.27.0
2020-06-01
- 2.26.1 → 2.26.3 no changes
-
2.26.0
2020-03-22
- 2.25.2 → 2.25.5 no changes
-
2.25.1
2020-02-17
-
2.25.0
2020-01-13
- 2.24.1 → 2.24.4 no changes
-
2.24.0
2019-11-04
- 2.22.1 → 2.23.4 no changes
-
2.22.0
2019-06-07
- 2.21.1 → 2.21.4 no changes
-
2.21.0
2019-02-24
- 2.20.1 → 2.20.5 no changes
-
2.20.0
2018-12-09
- 2.19.1 → 2.19.6 no changes
-
2.19.0
2018-09-10
- 2.18.1 → 2.18.5 no changes
-
2.18.0
2018-06-21
- 2.17.1 → 2.17.6 no changes
-
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 no changes
-
2.6.7
2017-05-05
-
2.5.6
2017-05-05
-
2.4.12
2017-05-05
- 2.3.10 no changes
-
2.2.3
2015-09-04
-
2.1.4
2014-12-17
-
2.0.5
2014-12-17
描述
显示一个或多个对象(Blobs、树、标签和提交)。
对于提交,它显示日志信息和文本差异。并会以一种特殊的格式显示合并提交,就像 git diff-tree --cc 所产生的信息那样。
对于标签,它显示标签信息和引用的对象。
对于目录树,它显示名字(相当于 git ls-tree 添加了 --name-only 选项)。
对于普通二进制对象,它显示普通内容。
git log 命令理解的一些选项可以用来控制如何显示提交带来的改动。
本手册页只描述了最常用的选项。
选项
- <对象>…
-
要显示的对象的名称(默认为’HEAD')。 更完整的对象名称拼写方式列表,请参见 gitrevisions[7] 中的 "特别修订" 部分。
- --pretty[=<格式>]
- --format=<格式>
-
以指定的格式打印提交日志的内容,其中'<format>'可以是’oneline'、short、medium、full、fuller、reference、email、raw、format:<string>'和’tformat:<string>'之一。 当<format>'不是上述任何一种,并且其中有'%placeholder’时,它的作用就像给出'--pretty=tformat:<format>'一样。
参见 "PRETTY FORMATS "部分,了解每种格式的一些额外细节。 当'=<格式>'部分被省略时,它默认为’中等'。
注意:你可以在版本库配置中指定默认的漂亮格式(见git-config[1])。
- --abbrev-commit
-
不要显示完整的40字节的十六进制提交对象名称,而是显示一个前缀,以唯一的方式命名该对象。 "--abbrev=<n>"选项可以用来指定前缀的最小长度(如果显示的话,它也会修改diff输出)。
这应该使"--pretty=oneline "对于使用80列终端的人来说更容易阅读。
- --no-abbrev-commit
-
显示完整的40字节十六进制的提交对象名称。这否定了`--abbrev-commit`,无论是明确的还是由其他选项如"--oneline "暗示的。它还覆盖了`log.abbrevCommit`变量。
- --oneline
-
这是"--pretty=oneline --abbrev-commit "的简写,一起使用。
- --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个空格(即 "中",这是默认的,"全",和 "更全")。
- --notes[=<引用>]
-
在显示提交日志信息时,显示注释提交的说明(见git-notes[1])。 这是`git log`、
git show`和`git whatchanged`命令的默认设置,当命令行中没有给出
--pretty`、--format`或
--oneline`选项时。默认情况下,显示的注释来自于`core.notesRef`和`notes.displayRef`变量(或相应的环境覆盖)中列出的注释参考。更多细节见git-config[1]。
有了一个可选的 <引用> 参数,就可以使用引用来寻找要显示的笔记。 当引用以
refs/notes/
开头时,可以指定完整的引用名称;当它以notes/
开头时,refs/
,否则refs/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[=<引用>]
- --[no-]standard-notes
-
这些选项已被废弃。请使用上面的 --notes/--no-notes 选项来代替。
- --show-signature
-
通过将签名传递给
gpg --verify
来检查已签名的提交对象的有效性,并显示输出。
漂亮的格式
如果提交是一个合并,并且如果pretty-format不是 "oneline"、"email "或 "raw",那么在 "Author: "一行之前会插入一个附加行。 这一行的开头是 "Merge:这一行以 "Merge: "开头,并打印出祖先提交的哈希值,用空格分隔。 请注意,如果你限制了你的历史视图,那么列出的提交不一定是*直接*父级提交的列表:例如,如果你只对与某个目录或文件有关的修改感兴趣。
有几种内置的格式,你可以通过将 pretty.<名称> 配置选项设置为另一种格式名称或 format: 字符串来定义额外的格式,如下所述(见 git-config[1] )。下面是内置格式的细节:
-
oneline
<哈希值> <标题行>
这个设计是为了尽可能的紧凑。
-
short
承诺<hash> 作者。<作者>的情况
<标题行>
-
medium
commit <哈希值> Author: <作者> Date: <提交日期>
<标题行>
<完整的提交信息
-
full
承诺<hash> 作者。< Author> 承诺。<committer>(提交者)。
<标题行>
<完整的提交信息
-
fuller
commit <哈希值> Author: <作者> AuthorDate: <作者提交日期> Commit: <提交者> CommitDate: <提交者提交日期>
<标题行>
<完整的提交信息
-
‘引用’
<缩写哈希值>(<标题行>,<简短的作者日期>)
这种格式用于在提交信息中引用另一个提交,与`--pretty='format:%C(auto)%h (%s, %ad)'相同。 默认情况下,日期的格式为`--date=short`,除非明确指定其他`--date`选项。 与任何带有格式占位符的`format:
一样,其输出不受其他选项的影响,如
--decorate`和`--walk-reflogs`。 -
email
From <哈希> <日期> From: <作者> Date: <作者提交日期> Subject: [PATCH] <标题行>
<完整的提交信息
-
mboxrd
和 "email "一样,但提交信息中以 "From "开头的行(前面有零个或多个">")用">"引出,这样就不会被混淆为开始了一个新的提交。
-
raw
原始 "格式显示的是整个提交对象中存储的内容。 值得注意的是,无论是否使用了 --abbrev 或 --no-abbrev,哈希值都会被完整地显示出来,而’parent’信息会显示真正的父级提交,不会考虑移花接木或历史简化。注意,这种格式会影响提交的显示方式,但不会影响diff的显示方式,比如用`git log --raw`来显示。要获得原始差异格式的完整对象名称,请使用`--no-abbrev`。
-
format:<格式字符串>
format:<格式字符串 格式允许你指定要显示的信息。它的工作原理有点像 printf 格式,但有一个明显的例外,那就是换行符是 %n 而不是 \n。
例如,format: "The author of %h was %an, %ar%nThe title was >>%s<<%n" 会显示这样的内容:
fe6e0ee的作者是Junio C Hamano, 23小时前 标题是 >>t4119: 测试传统diff输入的自动计算-p<n>。
占位符是:
-
占位符,可扩展为一个字面字符:
-
影响后面占位符的格式化的占位符:
- %Cred
-
切换颜色为红色
- %Cgreen
-
切换颜色为绿色
- %Cblue
-
将颜色改为蓝色
- %Creset
-
重置颜色
- %C(…)
-
颜色规范,如git-config[1]的 "配置文件 "部分中的数值描述。 默认情况下,只有在启用日志输出时才会显示颜色(通过
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
-
尊重 .mailmap 作者的本地部分(参见 %al ),参见 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
-
ref名称,就像git-log[1]的—decorate选项。
- %D
-
没有"("、")"包装的参考文献名称。
- %(decorate[:<选项>])
-
自定义装饰的引用名称。
decorate
字符串后面可以是冒号和零个或多个以逗号分隔的选项。选项值可能包含字面格式化代码。由于逗号(%x2C
)和结尾括号(%x29
)在选项语法中的作用,因此必须使用这些代码。-
prefix=<值>: 显示在引用名称列表之前。 默认为 "
(
"。 -
suffix=<值>: 显示在引用名称列表之后。 默认为 "
)
"。 -
separator=<值>: 显示在引用名称之间。 默认为 "
,
"。 -
point=<值>: 显示在 HEAD 和其指向的分支(如果有)之间。 默认为 "
->
"。 -
tag=<值>: 显示在标记名称之前。默认为 "
tag:
"。
-
例如,制作不带包装或标签注释的装饰,并用空格作为分隔符:
+
%(decorate:prefix=,suffix=,tag=,separator= )
- %(describe[:<选项>])
-
人类可读的名字,像git-describe[1];空字符串表示不可描述的提交。 `describe`字符串后面可以有冒号和零个或多个逗号分隔的选项。 当标签同时被添加或删除时,描述可能不一致。
-
tags[=<bool-value>]:不仅考虑带注释的标签,还考虑轻量级标签。
-
abbrev=<数量>:不使用缩写对象名称的默认十六进制位数(根据仓库中对象的数量而变化,默认为 7 位),而是使用 <数量> 的位数,或根据需要的位数来组成唯一的对象名称。
-
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分钟前}
;其格式遵循`-g`选项的规则。@'前面的部分是命令行上给出的参考文献名称(所以`git log -g refs/heads/master`会产生`refs/heads/master@{0}
)。 - %gd
-
简化的 reflog 选择器;与
%gD
相同,但 refname 部分被缩短以利于人类阅读(因此refs/heads/master
变成了master
)。 - %gn
-
记录身份名称
- %gN
-
引用日志身份名称(尊重 .mailmap,参见 git-shortlog[1] 或 git-blame[1]
- %ge
-
重新记录身份邮件
- %gE
-
引用日志身份电子邮箱(尊重 .mailmap,参见 git-shortlog[1] 或 git-blame[1]
- %gs
-
记录主题
- %(trailers[:<选项>])
-
显示由 git-interpret-trailers[1] 解释的正文的为主。
trailers
字符串后面可以有冒号和零个或多个逗号分隔的选项。 如果任何选项被多次提供,则最后出现的选项获胜。-
key=<键>:只显示具有指定密钥的为主。匹配是不分大小写的,后面的冒号是可选的。如果多次给出选项,则显示与任何键匹配的为主行。该选项自动启用
only
选项,使拖车块中的非尾注行被隐藏。如果不希望这样,可以用only=false
禁用。 例如,%(trailers:key=Reviewed-by)
显示键为Reviewed-by
的拖车行。 -
only[=<布尔值>] :选择是否应该包括来自尾注块的非尾注行。
-
separator=<sep>: specify the separator inserted between trailer lines. Defaults to a line feed character. The string <sep> may contain the literal formatting codes described above. To use comma as separator one must use
%x2C
as it would otherwise be parsed as next option. E.g.,%(trailers:key=Ticket,separator=%x2C )
shows all trailer lines whose key is "Ticket" separated by a comma and a space. -
unfold[=<布尔值>]:使它的行为就像 interpret-trailer 的
--unfold
选项被给出一样。例如,`%(trailers:only,unfold=true)`会展开并显示所有的尾注行。 -
keyonly[=<布尔值>]:只显示尾注的关键部分。
-
valueonly[=<布尔值>]:只显示尾注的值部分。
-
key_value_separator=<sep>: specify the separator inserted between the key and value of each trailer. Defaults to ": ". Otherwise it shares the same semantics as separator=<sep> above.
-
-
Note
|
一些占位符可能取决于给修订版遍历引擎的其他选项。例如,%g* reflog选项将插入一个空字符串,除非我们正在遍历reflog条目(例如,通过`git log -g`)。%d`和 %D`占位符将使用 "短 "装饰格式,如果`--decorate`没有在命令行上提供。
|
The boolean options accept an optional value [=<bool-value>]
. The values taken by --type=bool
git-config[1], like yes
and off
, are all accepted. Giving a boolean option without =<value>
is equivalent to giving it with =true
.
如果你在占位符的'%后面加了一个`+(加号),当且仅当占位符扩展为一个非空字符串时,在扩展前会立即插入换行符。
如果你在占位符的'%后面加了一个`-(减号),如果且仅当占位符扩展为空字符串时,紧接着扩展前的所有连续换行将被删除。
如果你在占位符的'%'后面加了一个``(空格),当且仅当占位符扩展到一个非空字符串时,空格就会紧接着插入扩展。
-
t格式:
tformat: 格式的工作原理与 format: 完全一样,只是它提供了 “终止符” 语义,而不是 “分隔符” 语义。换句话说,每个提交都附加了信息结束符(通常是换行符),而不是在条目之间放置一个分隔符。 这意味着单行格式的最后一个条目将正确地以新行结束,就像 “单行” 格式那样。 比如说:
$ 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 show`生成差异输出的方式。
Warning
|
Missing See original version for this content. |
使用选项 -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])自定义补丁文本的创建。
What the -p
option produces is slightly different from the traditional diff format:
-
它前面有一个
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>
File modes <mode> are printed as 6-digit octal numbers including the file type and file permission bits.
扩展头信息中的路径名称不包括
a/
和b/
前缀。相似性指数是未改变的行占比,而不相似性指数是改变的行占比。它是四舍五入的整数,后有百分号。因此,100%的相似度指数指为两个文件相等,而 100% 的不相似度意味着入新文件中没有旧文件中的行。
The index line includes the blob object names before and after the change. The <mode> is included if the file mode does not change; otherwise, separate lines indicate the old and the new mode.
-
含有 "不常见" 字符的路径名会被引用,这一点在配置变量` core.quotePath` 中有所解释(见 git-config[1])。
-
输出中所有的
file1
文件都是指提交前的文件,而所有的file2
文件都是指提交后的文件。按顺序对每个文件进行修改是不正确的。例如,这个补丁将交换文件 a 和 b:diff --git a/a b/b rename from a rename to b diff --git a/b b/a rename from b rename to a
-
块头提到了块头所适用的函数的名称。 参见 gitattributes[5] 中的 “定义自定义 hunk-header”,以了解如何针对特定语言进行定制。
合并的差异格式
任何生成差异的命令都可以使用 -c
或 --cc
选项,在显示合并时产生一个 “合并差异”。当用 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> new file mode <mode> deleted file mode <mode>,<mode>The
mode <mode>,<mode>..<mode>
line appears only if at least one of the <mode> is different from the rest. Extended headers with information about detected content movement (renames and copying detection) are designed to work with the diff of two <tree-ish> and are not used by combined diff format. -
它的后面是两行源文件/目标文件的头信息:
--- a/file +++ b/file
与传统 ‘统一’ diff 格式的双行标题类似,
/dev/null
用于表示已创建或已删除的文件。但是,如果提供了 --combined-all-paths 选项,你就会得到一个 N+1 行的源文件/目标文件头,其中 N 是合并提交中的父提交数量:
--- a/file --- a/file --- a/file +++ b/file
如果重命名或复制检测处于活动状态,这种扩展格式可能很有用,可以让你在不同的父提交中看到文件的原始名称。
-
修改了文件块头信息的格式,以防止不小心将其送入
patch -p1
。合并的差异格式是为审查合并提交的修改而创建的,并不是为了应用。这个变化类似于扩展的 "索引" 头信息的变化:@@@ <from-file-range> <from-file-range> <to-file-range> @@@
块中有(父提交数量+1)
@
字符,用于合并的差异格式。
与传统的 "统一" 差异格式不同,这种格式显示两个文件 A 和 B 的列,其中有 -
(减号 — 在 A 中出现,但在 B 中删除),+
(加号 — 在 A 中缺少,但在 B 中增加),或 " "
(空格 — 不变)前缀,这种格式比较两个或多个文件与一个文件 X,并显示 X 与其中每个文件的差异。文件中的每一个都有一列被前置在输出行中,以指出 X 的行与它的不同之处。
第 N 列中的 -
字符意味着该行出现在文件 N 中,但它没有出现在结果文件中。第 N 列中的 +
字符意味着该行出现在结果文件中,而文件 N 中没有该行(换句话说,从该父提交的角度来看,该行是被添加的)。
在上面的输出示例中,两个文件中的函数签名都被改变了(因此从文件 1 和文件 2 中都有表示删除的 -
,而 ++
表示被添加的一行没有出现在文件 1 或文件 2 中)。另外还有 8 行与文件 1 中的相同,但没有出现在文件 2 中(因此前缀为 +
)。
当用 git diff-tree -c
显示时,它将合并提交的父提交文件与合并结果进行比较(即文件 1 … 文件 N 是父提交文件)。当用 git diff-files -c
显示时,它将两个未解决的合并父提交文件与工作树文件进行比较(即文件 1 是阶段 2 ,又称 "我们的版本",文件 2 是阶段 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
-
将上述Makefiles的内容串联在分支`master`的头部。
讨论
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 Porcelain的设计并不强制要求项目使用UTF-8。 如果某个项目的所有参与者都认为使用传统编码更方便,Git也不会禁止。 然而,有几件事需要注意。
-
git commit
andgit commit-tree
issue a warning if the commit log message given to it does not look like a valid UTF-8 string, unless you explicitly say your project uses a legacy encoding. The way to say this is to havei18n.commitEncoding
in.git/config
file, like this:[i18n] commitEncoding = ISO-8859-1
用上述设置创建的提交对象在它的
encoding
头中记录了i18n.commitEncoding
的值。 这是为了帮助以后看这些对象的人。 缺少这个头意味着提交日志信息是以 UTF-8 编码的。 -
git log
,git show
,git blame
and friends look at theencoding
header of a commit object, and try to re-code the log message into UTF-8 unless otherwise specified. You can specify the desired output encoding withi18n.logOutputEncoding
in.git/config
file, like this:[i18n] logOutputEncoding = ISO-8859-1
如果你没有这个配置变量,则使用`i18n.commitEncoding`的值来代替。
请注意,我们特意选择在提交对象层面上,不对提交日志信息进行重新编码,因为重新编码为UTF-8不一定是一个可逆的操作。
GIT
属于 git[1] 文档