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

4
有时我会执行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

我想把最后两个提交压缩在一起,但保留最后一个提交的信息。
我可以通过辛苦的复制和粘贴来完成,但是是否有简单的方法?

2
pick 更改为 squash 而不是 fixup,然后 Git 提供一个提交消息,将所有压缩的提交消息连接起来,并允许您编辑它以保留您想要的内容,这至少避免了“繁琐的复制和粘贴”。 - underscore_d
1
为了更加清晰地解释@underscore_d的意思,第二个例子中这个压缩会在9d4090c上进行,而不是你在第一个例子中提出的fca9df4。然后,您可以使用Ctrl + K像切热黄油一样轻松地剪切行(如果您正在使用nano作为文本编辑器的话)。(此处玩笑假定您正在使用nano作为文本编辑器)。 - topher217
1
@underscore_d 哦,该死,我以前做过但忘记了它是如何工作的。写一个答案,我会接受它。 - Nathan Long
2个回答

3
你可以稍微改变你一直在做的事情。如果你将pick(又名p)更改为squashs)而不是fixupf),那么Git将以相同的方式合并提交的更改,但它不会自动保留第一个提交的消息,而是会弹出你的文本编辑器。其中会有一个建议的提交消息,它连接了所有连续压缩的提交的消息,从中你可以编辑成你想要保留的内容。
这并不能完全自动地仅保留最后一次提交的消息,公平地说,但它确实避免了上述“繁琐的复制和粘贴”!
fixup当作没有编辑消息的squash,所以通过从fixup更改为squash,你将获得完整的压缩体验(哈哈)。

2

交互式变基旨在提供许多选项,如果您已经确切知道自己想要做什么,就去做吧:

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

使用干净的索引将最后两个提交合并在一起,保留尖端提交的信息。

太棒了!它似乎可以工作,当然。如果我们想在超过2个提交上执行此操作,或者保留不同的方法,该怎么办?这个例子是否具有普适性? - underscore_d
@underscore_d,你可以使用git rebase -x来实现。我在这个帖子中给出了一个非常实用的例子,说明如何重新格式化整个分支 - Robin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接