提交者和作者有什么区别?

本文介绍Git的提交人和作者的意义。

提交信息设置

Git 是一个分布式版本控制系统,绝大部分操作都是脱离服务器的本地操作,提交(commit)的署名(作者信息)也是由用户本地设置的。Git 安装完毕后,用户要通过下面两个命令设置自己的姓名和邮箱地址。示例如下:

git config --global user.name "Your Name"
git config --global user.email your.name@example.com

之后,用户创建的提交即使用上述命令设置的姓名和邮箱进行署名。

Git提交包含两个署名

如果查看提交时使用详尽格式(--pretty=fuller),会看到一个提交包含两个署名,一个是作者(Author),一个是提交者(Committer)。例如下面查看 Git 项目 v2.45.0标签对应的提交,在提交元信息中看到作者(Author)、提交创建时间(AuthorDate)、提交者(Commit)、提交最后修改时间(CommitDate)。

$ git log -1 --pretty=fuller v2.45.0
commit 786a3e4b8d754d2b14b1208b98eeb0a554ef19a8 (tag: v2.45.0, github/maint)
Author:     Junio C Hamano <gitgits***@pobox.comuthorDate: 2024-04-29 07:30:29 -0700
Commit:     Junio C Hamano <gitgits***@pobox.commmitDate: 2024-04-29 07:30:29 -0700

    Git 2.45
    
    Signed-off-by: Junio C Hamano <gits***@pobox.com>

这么做的原因,一个是 Git 项目创始人 Linus Torvalds 在 Git 和 Linux 项目采用的邮件列表方式工作流:

  • 开发者将提交转换为补丁文件,并将补丁文件以邮件格式发送到邮件列表。

  • 开发者通过邮件列表进行代码评审。

  • 经过多次迭代、评审通过后,项目的维护者(Maintainer)将邮件补丁转换为 Git 仓库中的提交。

  • 转换后的提交的原作者(Author)保持不变,而提交者(Committer)是将补丁转换为提交的项目维护者。

例如下面这个提交的作者和提交者不同,就是因为 Git 项目中所采用的邮件列表工作流而形成的。

$ git log -1 --pretty=fuller "tags/v2.44.0-rc0~35^2~5"
commit 4a61faf75d684eb31c23521bc0e3c3cac5fd1553
Author:     Jiang Xin <zhzhiyou***@alibaba.comuthorDate: 2024-01-21 21:15:33 +0800
Commit:     Junio C Hamano <gitsgits***@pobox.commitDate: 2024-01-22 07:54:37 -0800

    transport-helper: no connection restriction in connect_helper
    
    ... ... 此处省略 ... ...
    
    Helped-by: Junio C Hamano <gitster@pgits***@pobox.comed-by: Linus Arver <linusa@googllin***@google.comoff-by: Jiang Xin <zhiyou.jxzhiyou***@alibaba-inc.comed-off-by: Junio C Hamano <gits***@pobox.com>

一个提交从创建到完善的过程中往往有两个以上的开发者参与,无法通过提交元信息中的作者和提交者覆盖到。这种情况可以像上面的提交那样在提交说明的末尾(trailer)手动添加签名信息。例如:Helped-by是提交过程中给过帮助、提出好建议的开发者。Signed-off-by是作者和提交者的签名。此外还有Reported-by表示问题的提出者等等。

两个提交署名为提交提供了两个时间戳,一个是提交创建的时间,一个是提交最后修改的时间。因此,即使提交的作者和开发者是同一个人,提供两个署名也很有意义。例如 Git 本地化中的这个提交:

$ git log --pretty=fuller -1 "v2.44.0-rc2~2^2~10"
commit 1bb7fcbffc213db044476998f3a14b2597f3c540
Author:     Jiang Xin <woworldhello.***@gmail.comuthorDate: 2024-02-16 11:20:39 +0800
Commit:     Jiang Xin <worworldhello.***@gmail.commmitDate: 2024-02-16 11:51:19 +0800

    l10n: ci: disable cache for setup-go to suppress warnings
    
    After we upgraded actions/setup-go to v5, the following warning message
    was reported every time we ran the CI.
    
        Restore cache failed: Dependencies file is not found ...
    
    Disable cache to suppress warning messages as described in the solution
    below.
    
        https://github.com/actions/setup-go/issues/427
    
    Signed-off-by: Jiang Xin <worldhello.***@gmail.com>

这个例子中提交中的两个时间相差半个小时,是因为在完成提交之后,发现提交说明可以继续完善,于是执行了下面的命令完善了提交说明:

$ git commit -s --amend

对提交的作者和提交者的验证

一些公司为了确保公司内的开发者正确配置了邮箱地址,要求对提交者的邮箱进行限制。云效代码平台提供了这个功能。当仓库的推送规则设置中开启了提交邮箱检查,如果提交中的提交者邮箱和推送规则中的设置不符会报错无法推送,开发者需要修改提交中的元信息,对提交者邮箱或者作者邮箱进行修改。参见推送规则设置

首先开发者要检查是否正确设置了自己的用户名和邮箱。使用命令 git config user.name和命令git config user.email查看相关设置。如果设置和预期不符,参考前面的介绍的命令修改相关设置。

如果要修改最新提交的提交者邮箱,使用如下命令:

git commit --amend

如果作者(Author)的邮箱也需要修改,需要增加--reset-author参数,即使用如下命令:

git commit --reset-author --amend

如果要修改历史提交中的提交说明,使用交互式编辑命令:git rebase -i,停留在要修改的提交,然后用上述命令修改提交者和作者的署名。关于git rebase的操作查看相关文档。