我编辑了一条旧的提交消息,但 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 rebase
或 git commit --amend
进行 "modify" 提交时,您实际上并没有 更改 原始提交。你不能——什么都不能;甚至 Git 本身也不能更改原始提交——因此,您会得到一个 new 提交,具有新的哈希 ID,对于新提交是唯一的。旧的哈希 ID 仍然有效并且仍然引用旧的提交。如果旧提交变成 unreachable,1 它最终会过期并且旧提交将真正消失,但是 Git 努力尝试至少保留一个月左右,以防您改变主意并想要回来。
你在这里没有显示的是你是怎样的 运行 git log
。 Git 未在此处显示的是底层的 提交图 ,因为您没有要求它。 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 rebase
、git commit --amend
和 cherry-picks 是提交日期与提交日期不同的常见情况。
我通过 运行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 rebase
或 git commit --amend
进行 "modify" 提交时,您实际上并没有 更改 原始提交。你不能——什么都不能;甚至 Git 本身也不能更改原始提交——因此,您会得到一个 new 提交,具有新的哈希 ID,对于新提交是唯一的。旧的哈希 ID 仍然有效并且仍然引用旧的提交。如果旧提交变成 unreachable,1 它最终会过期并且旧提交将真正消失,但是 Git 努力尝试至少保留一个月左右,以防您改变主意并想要回来。
你在这里没有显示的是你是怎样的 运行 git log
。 Git 未在此处显示的是底层的 提交图 ,因为您没有要求它。 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 rebase
、git commit --amend
和 cherry-picks 是提交日期与提交日期不同的常见情况。