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

mu *_*u 無 218 git gitk git-config

我想做一个提交

git commit --author="John Doe <john@doe.com>" -m "<the usual commit message>"
Run Code Online (Sandbox Code Playgroud)

其中John Doe是我想要提交其名称的某个用户.

看起来好像在git log.但是,当我这样做时gitk,作者姓名是正确的,但是从我的全局git配置设置中选择了提交者名称(因此设置为我的姓名/电子邮件).

问题

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

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

  3. 如果有,怎么样?

小智 200

原始海报问:

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

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

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

原始海报问:

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

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

  • @cowlinator 它不知道是谁写的代码。这就是为什么你必须告诉它,如果不是你。请记住,在 git 发明之前,以前的分布式版本控制系统是向 ~~Linus~~ 项目维护者发送带有要应用的补丁的电子邮件。有了这个功能,~~Linus~~ 维护者可以应用你的补丁,同时仍然以“官方”的方式将它归功于你,而不仅仅是提交消息中的临时。 (4认同)
  • 我对此仍然很困惑。我就遇到过这种情况,就我而言,据我所知,没有发生任何补丁或历史重写(除非某些 git 命令不透明地“在幕后”创建并应用补丁)。这真的是发生这种事情的唯一两种方法吗? (3认同)
  • 此外,称作者为“编写代码的人”是没有意义的。git 怎么知道是谁写的?当你设置`git config user`然后`git add`和`git commit`时,git会知道谁添加了谁提交了,但它仍然不知道是谁写的。 (3认同)

Cir*_*四事件 88

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

在像Linux内核这样的项目中,修补程序是:

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

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

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

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

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

  • 创建合并提交.

    不生成author!= committer.

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

    * Merge commit (committer == author == project maintainer)
    |\
    | * Feature commit (committer == author == contributor)
    |/
    * Old master (random committer and author)
    
    Run Code Online (Sandbox Code Playgroud)

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

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

    这会为每个pull请求生成两个提交,并在git历史记录中保留一个fork.

  • 在最重要的基础上 master

    GitHub还会破解设置提交者的提交==无论谁按下合并按钮.这不是强制性的,甚至在本地默认也没有git rebase,但它给项目维护者带来了责任.

    git树现在看起来像:

    * Feature commit (committer == maintainer, author == contributor)
    |
    * Old master (random committer and author)    
    
    Run Code Online (Sandbox Code Playgroud)

    这与git apply电子邮件补丁完全相同.

目前在GitHub上:

  • 您可以通过合并按钮上的下拉列表选择合并方法
  • 所有者可以在repo设置上启用或禁用方法

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

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

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

GIT_COMMITTER_NAME='a' GIT_COMMITTER_EMAIL='a' git commit --author 'a <a>'
Run Code Online (Sandbox Code Playgroud)

如何获取给定提交的提交者和提交日期?

默认情况下仅显示作者数据git log.

要查看提交者日期,您可以:

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

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

GIT_COMMITTER_DATE='2000-01-01T00:00:00+0000' git commit --date='2000-01-01T00:00:00+0000'
Run Code Online (Sandbox Code Playgroud)

另请参阅:Git中作者和提交者之间有什么区别?

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

请参阅:git commit对象的文件格式是什么?

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

author {author_name} <{author_email}> {author_date_seconds} {author_date_timezone}
committer {committer_name} <{committer_email}> {committer_date_seconds} {committer_date_timezone}
Run Code Online (Sandbox Code Playgroud)

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

  • 请注意,即使使用 `GIT_COMMITTER_*` 覆盖,如果您没有使用 `git config` 设置默认提交者,git 仍然会拒绝执行提交。 (2认同)
  • @adelphus 在 Git 2.5 上,如果您设置了 `GIT_{COMMITTER,AUTHOR}_EMAIL` ,它确实可以工作 (2认同)

ser*_*inc 6

建议使用

GIT_COMMITTER_NAME='a' GIT_COMMITTER_EMAIL='a' git commit --author 'a <a>'
Run Code Online (Sandbox Code Playgroud)

如果您不小心使用了不同的姓名和电子邮件,并且想要将其设置为相同的值

GIT_COMMITTER_NAME='a' GIT_COMMITTER_EMAIL='a' git commit --author "$GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>"
Run Code Online (Sandbox Code Playgroud)

它首先设置变量,然后将它们用于调用git commit(注意双括号)。

  • 没有回答问题,没有建设性,也不准确(因为提交者不是作者) (7认同)

归档时间:

查看次数:

66399 次

最近记录:

6 年,6 月 前