git revert 导致新提交 merge 代码丢失

git revert 导致新提交 merge 代码丢失

问题描述:

有三个分支: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比较稳妥。

你可能感兴趣的:(git)