Git中作者和提交者的区别是什么?

352
我试图提交更改,就像这样:
git commit --author="John Doe <john@doe.com>" -m "<the usual commit message>"

其中John Doe是我想要以其名义提交的某个用户。

git log中看起来没问题。但是,当我执行gitk时,作者名称正确,但提交者名称则取自我的全局git配置设置(因此设置为我的姓名/电子邮件)。

问题

  1. 提交者和作者之间有什么区别?

  2. 我是否应该将提交者也设置为另一个用户?

  3. 如果是,如何操作?


4
这是一个关于如何在GitHub上设置作者和提交者的简短描述。 - René Höhle
2
可能是Git中作者和提交者的区别是什么?的重复问题。 - Marcin Armatys
Git提交者位于.gitconfig文件中。如果您的--author与.gitconfig名称相同,则在提交消息中仅获取作者。如果它们不同,则同时获取两者。 - poGUIst
最明显的情况发生在Merqe/Pull Request(例如在GitLab/GitHub上)。编写代码的人是提交的作者,而接受PR的人是提交者。 - undefined
4个回答

319

原帖提问:

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

作者是最初编写代码的人。提交者则是代表原始作者提交代码的人。这在Git中非常重要,因为Git允许您重写历史记录或代表其他人应用补丁。免费在线的Pro Git这样解释:

您可能想知道作者提交者之间的区别是什么。 作者是最初编写补丁的人,而提交者是最后应用补丁的人。因此,如果您向项目发送补丁,并且其中一个核心成员应用了该补丁,则您和核心成员都会获得信用-您作为作者,核心成员作为提交者。

原帖提问:

我是否也应将提交者设置为其他用户?

不,如果你想要诚实,你不应该将提交者设置为作者,除非作者和提交者确实是同一个人。

3
我仍然对此感到困惑。在我的情况下,据我所知,没有进行任何补丁或历史重写(除非某些git命令在“引擎盖下”创建和应用补丁)。这真的是发生这种情况的唯一两种方式吗? - cowlinator
8
另外,称呼作者为“编写代码的人”没有意义。Git怎么知道是谁写的?当你设置git config user,然后执行git addgit commit命令时,Git会知道谁添加了和提交了代码,但它仍然不知道谁写的。 - cowlinator
11
它不知道谁编写了代码。如果不是你编写的,就必须告诉它。请记住,在Git发明之前,之前的分布式版本控制系统会向项目维护者发送电子邮件以应用补丁。这个功能存在的原因是,维护者可以通过这种“正式”的方式应用您的补丁,同时仍然将其归功于您,而不仅仅是在提交消息中进行一次性记录。 - anon

130

邮件列表 + git format-patch + git apply 可以生成作者与提交者不同的提交记录

在像Linux内核这样的项目中,补丁是:

生成一个具有不同作者和提交者的新提交记录:

  • 作者是编写补丁的人
  • 提交者是项目维护者,也是合并补丁的人

例如,请查看此随机选择的补丁和相应的提交记录:

Git Web界面(如GitHub和GitLab)可能会生成作者与提交者不同的提交记录

由于Git(Hub|Lab)在同一台机器上保存了上游和分支存储库,因此它们可以像本地一样自动执行任何操作,包括以下任一操作:

  • 创建合并提交。

    不会生成作者与提交者不同的提交记录。

    保持新提交的SHA或完整性,并创建新的提交:

  • * Merge commit (committer == author == project maintainer)
    |\
    | * Feature commit (committer == author == contributor)
    |/
    * Old master (random committer and author)
    

    在GitHub上,历史上这是第一个可用的方法。

    在本地,可以使用git merge --no-ff来执行此操作。

    这将为每个拉取请求生成两个提交,并在git历史记录中保留一个分支。

  • master上进行变基

    GitHub还会修改提交以设置提交者==按下合并按钮的人。这不是必需的,甚至不是默认情况下由git rebase本地执行的操作,但它可以为项目维护者提供责任追究。

    现在git树看起来像:

  • * Feature commit (committer == maintainer, author == contributor)
    |
    * Old master (random committer and author)    
    

    这与git apply电子邮件补丁的方式完全相同。

