不知道这是否是“祝福”的方式,但是这就是我为解决同一问题所做的事情,而无需“强行推动”或类似的事情。
假设您的历史记录看起来像这样(M是混乱的合并):
-A--B--C--M (master points here)
\ /
D----E
git checkout -b merge_fix <commit ID E>
在我们犯任何错误之前,运行会创建一个分支:
-A--B--C--M (master points here)
\ /
D----E (HEAD and merge_fix point here)
现在,让我们在新分支上重新进行合并。我们不能只是合并master
,所以我们需要在错误合并之前手动选择提交:git merge <commit ID C>
不要犯上次相同的错误!
-A--B--C--M (master points here)
\ X
D----E-G (HEAD and merge_fix point here)
假设提交G
看起来不错,现在我们要与master
分支的顶部同步。此命令告诉git忽略对master所做的更改,并强制我们的更改成为合并结果:git merge -s ours master
-A--B--C--M (master points here)
\ X \
D----E-G--H (HEAD and merge_fix point here)
最后,(再次假设提交H
看起来不错,我们想快进master
包括固定的合并:
git checkout master
git merge merge_fix
这实际上只是将master
分支指针移到H
,但是我将借此机会稍微整理一下我的ASCII文字:
-A--B--C--M--H (HEAD, master, and merge_fix all point here)
\ X /
D----E--G
在那里,您拥有了!您已成功重新完成了合并,而没有使任何历史无效!