Git rebase 保留最新提交日期

use*_*855 10 git

我一直在开发一个已准备好推送到远程的功能分支。它有 5 个左右的提交,其中一些是非常快的提交,不值得它自己的提交。我希望该功能在我将其推送到远程进行审查之前总共是一次提交。

我通常会这样做:

git rebase -i HEAD~5

然后将这些提交折叠到之前的提交中。这将给我一个我想要的提交,但是,提交日期是第一次提交的日期。我想要一次提交,并将提交日期作为最后一次提交。

如何将提交折叠到最后一次提交而不是第一次提交?

tor*_*rek 6

您可以在任何新提交上设置您喜欢的任意日期。

\n\n

当您将提交与 组合在一起时rebase -i,您实际上并没有更改旧的提交,而是进行了一个新的提交,之后您只需停止使用旧的提交即可:

\n\n
(before rebase -i)\n\nA--B--C--D--E--F--G--H--I   <-- master\n\n(after rebase -i)\n\n           E--F--G--H--I   [abandoned]\n          /\nA--B--C--D--J   <-- master\n
Run Code Online (Sandbox Code Playgroud)\n\n

在哪里J新的“所有事物组合”提交在

\n\n

坏消息是,它的设计目的是在其他提交被ed 或-edgit rebase -i的提交上保留作者日期戳。因此它已经使用“设置任意日期”功能来强制具有日期。交互式 rebase 命令没有标志来更改此设置。squashfixupJE1

\n\n

但有一个简单的解决方法:将新的提交作为 的J新的和改进的变体E-F-G-H-I,您可以简单地使用相同的一般想法来放弃J,转而采用更新、改进的K,就像J除了它有您想要的日期。

\n\n

为此,在变基后,运行git commit --amend --date=...(提供您喜欢的部件的任何日期...)。您也可以更改作者;请参阅文档git commit这将使新的提交K替换J,就像J替换一样E-F-G-H-I一样,留下:

\n\n
           E--F--G--H--I   [abandoned]\n          /\nA--B--C--D--K   <-- master\n          \\\n           J   [abandoned]\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果没有其他办法让您找到它们,您放弃的提交最终(大约 30 天后)会失去最后找到它们的方法\xe2\x80\x94它们的 ID 会在 reflog 中保留一段过期时间,以防万一您希望它们回来\xe2\x80\x94,一旦它们真正未被引用,垃圾收集就会通过(由git gc --auto各种其他 Git 命令依次运行)将真正删除它们。

\n\n
\n\n

1非交互式、git am基于git rebase有一个标志,但没有挤压功能。

\n