使用git rebase -i更改之前提交的代码

4

我有一个仓库,里面有多个提交,我想将它们分成两个补丁来合并。一个补丁引入新功能,另一个补丁修改现有代码以使用该功能。问题在于,在编码和提交时我没有考虑到这一点,所以有些提交既包括了引入新功能的内容,也包括了修改现有代码的内容。如何拆分这些提交?

我知道可以通过 git rebase -i 命令来做到这一点,对每个要更改的提交选择编辑,但这种方法只能更改提交消息,不能更改代码。

2个回答

5
Git的rebase命令可以帮助你拆分提交记录
在交互模式下,你可以使用“edit”操作标记提交记录。但这并不意味着git rebase期望这个编辑结果只有一个提交记录。实际上,你可以撤销这个提交记录,或者添加其他提交记录。这可以用来将一个提交记录拆分成两个:
1. 使用git rebase -i ^启动交互式rebase,其中^是你想要拆分的提交记录。实际上,任何提交记录范围都可以,只要包含该提交记录即可。
2. 使用“edit”操作标记你想要拆分的提交记录。
3. 当它来到编辑该提交记录时,执行git reset HEAD^。其效果是HEAD向后倒退一步,索引也跟随变化。然而,工作树保持不变。
4. 现在将你想要包含在第一个提交记录中的更改添加到索引中。你可以使用git add(可能是交互式的)或git gui(或两者都使用)来完成这个操作。
5. 使用适当的提交消息提交当前索引。
6. 重复最后两个步骤,直到你的工作树变得干净。
7. 使用git rebase --continue继续rebase。
如果你不确定中间修订版是否一致(它们是否编译通过,是否通过测试等),你应该在每个提交、测试和修改提交(如果需要)后使用git stash来保存未提交的更改。

1

这是我会做的:

git reset COMMIT_BEFORE_CHANGES --soft

并在适当的提交中重新提交所有内容。--soft会将您的工作树和索引保留在重置之前的状态。

不用说,如果有人从您那里拉取后,您不应该做这样的事情。


看起来 Git 的文档并不同意 =)。 - Roman
@R0MANARMY 文档提出了与我在这里所做的类似的解决方案,但使用变基使其更加通用。当您想要拆分的提交与其他提交交错时,我的解决方案无法正常工作。 - pmr
我只是想说,将单个提交拆分成多个提交据我所知不可能 - Roman
如果您认为正确地撤销和重做是“拆分”,那么文档是正确的。;) - pmr

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