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

ndp*_*ndp 4 git rebase git-amend

我有一个包含各种提交的存储库,我想将其合并为两个补丁。一个补丁介绍了该功能,另一个补丁则更改了现有代码以使用该功能。问题是,当我编码和提交时,我并没有考虑到这一点,所以有些提交同时完成了这两件事。我如何拆分这些提交?

我知道我可以使用 git rebase -i 并为我想要更改的每个提交选择编辑来完成此操作,但这样我只能更改提交消息,而不能更改代码

Dan*_*ruz 5

Gitrebase允许您拆分提交

在交互模式下,您可以使用“编辑”操作来标记提交。然而,这并不一定意味着 git rebase 期望此编辑的结果恰好是一次提交。事实上,您可以撤消提交,也可以添加其他提交。这可用于将提交分成两个:

  • 使用 git rebase -i ^ 启动交互式变基,其中是要拆分的提交。事实上,任何提交范围都可以,只要它包含该提交。

  • 使用“编辑”操作标记要拆分的提交。

  • 当涉及到编辑该提交时,执行 git reset HEAD^。效果是 HEAD 回退 1,索引也随之回退。但是,工作树保持不变。

  • 现在将更改添加到您想要在第一次提交中拥有的索引。您可以使用 git add (可能是交互方式)或 git gui (或两者)来执行此操作。

  • 使用现在合适的任何提交消息提交当前索引。

  • 重复最后两个步骤,直到您的工作树干净为止。

  • 使用 git rebase --continue 继续变基。

如果您不确定中间修订是否一致(它们编译、通过测试套件等),您应该在每次提交、测试和修改提交(如果修复)后使用 git stash 来存储尚未提交的更改是必要的。