我一直在开发一个功能分支,可以推送到远程。它有5个左右的提交,有些是非常快速的提交,不值得它自己的提交。在将其推送到远程进行审核之前,我希望该功能完全是一个提交。
我通常会这样做:
git rebase -i HEAD~5
然后将提交折叠到上一次提交中。这将给我一个提交,但是,提交日期是第一次提交的日期。我想提交一个提交日期作为最后一次提交。
如何将提交折叠到最后一次提交而不是第一次提交?
答案 0 :(得分:2)
您可以在任何新提交中设置任意日期。
当您将提交与rebase -i
组合在一起时,您实际上并未更改旧提交,而是进行一次新提交,之后您只需停止使用< / em>旧提交:
(before rebase -i)
A--B--C--D--E--F--G--H--I <-- master
(after rebase -i)
E--F--G--H--I [abandoned]
/
A--B--C--D--J <-- master
其中J
是新的“所有组合”提交。
坏消息是git rebase -i
旨在将提交日期戳保留在其他提交为squash
或fixup
编辑的提交中。因此,它已使用“设置任意日期”功能强制J
拥有E
的日期。交互式rebase命令没有标志可以更改它。 1
但是有一个简单的解决方法:将新提交J
作为E-F-G-H-I
的新增和改进变体,您可以简单地使用相同的一般想法放弃J
更新,更有改进的K
,就像J
一样,只是它有你想要的日期。
要执行此操作,请在重新定位后运行git commit --amend --date=...
(为...
部分提供您喜欢的任何日期)。你也可以改变作者;见the git commit
documentation。这将使新提交K
替换J
,就像J
替换E-F-G-H-I
一样,留下您:
E--F--G--H--I [abandoned]
/
A--B--C--D--K <-- master
\
J [abandoned]
你已经放弃的提交,如果没有别的东西可以让你找到它们,最终(在30天左右的某个地方)失去了找到它们的最后方法 - 它们的ID保留在 reflogs 中一些过期时间,如果你想要它们回来 - 一旦它们真正未被引用,垃圾收集传递(由git gc --auto
运行,而这又由各种其他Git命令为你运行)将真正删除它们。
1 非交互式,基于git am
的{{1}}有一个标志,但没有壁球功能。
答案 1 :(得分:0)
git rebase -i SHA
重新设置基准后,有3个选项可供选择。选项1仅适用于最近的提交。选项2和3不适用于交互式rebase,因此需要单独的rebase调用,否则将仅合并到上述rebase调用中。
在您的方案中,您可以找到重新提交之前的最新提交日期,并通过选项1提供重新提交之后的最新提交日期。如果您不知道要使用的日期格式,请尝试 echo $(date)