299

我正在尝试做出类似的承诺

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

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

它在 中显示得很好git log。但是,当我执行 a 时gitk作者姓名是正确的,但提交者姓名是从我的全局 git 配置设置中选择的(因此设置为我的姓名/电子邮件)。

问题

  1. 两者(提交者与作者)有什么区别?

  2. 我应该将提交者也设置给其他用户吗?

  3. 如果是,如何?

4

3 回答 3

271

原海报问:

两者(提交者与作者)有什么区别?

作者是最初编写代码的人。另一方面,提交者被假定为代表原作者提交代码的人。这在 Git 中很重要,因为 Git 允许您重写历史记录,或代表他人应用补丁。免费在线Pro Git是这样解释的:

您可能想知道authorcommitter之间有什么区别。作者是最初编写补丁的人,而提交是最后应用补丁的人。因此,如果您向项目发送补丁并且其中一个核心成员应用了该补丁,那么你们俩都将获得荣誉——您是作者,核心成员是提交者。

原海报问:

我应该将提交者也设置给其他用户吗?

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

于 2013-09-12T03:34:55.627 回答
115

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

在像 Linux 内核这样的项目中,补丁所在的位置:

使用不同的作者和提交者生成一个新提交:

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

例如,请参阅这个随机选择的补丁和相应的提交:

像 GitHub 和 GitLab 这样的 Git Web 界面可能会也可能不会生成 author != committer

由于 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 commit 对象的文件格式是什么?

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

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

这清楚地表明两者都是提交对象中的两个完全独立的数据条目。

于 2014-04-16T11:29:49.230 回答
3

@Ciro Santilli 新疆再教育营六四事件法功轮郝海东建议使用

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

于 2019-04-05T12:41:47.513 回答