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


235

我正在尝试像

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

John Doe是我要提交其名称的用户。

似乎没问题git log。但是,当我执行时gitk作者名称是正确的,但是提交者的名称是从我的全局git config设置中选择的(因此设置为我的名称/电子邮件)。

问题

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

  2. 我应该同时为其他用户设置提交者吗?

  3. 如果是,怎么办?




Git提交者放置在.gitconfig文件中。如果--author与.gitconfig名称相同,则在提交消息中仅获得作者。如果它们不同,则两者都会得到。
poGUIst,

Answers:


214

原始海报问:

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

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

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

原始海报问:

我应该同时为其他用户设置提交者吗?

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


1
我对此仍然感到困惑。我曾经发生过这种情况,就我所知,就我所知,从未发生过任何补丁或历史记录重写的情况(除非某些git命令不透明地在“幕后”创建和应用补丁)。这些真的是仅有的两种发生这种情况的方式吗?
Cowlinator '19

2
同样,称作者为“编写代码的人”也没有道理。git怎么知道是谁写的?当您设置git config user,然后git addgit commit,然后将混帐知道谁加入谁犯,但它仍然不知道是谁写的。
cowlinator '19

1
@cowlinator不知道是谁编写了代码。这就是为什么必须告诉它的原因,如果不是您。请记住,在发明git之前,以前的分布式版本控制系统正在向~~ Linus ~~发送带有补丁的项目维护者电子邮件。有了此功能,~~ Linus ~~维护人员可以在应用补丁的同时仍以“官方”方式将其归功于您,而不仅仅是在提交消息中临时添加。
基金莫妮卡的诉讼

92

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

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

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

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

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

GitHub和GitLab等Git Web界面可能会或可能不会生成作者!=提交者

由于Git(Hub | Lab)将上游存储库和fork存储库都保存在同一台计算机上,因此它们可以自动执行您可以在本地执行的任何操作,包括以下任一操作:

  • 创建一个合并提交。

    不生成作者!=提交者。

    保持SHA或新提交不变,并创建一个新提交:

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

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

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

    每个拉取请求产生两次提交,并在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
    

    另请参阅:如何配置“ 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}

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


1
请注意,即使没有GIT_COMMITTER_*覆盖,如果您尚未使用设置默认提交者,git仍将拒绝执行提交git config
adelphus

1
在Git 2.5上使用@adelphus,如果同时设置两者都可以使用GIT_{COMMITTER,AUTHOR}_EMAIL
Ciro Santilli郝海东冠状病六四事件法轮功2015年

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.