【git系列】git-commit含义用法选项示例详解

【git系列】git-commit含义用法选项示例详解

描述

git commit命令用于记录对存储库的更改。

用法

git commit [-a | --interactive | --patch] [-s] [-v] [-u<mode>] [--amend]
	   [--dry-run] [(-c | -C | --squash) <commit> | --fixup [(amend|reword):]<commit>)]
	   [-F <file> | -m <msg>] [--reset-author] [--allow-empty]
	   [--allow-empty-message] [--no-verify] [-e] [--author=<author>]
	   [--date=<date>] [--cleanup=<mode>] [--[no-]status]
	   [-i | -o] [--pathspec-from-file=<file> [--pathspec-file-nul]]
	   [(--trailer <token>[(=|:)<value>])…] [-S[<keyid>]]
	   [--] [<pathspec>…]

说明

git commit命令用于创建一个包含当前暂存区内容给定的日志消息的新提交。新提交是HEAD的直接子节点,通常是当前分支的最新提交,并且该分支会更新为指向它(除非工作树没有关联的分支,此时HEAD处于"detached"状态,详情请参见git-checkout[1])。

可以通过多种方式指定要提交的内容

  • 使用git-add[1]在使用commit命令之前逐步“添加”更改到暂存区(注意:即使修改了文件也必须“添加”);
  • 使用git-rm[1]在使用commit命令之前从工作树和暂存区中删除文件;
  • 将文件列为commit命令的参数(不带–interactive或–patch选项),此时提交将忽略暂存区中的更改,而是记录已列出文件的当前内容(这些文件必须已被Git知道);
  • 使用commit命令的-a选项自动从所有已知文件(即已在暂存区中列出的所有文件)中“添加”更改,并自动从暂存区中删除已从工作树中删除的文件,然后执行实际提交;
  • 使用commit命令的–interactive或–patch选项,在最终操作之前逐个决定哪些文件或hunks应包含在提交中,除了暂存区中的内容。有关如何操作这些模式的详细信息,请参阅git-add[1]中的“交互模式”部分。

通过使用–dry-run选项,可以通过给定相同的参数(选项和路径)来获取任何上述选项包含的内容的下一次提交的摘要。

如果您提交后发现错误,可以使用git reset进行恢复。

请参阅git-commit[1]获取更多详细信息。

选项

