这种情况偶尔发生在我身上(嗯,也许经常(:
注意:在我推送之前,以下所有情况都会发生。
我的软件项目需要新功能。 我编码并测试直到它起作用。 我不得不为新功能腾出空间,所以我使用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
明白我想将R
和F
之间的更改移动到R'
上,给我一个可能与F
不同的提交F'
。 但是,我希望F'
与F
完全相同,除了它的祖先。 通常,rebase
会导致难以修复(即容易出错(的冲突。
有没有办法告诉git
我想移动F
的快照,而不是差异R
→F
?
假设你当前的 HEAD 在R'
,它应该是这样的(替换哈希而不是F
和R'
(
git reset --hard F
git reset --soft R'
git commit -c F
它按原样从F
中获取树,并将其作为R'
的子级提交,替换来自F
的提交消息并调用编辑器,您想更改它