赞
踩
有三个分支:dev,feature,和master,feature分支本应该提交一次merge 到dev,结果
merge到了master,在gitlab上进行 merge的revert操作,页面显示revert 了这次merge,并且代码
回滚到了merge之前的版本,feature分支新增了一些commit,测试通过后merge到master分支,却出现了
conflict
分支切换到master上,以文件a为例,a为revert前feature 新增的文件,冲突显示 master分支上删除了文件(revert后master分支代码回滚,没有a文件,显示为delete),feature分支在revert后更改了a,冲突显示为modify,解决冲突时只保留feature上的更改,解决完之后报错,提示某些文件不存在。冲突解决失败
revert操作的时候只是进行了一次逆向commit,将merge的代码进行回滚,但是commit的记录还存在,当revert后再进行一些commit,然后merge的时候,如果本次commit没有修改revert之前新增的文件,那这些revert前新增的文件就丢失了,提示文件不存在。当revert时,git其实提交了一个新的commit,并且创建了一个revert分支,将revert分支merge到了master,之后再将feature分支merge到master时,会合并feature分支和revert分支的更改,如果revert分支回滚了新增的文件,而feature分支第二次重新merge时没有对这些文件进行更改,git会取revert分支处理结果,即将这些文件删除,导致最后解决冲突后提示文件不存在。
官方推荐方法:对revert的那次提交记录再次revert
git checkout master
git checkout -b revert_tmp
git revert <版本号>
git checkout master
git merge revert_tmp
git push
采用git reset 将head向后移动到第一次merge前的commit,会丢弃所有的merge commit,再次合并就不会
出现冲突
在回滚结果看,revert和reset效果差不多,但在以后进行分支的再次merge时会有很大不同,revert很容易导致文件删除情况,正常操作下采用reset比较稳妥。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。