选项描述
-a, --all自动将已修改和已删除的文件添加到暂存区,但未告知Git的新文件不受影响。
-p, --patch使用交互式补丁选择界面选择要提交的更改。详见git-add[1]。
-C , --reuse-message=使用现有的提交对象,在创建提交时重用日志消息和作者信息(包括时间戳)。
-c , --reedit-message=类似于-C,但使用-c时会调用编辑器,以便用户可以进一步编辑提交消息。
–fixup=[(amend|reword):]创建一个“修复”的新提交,当应用git rebase --autosquash时。plain --fixup=创建一个“修复!”提交,它更改了的内容,但保持其日志消息不变。–fixup=amend:类似,但创建一个"amend!"提交,它还用"amend!"提交的日志消息替换了的日志消息。–fixup=reword:创建一个"amend!"提交,它将的日志消息替换为自己的日志消息,但对的内容不做任何更改。
–squash=为与rebase --autosquash一起使用构建一个提交消息。提交消息的主题行来自指定的提交,并带有“squash!”前缀。可以与其他提交消息选项(-m/-c/-C/-F)一起使用。
–reset-author当与-C/-c/–amend选项一起使用时,或在冲突的cherry-pick之后进行提交时,声明结果提交的作者现在属于提交者。这还会更新作者时间戳。
-s, --signoff | --no-signoff在提交日志消息末尾添加一个Signed-off-by trailer。签名的含义取决于您提交的项目。例如,它可能证明提交者在项目的许可下有权提交工作,或者同意某些贡献者声明,例如开发者证书原则。请参阅项目的文档或领导以了解在该项目中如何使用签名。–no-signoff选项可用于撤销先前命令行上的–signoff选项。
–trailer [(=😃]
-F , --file=从给定文件获取提交消息。使用"-"从标准输入读取消息。
–author=覆盖提交作者。使用标准的A U Thor <author@example.com>格式指定明确的作者。否则,被假设为一个模式,并用它来搜索由该作者创建的现有提交(即rev-list --all -i --author=);然后,提交作者将从找到的第一个提交中复制过来。
–date=覆盖用于提交的作者日期。
-m , --message=将给定的用作提交消息。如果给出了多个-m选项,则它们的值将作为单独的段落连接起来。-m选项与-c、-C和-F互斥。
-t , --template=在编辑提交消息时,使用给定文件中的内容启动编辑器。commit.template配置变量通常用于隐式地向命令提供此选项。这种机制可用于希望通过一些提示来引导参与者按照何种顺序在消息中写入内容的项目。如果用户退出编辑器而不编辑消息,则提交将被中止。当以其他方式给出消息时(例如,使用-m或-F选项),此选项不起作用。
-u[], --untracked-files[=]显示未跟踪的文件。模式参数是可选的(默认为all),用于指定对未跟踪文件的处理方式;当-u未使用时,默认值为normal,即显示未跟踪的文件和目录。可能的选项有:no、normal和all。可以使用status.showUntrackedFiles配置变量更改默认值。
-v, --verbose在提交消息模板底部显示HEAD提交与将要提交的内容之间的统一差异,以帮助用户通过提醒提交所做的更改来描述提交。注意,此差异输出不会以#前缀开头。此差异不会成为提交消息的一部分。请参阅git-config[1]中的commit.verbose配置变量。如果指定两次,则还会显示将要提交的内容与工作树文件之间的统一差异,即已跟踪文件的未暂存更改。
-q, --quiet抑制提交摘要消息。
–dry-run不创建提交,而是显示将要提交的路径列表,保留未提交的本地更改的路径列表以及未跟踪的路径列表。
–status在使用编辑器准备提交消息时,将git-status[1]的输出包含在提交消息模板中。默认情况下启用,但可以用于覆盖配置变量commit.status。
–no-status在使用编辑器准备默认提交消息时,不包含git-status[1]的输出。
-S[], --gpg-sign[=] | --no-gpg-signGPG签名提交。keyid参数是可选的,默认为提交者身份;如果指定,必须将其粘贴到选项中而没有空格。–no-gpg-sign对于撤销先前的–gpg-sign选项和早期的–gpg-sign选项都很有用。
不再将后续参数解释为选项。
当在命令行上给出pathspec时,提交与匹配pathspec的文件的内容,而无需记录已添加到暂存区的更改。这些文件的内容也会为下一次提交而暂存,超过之前已暂存的内容。

示例

1.将当前暂存区内容和消息一起创建一个新的提交

git commit -m "Add new feature"

此命令将当前暂存区的内容和给定的日志消息一起创建一个新的提交。新的提交是HEAD的直接子节点,通常是当前分支的最新提交,并且该分支被更新以指向它。

2.将自动将所有已修改和已删除的文件添加到暂存区,并创建一个新的提交

git commit -a -m "Fix bug"

此命令将自动将所有已修改和已删除的文件添加到暂存区,并创建一个新的提交。新的提交是HEAD的直接子节点,通常是当前分支的最新提交,并且该分支被更新以指向它。

3.撤销git add操作

当记录自己的工作时,通过git add命令将工作树中修改文件的内容暂时存储到一个称为“索引”的暂存区域中。可以使用git restore --staged 命令将文件恢复到上一次提交时的状态,只会影响索引而不会影响工作树,这样可以撤销git add操作,并且防止这些文件的更改参与下一次提交。

git restore --staged <file>

4.冲突

在合并(由git merge或git pull发起)因冲突而停止后,已经干净地合并的路径已经被暂存以便提交,而有冲突的路径则保持在未合并状态。

首先使用git status检查哪些路径与冲突,并在工作树中手动修复它们后,可以像平常一样使用git add将结果暂存:

$ git status | grep unmerged
unmerged: hello.c
$ edit hello.c
$ git add hello.c

在解决冲突并将结果暂存后,git ls-files -u将不再提到冲突的路径。完成后,运行git commit最终记录合并:

$ git commit

与记录自己的更改一样,可以使用-a选项来节省输入。一个区别是,在解决合并冲突时,无法使用路径名来更改提交的顺序,因为合并应该记录为单个提交。实际上,当给出路径名时,该命令会拒绝运行(但请参阅-i选项)。

提交信息

作者和提交者的信息从以下环境变量中获取,如果已设置:

  • GIT_AUTHOR_NAME
  • GIT_AUTHOR_EMAIL
  • GIT_AUTHOR_DATE
  • GIT_COMMITTER_NAME
  • GIT_COMMITTER_EMAIL
  • GIT_COMMITTER_DATE

其中,作者和提交者的名称通常是某种形式的个人名称(即其他人称呼你的方式),尽管Git不强制或要求任何特定格式。可以使用任意Unicode字符,但受到上述约束的限制。此名称对认证没有影响;有关认证,请参见git-config[1]中的credential.username变量。

如果未设置这些环境变量的某些部分,则信息将从user.name和user.email配置项中获取,如果不存在,则从EMAIL环境变量中获取,如果也没有设置,则获取系统用户名和用于发出邮件的主机名(从/etc/mailname获取,如果该文件不存在,则返回完全限定的主机名)。

如果设置了author.name和committer.name及其相应的email选项,并且这些环境变量存在,则会覆盖user.name和user.email,并且它们自身也会被环境变量覆盖。

通常,只需设置user.name和user.email变量;其他选项提供了更复杂的用例。

日期格式

GIT_AUTHOR_DATE和GIT_COMMITTER_DATE环境变量支持以下日期格式:

  • Git内部格式:它是 ,其中是自UNIX纪元以来的秒数。 是与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。除了识别上述所有日期格式之外,–date选项还尝试理解其他更人性化的日期格式,例如"yesterday"或"last Friday at noon"。

讨论

虽然不是必需的,但最好在提交消息中以单行摘要(不超过50个字符)开始,然后是一个空行,然后是更详细的描述。提交消息中第一个空行之前的文本被视为提交标题,并在Git中使用该标题。例如,git-format-patch[1]将提交转换为电子邮件时,它会将标题用作主题行,将提交的其余部分用作正文。

在某种程度上,Git对字符编码是不加区分的。

blob对象的内容是未解释的字节序列。在核心层面没有进行编码转换。

路径名使用UTF-8规范C进行编码。这适用于树对象、索引文件、ref名称以及命令行参数、环境变量和配置文件(.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时看起来不像有效的UTF-8字符串时,git commit和git commit-tree会发出警告,除非你明确指定项目使用的是传统编码。指定方法是在.git/config文件中设置i18n.commitEncoding,例如:

[i18n]
	commitEncoding = ISO-8859-1

使用上述设置创建的提交对象将在其编码标头中记录i18n.commitEncoding的值。这有助于稍后查看它们的其他人。缺少此标头意味着提交日志消息使用UTF-8进行编码。

git log、git show、git blame等命令会查看提交对象的编码标头,并尝试将日志消息重新编码为UTF-8,除非另有指定。可以使用i18n.logOutputEncoding在.git/config文件中指定所需的输出编码,例如:

[i18n]
	logOutputEncoding = ISO-8859-1

如果没有此配置变量,则将使用i18n.commitEncoding的值。

请注意,我们故意选择不在进行提交以在提交对象级别强制UTF-8时重新编码提交日志消息,因为重新编码为UTF-8不一定是可逆操作。

环境和配置变量

用于编辑提交日志消息的编辑器将从GIT_EDITOR环境变量、core.editor配置变量、VISUAL环境变量或EDITOR环境变量(按此顺序)中选择。有关详情,请参见git-var[1]。

本节中上面此行以上的内容未包括在git-config[1]文档中。其后的内容与该文档中的内容相同:

commit.cleanup
此设置覆盖git commit中–cleanup选项的默认设置。有关详细信息,请参见git-commit[1]。当你希望始终保留以#字符开头的行作为日志消息的一部分时,更改默认设置可能很有用,在这种情况下,可以执行git config commit.cleanup whitespace(请注意,如果这样做,您将需要自己删除提交日志模板中以#开头的帮助行)。

commit.gpgSign
一个布尔值,指定是否对所有提交进行GPG签名。在执行诸如rebase之类的操作时使用此选项可能会导致大量提交被签名。使用代理可以避免多次输入GPG密码。

commit.status
一个布尔值,用于启用/禁用在使用编辑器准备提交消息时在提交消息模板中包含状态信息。默认为true。

commit.template
指定用作新提交消息模板的文件的路径名。

commit.verbose
一个布尔值或整数,用于指定git commit的详细程度。请参见git-commit[1]。

钩子
该命令可以运行commit-msg、prepare-commit-msg、pre-commit、post-commit和post-rewrite钩子。有关更多信息,请参见githooks[5]。

文件
$GIT_DIR/COMMIT_EDITMSG
该文件包含正在进行的提交的提交消息。如果git commit因错误而退出,而在创建提交之前用户提供了任何提交消息(例如,在编辑器会话中),这个文件中将可用,但将被下一次git commit调用覆盖。

另请参阅
git-add[1]、git-rm[1]、git-mv[1]、git-merge[1]、git-commit-tree[1]

GIT
git[1]套件的一部分

  • 24
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BigDataMLApplication

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值