我编辑了一条旧的提交消息,但 git 日志显示已编辑的提交的日期早于最近创建的提交

I edited an old commit message but git log shows the edited commit with older date higher than commits created more recently

我通过 运行ning git rebase -i <commit-yesterday> 编辑了一条提交消息,并选择 reword 选项进行变基。之后,我 运行 push --force 将更改发布到远程存储库。我的期望是,当我 运行 git log 时,我会看到如下列表:

commit 11111111
Date: Today 16:00:00
Message: The commit created Today at 16:00:00

commit 22222222
Date: Today 14:00:00
Message: The commit created Today at 14:00:00

commit 33333333
Date: Today 10:00:00
Message: The commit created Today at 10:00:00

commit 44444444
Date: Yesterday 15:00:00
Message: The message of this commit updated Today at 17:00:00 while it was created yesterday at 15:00:00

但我看到以下列表,更新后的提交位于顶部,旧提交日期新提交 ID 和显示旧提交及其旧消息和旧提交 ID:

commit 55555555
Date: Yesterday 15:00:00
Message: The message of this commit updated Today at 17:00:00 while it was created yesterday at 15:00:00

commit 11111111
Date: Today 16:00:00
Message: The commit created Today at 16:00:00

commit 22222222
Date: Today 14:00:00
Message: The commit created Today at 14:00:00

commit 33333333
Date: Today 10:00:00
Message: The commit created Today at 10:00:00

commit 44444444
Date: Yesterday 15:00:00
Message: The commit created Yesterday at 15:00:00

git rebase -i 44444444 将显示来自 44444444 的提交,但不包括 44444444。您编辑的提交中的所有提交现在都将具有新的哈希值。在您的情况下,您会看到最新的提交哈希也已更新。

编辑: 我已经重新运行了您的场景并看到了您期望的输出。

git-test - master ❯ git log --oneline -n 6
78eb09a (HEAD -> master) 222222
6ec4cc9 33333
58d9aea 444444 first message
fc9cae1 oldest


git-test - master ❯ git rebase -i fc9cae1
[detached HEAD 19328bf] 444444 modified message
 Date: Tue Oct 8 14:54:27 2019 +0530
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 b
Successfully rebased and updated refs/heads/master.


git-test - master ❯ git log --oneline -n 6
82b30ed (HEAD -> master) 222222
34c1948 33333
19328bf 444444 modified message
fc9cae1 oldest

每个提交都有 两个 日期和时间戳,而不仅仅是一个。一个时间戳是给 author 的,另一个是给 committer 的。在您刚刚从头开始的新提交中,Git 将作者和提交者设置为相同,并且两个时间戳相同。然而,复制 一个提交会产生一个新的 提交者(你和现在),同时保留原始提交的作者和作者时间戳,至少默认情况下。

当您使用 git rebasegit commit --amend 进行 "modify" 提交时,您实际上并没有 更改 原始提交。你不能——什么都不能;甚至 Git 本身也不能更改原始提交——因此,您会得到一个 new 提交,具有新的哈希 ID,对于新提交是唯一的。旧的哈希 ID 仍然有效并且仍然引用旧的提交。如果旧提交变成 unreachable,1 它最终会过期并且旧提交将真正消失,但是 Git 努力尝试至少保留一个月左右,以防您改变主意并想要回来。

你在这里没有显示的是你是怎样的 运行 git logGit 未在此处显示的是底层的 提交图 ,因为您没有要求它。 Git 是关于提交的,提交本身形成一个有向无环图或 DAG。许多 Git 命令和查看器确实 应该 向您显示图表,因为该图表非常重要。 git log 命令 可以 显示图表,但你必须要求它:

git log --graph

或者我最喜欢的:

git log --all --decorate --oneline --graph

参见 Pretty git branch graphs and in particular this answer

要让 Git 向您显示 日期和时间戳,请添加 --pretty=fuller 并省略 --oneline,例如:

git log --all --decorate --graph --pretty=fuller

在这种情况下,您的原始提交 您改写后的提交仍然可以访问——尽管具体如何,我不能在不查看图表的情况下说出来——所以你会看到改写后的提交提交,及其新的哈希 ID,并显示其新消息...然后您还会看到原始提交,其原始哈希 ID,并显示其原始消息。

图形查看器,或带有 --decorate--graph 的 运行 git log,将有助于解释 为什么 您仍然可以查看旧提交。如果没有图表及其 "decorations"——允许 Git 到 find 的分支和标签名称首先在随机哈希 ID 的混乱中提交—我们所能做的就是猜测为什么你的旧提交也出现了。


1这是一个术语,定义比较长。请参阅网站 Think Like (a) Git 以开始使用。

我发现了git log的魔力。由于我重新设置了提交的基数,因此它的 Commit Date 已更改,但 Author Date 从未更改。但是,命令 git log 根据 提交日期 对提交进行排序(按降序排列),但它显示 作者日期 的提交。这引起了混乱。要同时显示提交日期和作者日期,请使用 --pretty=fuller 选项。换句话说,运行 下面的命令让一切都清楚了:

git log --pretty=fuller

通常,提交日期和作者日期相同,但 git rebasegit commit --amend 和 cherry-picks 是提交日期与提交日期不同的常见情况。