设置和配置
获取和创建项目
基本快照
分支与合并
共享和更新项目
检查和比较
打补丁
调试
电子邮件
外部系统
服务器管理
指南
管理
底层命令
-
2.55.0
2026-06-29
- 2.49.1 → 2.54.0 无变更
-
2.49.0
2025-03-14
- 2.45.1 → 2.48.2 无更改
-
2.45.0
2024-04-29
- 2.43.1 → 2.44.4 无更改
-
2.43.0
2023-11-20
- 2.35.1 → 2.42.4 无更改
-
2.35.0
2022-01-24
- 2.31.1 → 2.34.8 无变更
-
2.31.0
2021-03-15
- 2.27.1 → 2.30.9 无变更
-
2.27.0
2020-06-01
- 2.25.2 → 2.26.3 无变更
- 2.25.1 无变化
- 2.22.1 → 2.25.0 无变更
-
2.22.0
2019-06-07
- 2.14.6 → 2.21.4 无变更
-
2.13.7
2018-05-22
- 2.12.5 无更改
-
2.11.4
2017-09-22
- 2.10.5 无更改
-
2.9.5
2017-07-30
- 2.7.6 → 2.8.6 无更改
-
2.6.7
2017-05-05
- 2.5.6 无更改
-
2.4.12
2017-05-05
- 2.1.4 → 2.3.10 无更改
-
2.0.5
2014-12-17
概要
git commit-tree <tree> [(-p <parent>)…] git commit-tree [(-p <parent>)…] [-S[<keyid>]] [(-m <message>)…] [(-F <file>)…] <tree>
描述
通常终端用户不需要直接运行此命令。请参阅 git-commit[1]。
基于提供的树对象创建一个新的提交对象,并将新提交对象的 ID 输出到标准输出(stdout)。提交日志消息从标准输入(stdin)读取,除非指定了 -m 或 -F 选项。
-m 和 -F 选项可以按任意顺序指定任意次数。提交日志消息将按照选项给出的顺序进行组合。
一个提交对象可以有任意数量的父提交。只有一个父提交时,它是普通提交。拥有多个父提交则使该提交成为多条历史记录的合并。初始(根)提交没有父提交。
虽然树(tree)表示工作目录的特定目录状态,但提交(commit)表示该状态在“时间”上的表现,并解释了如何达到该状态。
通常,提交会标识一个新的“HEAD”状态。虽然 Git 并不关心你将该状态的说明保存在哪里,但在实践中,我们倾向于将结果写入 .git/HEAD 所指向的文件中,以便我们能够随时查看最后一次提交的状态。
选项
- <tree>
-
一个现有的树对象。
- -p <parent>
-
每个
-p表示一个父提交对象的 ID。 - -m <message>
-
提交日志消息中的一段。此选项可以多次指定,每个 <message> 都会成为一个独立的段落。
- -F <file>
-
从指定文件中读取提交日志消息。使用
-可从标准输入读取。此选项可以多次指定,每个文件的内容都会成为一个独立的段落。 - -S[<keyid>]
- --gpg-sign[=<keyid>]
- --no-gpg-sign
-
使用 GPG 签名提交。
keyid参数是可选的,默认为提交者身份;如果指定,它必须紧跟在选项之后,中间不能有空格。--no-gpg-sign用于撤销命令行中较早前指定的--gpg-sign选项。
提交信息
一个提交封装了:
-
所有父对象 ID
-
作者姓名、电子邮件和日期
-
提交者姓名、电子邮件和提交时间。
提交注释从 stdin 读取。如果没有通过 "<" 重定向提供变更日志条目,git commit-tree 将等待输入,并以 ^D 结束。
日期格式
GIT_AUTHOR_DATE 和 GIT_COMMITTER_DATE 环境变量支持以下日期格式:
- Git 内部格式
-
格式为 <unix-timestamp> <time-zone-offset>,其中 <unix-timestamp> 是自 UNIX 纪元以来的秒数。<time-zone-offset> 是相对于 UTC 的正或负偏移量。例如,CET(比 UTC 早 1 小时)是
+0100。在 <unix 时间戳> 前面加上
@(例如,@0+0000)会更安全,这会强制 Git 将其解释为原始时间戳。对于小于 100,000,000 的值(不足 9 位数字),这是必需的,以避免与其他日期格式(如YYYYMMDD)混淆。 - RFC 2822
-
RFC 2822 所描述的标准日期格式,例如
Thu,07Apr200522:13:13+0200。 - ISO 8601
-
由 ISO 8601 标准指定的日期和时间,例如
2005-04-07T22:13:13。解析器也接受用空格代替T字符。小数秒将被忽略,例如2005-04-07T22:13:13.019将被视为2005-04-07T22:13:13。注意此外,日期部分支持以下格式: YYYY.MM.DD、MM/DD/YYYY和DD.MM.YYYY。
讨论
Git 在某种程度上是字符编码无关的。
-
blob 对象的内容是未经解释的字节序列。核心层面没有编码转换。
-
路径名以 UTF-8 规范形式 C 进行编码。这适用于 tree 对象、索引文件、引用名称,以及命令行参数、环境变量和配置文件(
.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 并不禁止。但是,有几点需要注意。
-
gitcommit和gitcommit-tree会在提交日志消息看起来不像有效的 UTF-8 字符串时发出警告,除非你明确声明你的项目使用遗留编码。通过在.git/config文件中设置i18n.commitEncoding来声明,例如:[i18n] commitEncoding = ISO-8859-1
使用上述设置创建的提交对象会将其
i18n.commitEncoding的值记录在它们的encoding头中。这是为了帮助以后查看它们的人。缺少此头表示提交日志消息是 UTF-8 编码的。 -
gitlog、gitshow、gitblame等命令会查看提交对象的encoding头,并尝试将日志消息重新编码为 UTF-8,除非另有说明。你可以通过在.git/config文件中设置i18n.logOutputEncoding来指定所需的输出编码,例如:[i18n] logOutputEncoding = ISO-8859-1
如果您没有此配置变量,则会使用
i18n.commitEncoding的值。
请注意,我们故意选择在提交时不对提交日志消息进行重新编码以强制在提交对象级别使用 UTF-8,因为重新编码为 UTF-8 不一定是可逆操作。