目前在GitHub上:

  • 您可以通过合并按钮上的下拉菜单选择合并方法
  • 仓库所有者可以在仓库设置中启用或禁用方法。

https://help.github.com/articles/about-merge-methods-on-github/

如何设置新提交的提交者?

我能找到的最好的方法是使用环境变量来覆盖提交者:

GIT_COMMITTER_NAME='a' GIT_COMMITTER_EMAIL='a' git commit --author 'a <a>'
如何获取给定提交的提交者和提交日期?
默认情况下,git log 只显示作者数据。
要查看提交者日期,您可以采取以下两种方法之一:
- 专门为此格式化日志:
git log --pretty='%cn %cd' -n1 HEAD

其中cncd表示Committer NameCommitter Date

  • 使用预定义的fuller格式:

  • git log --format=fuller
    

    另请参阅:如何配置'git log'以显示提交日期

  • 进入低级别并显示整个提交数据:

  • git cat-file -p HEAD
    

    如何设置一个新提交的提交者时间?

    git commit --date 只能设置作者日期:对于提交者日期,我找到的最好方法是使用环境变量:

    GIT_COMMITTER_DATE='2000-01-01T00:00:00+0000' git commit --date='2000-01-01T00:00:00+0000'
    

    另请参见:Git中作者和提交者之间的区别是什么?

    Git如何在内部存储作者和提交者?

    请参见:Git提交对象的文件格式是什么?

    基本上,提交是一个文本文件,它包含两个用换行符分隔的字段:

    author {author_name} <{author_email}> {author_date_seconds} {author_date_timezone}
    committer {committer_name} <{committer_email}> {committer_date_seconds} {committer_date_timezone}
    

    这说明两者在提交对象中是完全独立的数据条目。


    1
    请注意,即使使用 GIT_COMMITTER_* 覆盖,如果您没有使用 git config 设置默认提交者,git 仍将拒绝执行提交。 - adelphus
    2
    在 Git 2.5 上,如果同时设置 GIT_{COMMITTER,AUTHOR}_EMAIL,它可以正常工作。 - Ciro Santilli OurBigBook.com

    4

    建议使用

    GIT_COMMITTER_NAME='a' GIT_COMMITTER_EMAIL='a' git commit --author 'a <a>'
    

    如果您不小心使用了不同的姓名和电子邮件,并且希望将它们设置为相同的值

    GIT_COMMITTER_NAME='a' GIT_COMMITTER_EMAIL='a' git commit --author "$GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>"
    

    这首先设置变量,然后在git commit调用中使用它们(注意双括号)。


    7
    不回答问题,没有建设性,并不准确(因为提交者不是作者)。 - Guy
    授权 @guyarad。一些人在查看此问答中的信息后希望更改两者,因此这仍然是有用的。 - serv-inc
    正如我所说,你呈现的不是“提交者”姓名,而是“作者”姓名。因此,如果有什么问题,你的答案就不准确。 - Guy
    我没有意识到人们会误解。希望现在更清楚了。 - serv-inc
    @YassineElBadaoui:由于他经常更改名字,因此只使用名字+姓氏替换。 - serv-inc
    如果变量不存在或未导出,git 进程将无法访问它。因此,请确保在赋值之前加上“export”。 - Pierre-Olivier Vares

    0

    我认为值得一提的是,这里使用的定义仅限于预期的意义。例如,来自《Pro Git》书籍

    作者是最初编写作品的人,而提交者是最后应用该作品的人。

    重要的是要意识到你不能相信这些名称是正确的。也许一个更(令人恼人地)迂腐的定义可能是:

    作者是(据称)最初编写作品的人,而提交者是(据称)最后应用该作品的人。

    大多数情况下,我们实际上并不需要相信提交中的元数据是真实的,但如果你想更接近这个目标,你可以使用已签名的提交,这样更容易相信提交者是签署该提交的人。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接