我正在尝试像
git commit --author="John Doe <john@doe.com>" -m "<the usual commit message>"
John Doe是我要提交其名称的用户。
似乎没问题git log
。但是,当我执行时gitk
,作者名称是正确的,但是提交者的名称是从我的全局git config设置中选择的(因此设置为我的名称/电子邮件)。
问题
两者(提交人与作者)有什么区别?
我应该同时为其他用户设置提交者吗?
如果是,怎么办?
我正在尝试像
git commit --author="John Doe <john@doe.com>" -m "<the usual commit message>"
John Doe是我要提交其名称的用户。
似乎没问题git log
。但是,当我执行时gitk
,作者名称是正确的,但是提交者的名称是从我的全局git config设置中选择的(因此设置为我的名称/电子邮件)。
两者(提交人与作者)有什么区别?
我应该同时为其他用户设置提交者吗?
如果是,怎么办?
Answers:
原始海报问:
两者(提交人与作者)有什么区别?
作者是最初编写代码的人。另一方面,假定提交者是代表原始作者提交代码的人。这在Git中很重要,因为Git允许您重写历史记录或代表他人应用补丁。该免费的在线临Git的书解释它是这样的:
您可能想知道作者之间有什么区别和committer有。的作者是谁最初写补丁的人,而提交者是谁最后应用补丁的人。因此,如果您向项目发送补丁程序,并且其中一个核心成员应用了该补丁程序,那么你们俩都将获得荣誉-您作为作者,而核心成员作为提交者。
原始海报问:
我应该同时为其他用户设置提交者吗?
不,如果您想说实话,则不应将提交者设置为作者,除非作者和提交者确实是同一个人。
git config user
,然后git add
和git commit
,然后将混帐知道谁加入谁犯,但它仍然不知道是谁写的。
邮件列表+ git format-patch
+ git apply
可以生成作者!=提交者
在像Linux内核这样的项目中,补丁是:
git format-patch
git send-email
git apply
或应用于git am
:如何使用git am从电子邮件应用补丁?用不同的作者和提交者生成一个新的提交:
例如,请参阅此随机选择的补丁和相应的提交:
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
其中,cn
与cd
代表Committer Name
和Committer Date
使用fuller
预定义的格式:
git log --format=fuller
进入低级别并显示整个提交数据:
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如何在内部存储作者与提交者?
基本上,提交是一个文本文件,它包含两个行分隔的字段:
author {author_name} <{author_email}> {author_date_seconds} {author_date_timezone}
committer {committer_name} <{committer_email}> {committer_date_seconds} {committer_date_timezone}
这清楚地表明两者都是提交对象中的两个完全独立的数据条目。
GIT_COMMITTER_*
覆盖,如果您尚未使用设置默认提交者,git仍将拒绝执行提交git config
。
GIT_{COMMITTER,AUTHOR}_EMAIL