偶尔会发生这种情况(好吧,也许经常发生):
注意:在推送之前发生以下所有情况。
我的软件项目需要一个新功能。
我编码并测试直到它工作。
我不得不为新功能腾出空间,因此我使用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
?
答案 0 :(得分:1)
假设您当前的HEAD位于R'
,则应该是(替换哈希而不是F
和R'
)
git reset --hard F
git reset --soft R'
git commit -c F
它按原样从F
获取树,并将其作为R'
的子项提交,替换来自F
的提交消息并调用编辑器,您想要更改它