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

问题描述 投票:188回答:3

我想做一个提交

git commit --author="John Doe <[email protected]>" -m "<the usual commit message>"

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

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

问题

  1. 两者之间有什么区别(提交者与作者)?
  2. 我是否应该将提交者设置为其他用户?
  3. 如果有,怎么样?
git git-config gitk
3个回答
183
投票

原始海报问:

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

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

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

原始海报问:

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

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


79
投票

邮件列表+ 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) 从历史上看,这是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) 这与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>'

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

默认情况下,只有作者数据显示在git log上。

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

  • 格式化日志专门为此: git log --pretty='%cn %cd' -n1 HEAD 其中cncd代表Committer NameCommitter Date
  • 使用fuller预定义格式: git log --format=fuller 另见:How to configure 'git log' to show 'commit date'
  • 进入低级别并显示整个提交数据: 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'

另见:What is the difference between author and committer in Git?

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

见:What is the file format of a git commit object?

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

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

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


1
投票

@Ciro Santilli 新疆改造中心 六四事件 法轮功 proposed to use

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

© www.soinside.com 2019 - 2024. All rights reserved.