• 代码 Revert 后再次 Merge 会丢失的问题,已解决


     一、问题场景

            前提,我所在的公司采用 GitLab 进行代码管理。

            这次的异常发生在不久前对系统的一次常规迭代升级过程中,由于系统依赖的第三方包出现了问题,导致服务起不来,为了不影响其他功能的使用,所以将 master 分支进行 revert 到上次的版本。

            等到我们解决了依赖包的问题,重新从 dev 提了 merge 到 master 的申请时,却发现代码变动都不显示了(注:如果修改了代码,也可能出现“conflict”的问题,但是本质一样),导致无法合并分支。也就是说:被回滚的代码被认为已经存在于 master 分支上,不算改动。


    二、原因分析

            revert 操作实际是只是进行了一次逆向 commit,将 merge 的代码进行回滚,但是 commit 的记录还存在。也就是说,dev 上面存在的待提交的代码,其实已经是 master 的过去代码,属于已提交过的状态,所以不会显示 different。


     三、解决方案

    方案一:官方推荐方法

            该核心思想就是:对 revert 的那次提交记录再次 revert 。

    • 首先,切换到 master 分支,并基于 master 分支拉出一个分支 revert_tmp。作为 master 的副本,revert_tmp 的作用就是保存 revert 的提交记录;
    1. git checkout master
    2. git checkout -b revert_tmp
    • 其次,在 master 分支上找到 revert 的那条提交记录的版本号,回滚至之前的版本(版本号可以通过“git log”命令,或者从网页端查看);
    1. git log # 查询<版本号>,格式,如:f2c3b544166eec612ea6814d6cd19aeef46824f8
    2. git revert <版本号>
    • 然后,切换到 dev 分支上,将 revert_tmp 这个分支 merge 到 dev 分支上。
    1. git checkout dev
    2. git merge revert_tmp
    3. git push -f
    • 最后,在 dev 重新提交对 master 的 merge 申请,会发现 revert 之前的代码都回来了。

    方案二:reset 法

            与 revert 不同,采用 -- git reset 将 head 向后移动到上一次 merge 前的 commit 版本,会丢弃所有的 merge commit 记录(revert 不会丢弃,是逆向 commit),所以,再次合并不会出现记录不显示或者冲突的问题。

    1. git reset HEAD^ # 回退所有内容到上一个版本
    2. git reset HEAD^^ # 回退所有内容到上上个版本

     注意:谨慎使用 –hard 参数,它会删除回退点之前的所有信息。

    HEAD 说明:

    –hard 参数参数说明
    HEAD 表示当前版本
    HEAD^上一个版本
    HEAD^^上上一个版本
    HEAD^^^ 上上上一个版本
    以此类推...
    ^ 可以使用 ~数字表示
    HEAD~0表示当前版本
    HEAD~1上一个版本
    HEAD~2上上一个版本
    HEAD~3上上上一个版本
    以此类推..

    总结


  • 相关阅读:
    自动化编程提示框架——啃论文笔记
    【Qt开发流程】之HelloWorld程序
    用iPad记笔记?这10款笔记软件让你事半功倍!
    基于VUE的酒店管理系统的设计与实现
    使用 Helm 3 包管理器在 Kubernetes 集群上安装软件
    百度Apollo9.0安装中,bash docker-install.sh操作后,一直出现“有10个软件包未被升级 DEPRECATION WARNING 无法定位软件包 ”的情况
    算法笔记(三)基础提升
    Python深度学习032:conda操作虚拟环境env的全部命令
    全栈最全性能测试理论-总结
    Unity 2021.x 与 Visual Studio 2013 的调试问题
  • 原文地址:https://blog.csdn.net/weixin_44259720/article/details/126223793