我可以将多个提交压缩在一起并保留最后一个提交的消息吗?

Can I squash together multiple commits and keep the message from the last one?

有时我git rebase -i master遇到这种情况:

pick cc1ed9d First commit
pick 9d4090c Main commit with detailed message
pick fca9df4 WIP afterthought commit with bad message

通过将最后一行的 pick 更改为 fixup,我将其压缩到主提交中,新的合并提交使用主提交的好消息。

但有时顺序不一样:

pick cc1ed9d First commit
pick fca9df4 WIP preliminary commit with failing test
pick 9d4090c Main commit with detailed message

在这里,我想将最后两个提交压缩在一起,但保留最后一个提交的消息。

我可以通过费力的复制和粘贴来做到这一点,但是有没有简单的方法?

你可以稍微改变一下你一直在做的事情。如果将 pick (a.k.a. p) 更改为 squash (s) 而不是 fixup (f),则Git 将以相同的方式组合提交的更改,但不会自动保留第一个提交的消息,而是会调出您的文本编辑器。其中将有一个建议的提交消息,它将所有连续压缩的提交的消息连接起来,您可以从中编辑到您想要保留的任何内容。

公平地说,这不会 100% 自动仅保留最后一次提交的消息,但它确实避免了提到的 "laborious copy and paste"!

基本上可以将 fixup 视为 squash,而无需编辑消息的额外步骤,因此通过从 fixup 更改为 squash,您可以获得完整的压缩体验(笑)

Interactive rebase旨在提供很多选项,如果你已经确切地知道你想做什么,那就去做吧:

git reset --soft @~2; git commit -C @{1}

使用干净的索引将最后两个提交压缩在一起,以保留提示提交的消息。