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

    总结


  • 相关阅读:
    .env文件详解
    Docker入门,Docker是什么?有什么用?该怎么用?
    ES6 入门教程 5 字符串的新增方法 5.7 实例方法:padStart(),padEnd() ~ 5.11 实例方法:at()
    Java中的反射机制
    LeetCode每日一题:1488. 避免洪水泛滥(2023.10.13 C++)
    什么是SpringMVC
    java计算机毕业设计河东街摊位管理系统源码+mysql数据库+系统+LW文档+部署
    浮点型数据转为字符串
    MyBatis动态SQL多表操作
    当面试官问出“Unsafe”类时,我就知道这场面试废了,祖坟都能给你问出来!
  • 原文地址:https://blog.csdn.net/weixin_44259720/article/details/126223793