问题场景
公司团队使用的是gitLab进行代码管理。因为甲方临时变动,计划好已经要发版的功能突然说不上线了,所以需要将master分支进行revert,把merge到master上的功能分支revert。
当再次通知该功能上线,重新从功能分支dev提了merge请求到master时,发现代码变动都不显示了,导致无法合并。也就是说:被回滚的代码被认为已经存在于master分支上,不算改动。
原因分析
revert操作实际是只是进行了一次逆向commit,将merge的代码进行回滚,但是commit的记录还是存在的。也就是说,dev上面存在的待提交的代码,其实已经是master的过去代码,属于已提交过的状态,所以不会显示different。
解决方案
方案1:官方推荐方案
- 核心:对revert的那次提交记录再次revert
(1)首先,切换到master分支,并基于master分支拉出一个revert_tmp。作为master的副本,revert_tmp的作用就是保存revert的提交记录;
css
git checkout master
git checkout -b revert_tmp
(2)其次,在master分支上找到revert的那条提交记录的版本号,回滚至之前的版本(版本号可以通过git log 命令,或者网页端查看),此操作在 revert_tmp分支上进行操作
bash
git log
git revert 版本号
(3)然后,切换到dev分支上,将revert_tmp这个分支merge到dev分支上。
perl
git checkout dev
git merge revert_tmp
git push -f
(4)最后,在dev重新提交对master的merge申请,会发现revert之前的代码都回来了。
方案2:reset方案
与revert不同,采用-- git reset
将head向后移动动上一次merge前的commit版本,会丢弃所有的merge commit记录(revert 不会丢弃,是逆向commit),所以,再次合并不会出现记录不显示或者冲突的问题。
perl
git reset HEAD^
git reset HEAD^^
HEAD说明
--hard参数 | 参数说明 |
---|---|
HEAD | 当前版本 |
HEAD^ | 上一个版本 |
HEAD^^ | 上上一个版本 |
HEAD^^^ | 上上上一个版本 |
以此类推...... | |
^可以使用 ~ 数字表示 | |
HEAD~0 | 表示当前版本 |
HEAD~1 | 上一个版本 |
HEAD~2 | 上上一个版本 |
HEAD~3 | 上上上一个版本 |
以此类推...... |
参考并实践: