设置和配置
获取和创建项目
基本快照
分支和合并
共享和更新项目
检查和比较
修补
调试
邮件
外部系统
服务器管理员
指南
管理
底层命令
- 2.45.1 → 2.47.0 无更改
- 2.45.0 04/29/24
- 2.43.1 → 2.44.2 无更改
- 2.43.0 11/20/23
- 2.35.1 → 2.42.3 无更改
- 2.35.0 01/24/22
- 2.31.1 → 2.34.8 无更改
- 2.31.0 03/15/21
- 2.27.1 → 2.30.9 无更改
- 2.27.0 06/01/20
- 2.25.2 → 2.26.3 无更改
- 2.25.1 无更改
- 2.22.1 → 2.25.0 无更改
- 2.22.0 06/07/19
- 2.14.6 → 2.21.4 无更改
- 2.13.7 05/22/18
- 2.12.5 无更改
- 2.11.4 09/22/17
- 2.10.5 无更改
- 2.9.5 07/30/17
- 2.7.6 → 2.8.6 无更改
- 2.6.7 05/05/17
- 2.5.6 无更改
- 2.4.12 05/05/17
- 2.1.4 → 2.3.10 无更改
- 2.0.5 12/17/14
概要
git commit-tree <tree> [(-p <parent>)…] git commit-tree [(-p <parent>)…] [-S[<keyid>]] [(-m <message>)…] [(-F <file>)…] <tree>
描述
这通常不是最终用户想要直接运行的命令。请改用 git-commit[1]。
根据提供的树对象创建一个新的提交对象,并在标准输出上输出新的提交对象 ID。除非给出 -m
或 -F
选项,否则将从标准输入读取日志消息。
-m
和 -F
选项可以多次给出,并且可以按任何顺序给出。提交日志消息将按照选项给出的顺序组成。
一个提交对象可以有多个父对象。只有一个父对象时,它是一个普通的提交。有多个父对象时,该提交是多条历史记录之间的合并。初始(根)提交没有父对象。
树表示工作目录的特定目录状态,而提交表示该状态在“时间”中的状态,并说明如何到达该状态。
通常,提交会识别一个新的“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
。 - RFC 2822
-
RFC 2822 中描述的标准日期格式,例如
Thu, 07 Apr 2005 22: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 编码。这适用于树对象、索引文件、引用名称,以及命令行参数、环境变量和配置文件(
.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 和 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 不一定是可逆的操作。
GIT
是 git[1] 套件的一部分