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