• 代码 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上上上一个版本
    以此类推..

    总结


  • 相关阅读:
    Windows下安装PaddleDetection
    基于 Kubernetes 的 DevOps
    【ARM+Codesys案例】基于全志T3+Codesys软PLC的3C点胶边缘控制解决方案:整合了运动控制、视觉、激光测高等技术
    MP进阶操作: 时间操作, sql,querywapper,lambdaQueryWapper(条件构造器)快速筛选 枚举类
    系统架构设计师学习笔记——软件架构设计_重点备忘录
    web serveer
    @PostConstruct详解
    jvm参数设置方法(win10)
    Redis——》数据类型:list(列表)
    53. Maximum Subarray最大子数组和
  • 原文地址:https://blog.csdn.net/weixin_44259720/article/details/126223793