git revert别人的代码怎么办?
相信大家在工作中都使用过git来作为版本控制工具。在多人协作的模式下,难免会在不经意间(比如喝多了,困了,工作的烦了)有些奇奇怪怪的操作。比如我在前两天就发生了一起由于git revert导致的惨案,不过好在解决了。在之前的工作中,我也遇到过由于git revert导致的问题,所以本着不能在同一个地方跌倒多次的原则,我在此记录下,不然迟早会死在这个东西手里。
背景描述
首先讲一下前几天发生在我身上的故事。在团队内工作,如果大家负责同一个项目时,肯定是会分头行动的,因此除了主干分支release,预发布分支pre_release(可理解为小流量灰度分支,会在下一个发布的时间点合入release)以外,测试分支test,大家都会有各自的开发分支dev1, dev2, devn。
当时的场景是这样的:
- 我的开发分支是
dev1,在上线之前我先同步了pre-release上的代码,我本想要把我的分支提交至test上进行测试,结果由于我的失误,我把我的代码合并到了release上,在点了merge按钮之后(啪的一下,很快啊!),我发现情况不对,于是点了还原按钮(实际上就是执行了一次revert)操作。 - 是不是觉得没问题?你觉得不会有问题的时候,问题就来了。由于已经合并过
pre-release,因此我的merge操作已经把其他同事的已开发完成且合入pre-release的代码合入了release,所以在revert时,就把其他同事的代码连带一起revert掉了,导致他们第二天的功能全部没有上线
因此,当不得不进行revert操作时,发现有问题,如何进行代码的还原?
如何操作?
- 方法一,reset
release的HEAD指针,然后强制推送。- 首先通过
git log查看merge前的commitId - 然后
git reset [COMMIT ID] git push -f origin release即可
- 首先通过
这种方式保证代码一定是之前未merge的版本,在此期间,其他人对于release的提交将会丢失,需要重新提交,但是由于pre-release分支的存在,不太会有人直接提交至release分支,所以一般也不需要重新提交。由于reset操作比较暴力,在推送前最好拉取一个clean的release分支,以免reset出错而导致代码无法恢复。
- 方法二,将revert操作产生的merge request再次revert,然后删除掉自己的代码
- 找到刚才的revert的提交记录,再次revert
- 删除自己的代码(不要手动删除,这样是有问题的,要用
pre-release或分支的同名文件进行覆盖写入)。这个环节有个比较难受的问题是,后续dev的代码会被合并至pre-release,在pre-release合并到release的时候,会发现,没有dev的代码,因为删除dev的代码,产生了提交记录。后续再上线时需要先git pull下release然后把删除的代码再粘贴回去,重新测试上线
这种方式比较费时,需要多次逐个文件粘贴代码,而且pre-release上的代码被提前合并至release。
在任何场景下,只要权限够用,我都推荐使用方法一进行操作,简洁快速,且不需要代码更改。
如果非要使用方法二,我认为比较简单的做法是
dev代码测试通过后,先将dev的代码上线至pre-release- 观察没问题后,再revert之前的revert。
这样不需要进行代码的粘贴操作,前提是有100%的把握自己的代码在后面不会出现bug。
最后,我想说的是,能不用git revert就别用git revert,不然即使知道上面的两种方法如何操作,但是是准确的操作出来,还是引入了误操作之后的额外误操作,未可知。时间就是生命,不能老是浪费在修复问题上面啊!

1004

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



