git revert后无法merge发生的惨案

前景描述:

目前公司开发模式是这样的,有测试分支test,开发分支dev1,dev2,dev3,(dev1,dev2,dev3都是基于test分支拉出来的)各分支如果没有问题后都会合并到test,如果test测试无误后,会直接从开发分支dev1直接合到生产prod分支。这种情况下合并操作如下:平时合并代码时,只能dev1代码向上合到test,但是test的代码时不能合到dev1的(因为test上有dev2,dev3的代码,而这两个分支代码的功能上线时间晚,所以test分支不能向下合到dev1)

问题描述:

由于不熟悉合并流程,某同事先把test分支的代码合到dev1并提交代码,然后切到test分支,把dev1代码合到test。其中第二步是没问题的,关键在于不应该把test分支代码合到dev1并提交代码了。其中最要命的是,在这次合并提交后,dev1分支上还有很多其他同事多次提交的代码

期望解决:

既然出现问题,就需要解决这个dev1分支上不应该有test代码的问题,最终要达成的目的就是要去掉test合并到dev1的那个操作(从而去掉test上的代码),并且不能影响这次错误合并后的其他同事多次提交的代码。

解决历程:

1、首先,我是使用了git revert 命令,我想的是直接通过 git revert commit-version -m 1 来撤销掉我那次错误合并(commit-reversion 是合并完成提交代码的版本号,-m 1 是保留当前分支,回滚掉原来分支。是一个固定写法),执行这个命令后,我发现dev1分支代码确实没有test分支代码了。但是问题来了,我重新从其他分支(dev2,dev3)合并代码到dev1分支,却发现不能merge了(具体情况是dev2,dev3的代码merge不下来)。
2、针对步骤1出现的情况,我又查找资料,发现使用git revert 命令撤销 merge操作后,确实会产生不能重新merge的情况。
3、接着我想到了git reset操作,即我git reset commit-version 回退到 我merge的那个版本前(commit-version 可以理解为错误merge版本的上一个版本,也就是没有问题的版本),然后我记住后续同事提交的commit-version版本,用git cherry-pick commit-version… (… 代表cherry-pick 后可以传多个版本号,用空格隔开即可)把后续同事提交的代码重新提交,然后把代码push即可(也可以使用命令git push origin HEAD:comitName --force ,comitName是你要推送的远程分支名,我这里是dev1)。

注:

如果在cherry-pick 的过程中出现了冲突 ,可以使用git cherry-pick --continue 跳过此版本;如果想中途推出cherry-pcik ,可以使用git cherry-pick --abort命令,执行完cherry-pick 后可以使用git cherry-pick --quit 命令。

4、经过步骤3,我以为用git reset可以解决这个问题了,但是应该是我在这个dev1分支上已经用过git revert命令了,所以现在用git reset还原也不行了。
5、我又想到另外一种方案,就是以dev1分支的某次提交版本为标准点 拉一个新的分支
(具体操作如下:在dev1分支下,执行命令git checkout -b new-branchName xxxxx , xxxxx是某次提交版本的版本号,我这里是错误merge的前一次的版本号),然后切到新的分支,执行git cherry-pick commit-version… (这个操作的意思是把旧分支错误merge版本后的代码提交记录同步到新的分支上来),具体步骤可以参考3。事实证明这次的操作是可行的。

总结:

1、git reset 和git revert的区别:
git reset是回退到某个版本之前,在这个版本后提交的代码都没有了,git revert 是单纯的撤销某次的操作,不影响后续的提交记录(但是如果是要撤销merge操作,请慎用此命令,因为有可能出现无法再次merge的情况,如果是撤销常规的commit 提交,可以使用
2、我一开始就选错了命令,不应该用git revert ,应该一上来就用git reset命令回退到某个没有问题的版本,然后用git cherry-pick 把问题版本后的commit提交一个个找回来。

最后参考链接:

https://cloud.tencent.com/developer/article/1971238
https://blog.csdn.net/zhaohongfei_358/article/details/127729172

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