为什么 Git 的 AuthorDate 与 CommitDate 不同?

163

我查看了我的git日志,发现一些提交的AuthorDate和CommitDate略有不同。从git log --pretty=fuller输出中看到:

commit 3a5912f90dc5227f308e99f95152fbee2301c59a
Author:     <hidden>
AuthorDate: Fri Jun 15 10:57:22 2012 +0800
Commit:     <hidden>
CommitDate: Fri Jun 15 11:14:37 2012 +0800

作者和提交者是同一个人(我)。

这是怎么发生的?我已经困惑了几天。

还有更多情况-在 341 次提交中,有 17 次出现过这种情况:

+------------------------------+-------------------------------+
| from_unixtime(authored_date) | from_unixtime(committed_date) |
+------------------------------+-------------------------------+
| 2012-06-15 10:57:22          | 2012-06-15 11:14:37           |
| 2012-06-15 14:39:54          | 2012-06-15 14:48:57           |
| 2012-06-19 12:28:21          | 2012-06-19 12:29:41           |
| 2012-06-21 18:16:25          | 2012-06-21 18:28:48           |
| 2012-06-26 17:30:54          | 2012-06-26 17:33:55           |
| 2012-07-13 11:41:43          | 2012-07-13 11:42:17           |
| 2012-07-13 11:56:02          | 2012-07-13 12:13:22           |
| 2012-07-13 12:05:09          | 2012-07-13 12:12:24           |
| 2012-07-12 18:38:49          | 2012-07-13 12:26:35           |
| 2012-07-13 11:00:47          | 2012-07-13 12:25:15           |
| 2012-07-16 14:10:54          | 2012-07-16 14:15:01           |
| 2012-07-13 12:56:51          | 2012-07-16 13:49:48           |
| 2012-07-16 14:10:54          | 2012-07-16 14:19:46           |
| 2012-07-24 16:05:05          | 2012-07-24 16:05:48           |
| 2012-07-24 17:42:58          | 2012-07-24 17:43:33           |
| 2012-07-24 17:42:58          | 2012-07-24 17:45:18           |
| 2012-07-26 16:55:40          | 2012-07-26 16:55:53           |
+------------------------------+-------------------------------+

嗯,看起来是在合并分支时发生的。 - Fish Monitor
2
相关:https://dev59.com/KmMl5IYBdhLWcg3wCDGW - Ciro Santilli OurBigBook.com
2
拥有这两个不同日期的一个意外副作用是:git log默认只显示作者提交日期。但如果您使用--since--until--before--after、相对日期,git将使用提交者提交日期!如果作者提交日期与提交者提交日期不同,则git log --since="yesterday"可能不会显示预期结果。 - SherylHohman
1
关于合并是否会更改日期,这可能取决于合并是否以某种非默认方式配置以修改提交。例如,“git --squash merge”是一种常见的合并策略,可能已经被配置(尽管看起来它在这里没有被使用,但为了举例而提出)。此外,如果通过IDE或git GUI使用git,则存在CLI中不存在的配置/功能的可能性。在执行合并操作的环境中仔细检查您的合并配置可能是值得的。 - George Pantazes
请问您能否展示一下您在问题中使用的 git log --format= 命令来生成第一块代码格式化输出? - Gabriel Staples
没事了。@TTT 在这里告诉我,所以我更新了问题以便让大家知道。你使用了 git log --pretty=fuller - Gabriel Staples
3个回答

234

作者日期指的是提交代码时的日期,即完成 git commit 操作的时间。根据 git commit 的文档,可以通过使用 --date 开关来改写作者日期。

提交日期则是指每次修改提交时都会更新的日期,例如当将包含该提交的分支上的内容在另一个分支上进行变基操作时,提交日期就会发生变化(详情)。

如果你提交代码并将其补丁发送给另一个人以便在另一个仓库中应用,则作者日期将为你进行 git commit 时的日期,而当补丁在其他仓库中应用时,提交日期将设置为该日期。

如果你将补丁发送给两个同事,则会有一个作者日期,但会有两个不同的提交日期。

这也在 Git 书籍中提到:

你可能想知道作者和提交者之间的区别。作者是最初编写补丁的人,而提交者是最后应用补丁的人。因此,如果你向项目发送补丁并被核心成员之一应用补丁,则你和核心成员都会得到认可 - 你作为作者,核心成员作为提交者。


当合并分支时,我的情况会发生吗? - Fish Monitor
4
不,我认为日期是SHA的一部分,因此除非进行了某些可以改写历史的操作(如变基),否则它不应更改。 - asmeurer
5
请描述一下我们应该如何期望时间戳在进行cherry-pick、修改或者rebase commit的祖先之后会发生怎样的变化,感谢!通过使用git show -s --format="commit %cD author %aD" HEAD命令来测试,似乎用git gui修改提交信息会同时更新作者和提交日期,但是用git commit --amend只会更新提交者日期,这样很不直观。 - init_js

43

在重新基于(rebase) / 挑选某个提交(cherry-pick)等操作时,提交作者日期会保留不变,但提交日期会发生改变。


一些提交并不是简单的cherry-pick或rebase,它们看起来像是合并了另一个分支。 - Fish Monitor
13
git commit --amend 命令也是如此。 - asmeurer
4
除了squashfixup外,还需要reword - Danon

4

我遇到了一个问题,Github显示的提交时间与git log不同,我认为这是Github的一个bug。

事实证明,Github显示的是CommitDate,而git log显示的是AuthorDate(没有使用fuller标志)。

这种情况发生是因为我从不同的分支cherry-pick了两个commits。当进行cherry-pick时,commit的时间戳会发生改变,就像执行commit --append时一样。

在我的情况下,Git rebase保留了commit日期。

另外,要在git log中检查AuthorDate和CommitDate,请使用--format=fuller Docs


非常感谢您的解释!我几个月前就注意到了这个问题,但在阅读了您的解释之前一直无法弄清楚其中的差异。--format=fuller 标志太棒了,我以前从未听说过它! - slow-but-steady

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接