通常我会执行以下操作:
git rebase -i HEAD~5
然后将这些提交合并到前一个提交中。这样会给我一个我想要的提交,但是,提交日期是第一个提交的日期。我想要的是一个提交,其提交日期为最后一个提交的日期。
如何将这些提交合并到最后一个提交中,而不是第一个提交中?
rebase -i
将提交合并在一起时,你实际上并没有“更改”旧的提交,而是创建了一个新的提交,在此之后你只需停止使用旧的提交:(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=...
(提供您喜欢的任何日期作为...
部分)。您也可以更改作者;请参见git commit文档。这将创建新的提交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
的git rebase
有一个标志,但没有合并功能。
git rebase -i SHA
执行rebase后有3个可用选项,选择其中任意一个。选项1仅适用于最近的提交。选项2和3无法与交互式rebase一起使用,因此需要单独调用rebase命令,否则会与上面的rebase调用合并。
在您的情况下,您可以在rebase之前找到最新的提交日期,并通过选项1在rebase之后提供该日期。如果您不知道要使用的日期格式,请尝试echo $(date)
这里有一种(相当酷的)另一种实现方式:
选择您要复制的最高提交以制作空白副本:
git cherry-pick --keep-redundant-commits HEAD
git rebase -i HEAD~6
现在将最后一次提交移动到列表顶部(为了方便,Git将注明提交为空)。选择顶部提交,并将其下面的所有提交更改为“f”以进行“修复”。保存并退出即可完成。
实际上,您正在执行相同的压缩操作,但是使用最后一个提交的作者、日期和消息而不是第一个。
git rebase -i HEAD~5
之后, E--F--G--H--I [abandoned]
/
A--B--C--D--J <-- master
提交J
是当前的head,它具有最新的提交时间(比任何其他提交都更新)和与提交E
的作者时间相同。
现在,你需要做的是创建另一个提交K
,并选择一个自己喜欢的作者时间,这将成为新的HEAD(详见@torek的答案)。你可以通过运行git commit --amend --date=XXX
来实现,但是你选择的作者时间"XXX
"是什么?
我可以想到三个最常见的选项:
If you don't mind a slight difference in time and are fine with just the current time,
git commit --amend --no-edit --date=now
If your choice is the last amended time (commit-time), do either of (they are just aliases)
git rebase --ignore-date HEAD
git rebase --committer-date-is-author-date HEAD
If your choice is the commit-time (and author-time) of your last git commit, i.e., commit I
with commit-ID of SHA_I
git commit --amend --no-edit --date=`git log -n 1 --format=%ct SHA_I`
git commit
命令时,应该已经打印出了(7 个字符的)字符串 SHA_I
,它代表着所创建的提交 I
。
或者,您可以使用命令 git reflog
显示提交列表。git log -n 1 --format=%ci [SHA_I]
(或者使用 %cd
),如需查看作者日期,请将 %ci
替换为 %ai
等。