前几天由于一次错误的代码合并操作dev_cxn--->release--->master,导致还没有经过测试的代码被带到线上,并且在经历了几次其它分支的Merge后才发现线上代码有问题,当时想到两种解决办法:
1.reset到错误的合并之前,把后面的Merge操作再执行一遍。
2.直接使用revert,把错误的合并反向删除掉。
考虑到方法1操作动静太大,便使用了方法2,十分方便。
但是昨天发现了新的问题,即把master合并到dev_cxn时,发现dev_cxn上最后一次提交的代码丢失。经过检查,发现这次合并是fast-forward,而master上的revert操作不会改变合并历史,只是反向删除,所以版本节点是向前更新的,如下:
分支master ---o---o---o---M---x---x---W
/
分支dev_cxn ---A---B
M是那次错误的合并,W是revert操作,此时若把master合并到dev_cxn,将会直接快进到W节点,导致代码丢失。
于是想到把dev_cxn合到master,结果发现Already-up-to-date,失败。。
再想到如果不用快进合并的方式,也许能够解决问题,于是执行git merge master --no-ff
--no-ff
Create a merge commit even when the merge resolves as a fast-forward. This is the default behaviour when merging an annotated (and possibly signed) tag.
结果发现,即使不用快进的方式,revert那次操作还是会实实在在的执行进dev_cxn分支,失败。。。由于只是要让dev_cxn的代码不被删除,便查了下Git是否能够执行类似“增量合并”的merge操作,无果。。。
最终在StackOverflow上找到一个类似问题:
原来只需要对那次revert操作再执行一下revert就行了,so easy。。。
Git不愧是地球第一版本管理神器。。


Git Revert后Merge导致代码丢失问题解决方案
本文讲述了在Git中错误地进行合并操作后,通过Revert修复但引发新问题的过程。当使用Revert反向删除错误合并,再进行Merge时,代码可能丢失。原因是Revert不改变合并历史,导致快进合并。为了解决这个问题,尝试了非快进合并(git merge master --no-ff)作为可能的解决方案。
1562

被折叠的 条评论
为什么被折叠?



