git 更改中间提交而不更改后面的提交

git change intermediate commit without changing later one

这种情况偶尔发生在我身上(好吧,也许经常发生):

注意:在我推送之前发生了以下所有情况。

我的软件项目需要一个新功能。 我编码并测试直到它工作。 我不得不为新功能腾出空间,所以我使用 git add -i:

将更改分成两个提交
A --- R --- F

提交 R 引入重构更改,F 添加新功能的代码。

现在我意识到我在划分更改时犯了错误,所以 F 中的一些实际上已经属于 R,反之亦然。 所以,基本上,R 搞砸了,没有通过测试(而 F 的最终状态是完美的)。

为了解决这个问题,我检查了临时分支上的 R 并修复了所有问题。 我 git commit --amend 现在我

A --- R --- F
  \
   \-- R'

所以现在所缺少的就是将 F 移动到新分支。 到目前为止,我的解决方案是 git rebase --onto R-prime R F(我实际上使用了分支名称,但你明白我的意思)。 问题在于它不完全是我想要的:git 明白我想将 RF 之间的 变化 移动到 R',给我一个可能与 F 不同的提交 F'。 但是,我希望 F'F 完全相同,除了它的祖先。 通常,rebase 会导致难以修复的冲突(即容易出错)。

有没有办法告诉 git 我想移动 F 快照 ,而不是 diff RF?

假设您当前的 HEAD 位于 R',它应该类似于(用散列代替 FR'

git reset --hard F
git reset --soft R'
git commit -c F

它按原样获取 F 中的树,并将其作为 R' 的子项提交,替换 F 中的提交消息并调用您想要更改的编辑器