Git rebase保持最新的提交日期

时间:2018-01-07 14:00:31

标签: git

我一直在开发一个功能分支,可以推送到远程。它有5个左右的提交,有些是非常快速的提交,不值得它自己的提交。在将其推送到远程进行审核之前,我希望该功能完全是一个提交。

我通常会这样做:

  

git rebase -i HEAD~5

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

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

2 个答案:

答案 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旨在将提交日期戳保留在其他提交为squashfixup编辑的提交中。因此,它已使用“设置任意日期”功能强制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. git commit --amend --no-edit --date = now
  2. git rebase --ignore-date SHA
  3. git rebase --committer-date-is-author-date SHA

在您的方案中,您可以找到重新提交之前的最新提交日期,并通过选项1提供重新提交之后的最新提交日期。如果您不知道要使用的日期格式,请尝试 echo $(date)

(由此,答案为answer1answer2