Git中作者和提交者的区别?

我试着做一个承诺

git commit --author="John Doe <john@doe.com>" -m "<the usual commit message>"

John Doe是某个用户,我想以他的名字进行提交。

它在git log中显示正常。然而,当我做一个gitk作者名称是正确的,但是提交者名称是从我的全局git配置设置中选择的(因此被设置为我的名字/电子邮件)。

问题

  1. 这两者(提交者和作者)之间的区别是什么?

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

  3. 如果是,怎么做?

118260 次浏览

最初的海报问道:

这两者(提交者和作者)之间的区别是什么?

作者是最初编写代码的人。另一方面,提交者被假定为代表原始作者提交代码的人。这在Git中很重要,因为Git允许您重写历史,或者代表其他人应用补丁。<强>FREE online <强>Pro Git book是这样解释的:

你可能想知道作者提交者之间有什么区别。作者是最初编写补丁的人,而提交者是最后应用补丁的人。所以,如果你向一个项目发送了一个补丁,其中一个核心成员应用了这个补丁,你和核心成员都得到了荣誉——你是作者,核心成员是提交者。

最初的海报问道:

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

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

邮件列表+ git format-patch + git apply可以生成作者!=提交者

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

生成一个包含不同作者和提交者的新提交:

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

请看这个随机选择的补丁和相应的提交:

像GitHub和GitLab这样的Git web界面可能生成作者,也可能不生成提交者

因为Git(Hub|Lab)在同一台机器上拥有上游和fork存储库,所以它们可以自动地做任何你在本地可以做的事情,包括:

  • 创建合并提交

    不生成author != committer。

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

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

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

    在本地,这是通过git merge --no-ff完成的。

    这将在每个pull请求中产生两次提交,并在git历史中保留一个fork

  • master的顶部重基

    GitHub还破解了提交设置committer ==谁按下合并按钮。这不是强制性的,甚至在默认情况下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
    

    参见:如何配置'显示'提交日期'

  • go low level并显示整个提交数据:

    git cat-file -p HEAD
    

How to set the committer date of a new commit?

git commit --date only sets the author date: for the committer date the best I could find was with the environment variable:

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}

这表明两者都是提交对象中两个完全独立的数据项。

建议使用

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调用(注意双括号)。