持续交付 36 讲
王潇俊
携程系统研发部总监
39681 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 42 讲
开篇词 (1讲)
结束语 (1讲)
持续交付 36 讲
15
15
1.0x
00:00/00:00
登录|注册

06 | 代码回滚,你真的理解吗?

持续交付平台提供一键代码回滚的功能
特性分支合入到 master 时产生的非合并commit
集成分支上线前的回滚方法
回滚原则
回滚的类别及不同的回滚策略
需要回滚及不需要回滚的情况
代码回滚的概念
集成分支上线后回滚
集成分支上线前回滚
个人分支回滚
集成分支上的代码回滚不用 reset --hard 的方式
下次线上发布用来修复刚才线上运行的问题
线上回滚后,源代码无问题
集成分支上线后回滚
集成分支上线前回滚
个人分支回滚
持续交付平台提供代码一键回滚的功能
线上产品包回滚
合并请求后的回滚
集成分支上的回滚
本地分支通过 reset --hard 回滚
个人开发环境的分支回滚
代码回滚
包回滚
思考题
总结
三种典型回滚场景及回滚策略
代码回滚必须遵循的原则
哪些情况下包的回滚无需回滚代码?
哪些情况下需要回滚代码?
你是不是也遇到了问题?
什么是代码回滚?
你真的理解代码回滚吗?

该思维导图由 AI 生成,仅供参考

什么是代码回滚?

在我正式开始今天的分享前,先给你讲两个核心概念:
包回滚是指,线上运行的系统,从现在的版本回滚到以前稳定的老版本。
代码回滚是指,Git 分支的指针(游标),从指向当前有问题的版本改为指向一个该分支历史树上没问题的版本,而这个版本可以是曾经的 commit,也可以是新建的 commit。

你是不是也遇到了问题?

在日常的代码管理中,困扰开发工程师最多,也是他们向我咨询得最多的问题就是:代码回滚的问题。这些问题,有的只是影响个人开发,而有的涉及了整个团队。我把这些问题进行了整理汇总,你可以看看是否也遇到过类似的问题?
今天上午我在自己的开发环境上拉了一条新分支,提交了 5 个 commit,最新提交的 3 个 commit 我不想要了,那我该怎么退回到这 3 个 commit 之前的那个 commit?
答:参考我在下面即将分享的“个人分支回滚”的内容。
我本地的分支通过 reset --hard 的方式做了代码回滚,想通过 push 的方式让远端的分支也一起回滚,执行 push 命令时却报错,该怎么办?
答:如果不加 -f 参数,执行 reset --hard 后,push 会被拒绝,因为你当前分支的最新提交落后于其对应的远程分支。push 时加上 -f 参数代表强制覆盖。
线上产品包已经回滚到昨天的版本了,我清清楚楚地记得昨天我把发布分支上的代码也 reset --hard 到对应的 commit 了,怎么那几个有问题的 commit 今天又带到发布分支上了?真是要命!
答:集成分支不能用 reset --hard 做回滚,应该采用集成分支上新增 commit 的方式达到回滚的目的。
我刚刚在 GitLab 上接纳了一个合并请求(Merge Request),变更已经合入到 master 上了,但现在我发现这个合并出来的 commit 有较大的质量问题,我必须把 master 回滚到合并之前,我该怎么办?
答:可以在 GitLab 上找到那
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

代码回滚是软件开发中常见的操作,涉及到从当前版本回滚到以前稳定版本的情况。在日常代码管理中,开发人员可能会遇到各种代码回滚的问题,包括个人分支回滚、集成分支上线前后的回滚等。在进行代码回滚时,需要遵循一些原则,比如不使用 reset --hard 的方式进行集成分支上的代码回滚,以避免可能导致不需要的功能再次被引入到集成分支。此外,文章还介绍了哪些情况下需要回滚代码,以及包的回滚无需回滚代码的情况。总的来说,代码回滚是一个重要的技术操作,需要根据具体情况采取合适的方式进行回滚,以确保代码的稳定性和质量。 文章还介绍了三种典型的代码回滚场景及相应的处理策略,包括个人分支回滚、集成分支上线前回滚和集成分支上线后回滚。对于每种场景,都提供了详细的处理步骤和示意图,帮助读者理解如何在实际情况中进行代码回滚操作。此外,文章还提到了一些思考题,引导读者深入思考代码回滚过程中可能遇到的问题,促进对代码管理的深入理解。 总的来说,本文通过具体的场景案例和详细的操作步骤,帮助读者全面了解了代码回滚的概念、原则和实际操作,对于需要进行代码回滚的开发人员具有实际指导意义。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《持续交付 36 讲》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(17)

  • 最新
  • 精选
  • 孙文正
    置顶
    希望每篇的下面分享一些具体实施的文章。 比如gitlab的ci流程具体的部署等等。

    作者回复: 这些都会在最后的一节中介绍,但是这些其实gitlab的doc都挺清楚的,我还是力求将一些大家不一定了解但却有用的东西

    2018-08-21
  • 大M
    置顶
    第一个通过reset-hard和reset -soft 可以实现,下面两个求指教。

    作者回复: 设计这个问题,一来请大家注意“集成分支的回滚”,不能用reset --hard的方式来清除不要的代码,而该使用revert;二来鼓励大家通过实践与思考,真正地掌握revert命令,以便高效解决各类代码回滚的问题。 通过gitlab UI界面,我们只能回滚单个commit,而用git revert命令,可以一次性回滚连续的或间隔的几个commit,其次,如果遇到merge产生的合并commit,必须使用 -m 参数才能回滚,因为要确认正确的父节点 这里还引申出的一个问题是,如果通过UI回滚单个commit不能满足回滚要求的话,建议开发在本地利用revert灵活的方式完成代码回滚,本地测试没问题,再push到远端,然后发回滚的Merge Request。

    2018-07-17
    3
  • zhchnchn
    有个问题请教,在集成分支上线后回滚的操作步骤中,$ git reset --soft origin/master # --soft 使得本地的 master 分支的指针重新回到 V05javascript:;30,而暂存区 (index) 变成 V0529 的内容。这部操作有什么意义吗?文中后面不是说“如果要修复问题,可以在开发分支中先revert掉 C3',这样被清除的几个commit的内容又恢复了”吗?

    作者回复: 我们说上线后不得已才会回滚集成分支的代码(短时间不能修复A功能代码的问题,而B功能又急着要上线)。 上述操作,我们把集成分支回到正确的地方,并且在集成分支上通过新增一个commit的方式,其意义有4个: 让团队其他成员新拉取的代码都没有问题;让曾经拉取了问题代码的分支merge回集成分支的时候,也不会再次把问题带进来;不会影响其他紧急上线的功能;负责修复问题的开发人员,只需再执行revert就能取到需要修复的代码。

    2018-07-24
    2
    6
  • 致远
    老师,在我理解,集成代码上线前和上线后的回滚原理是一样的,为何还要区分出来呢?

    作者回复: 上线前可以通过revert直接处理,纬度是commit;但是上线后,部署包已经存在,你必须考虑与它的对应关系。举个例子,有3个commit,1、2、3上线前你可以回滚1、3,保留2;但上线后,3个commit都要回滚,特别是如果做了自动化代码回滚,这条原则就很重要

    2018-07-29
    2
  • 白天不懂爷的黑
    第二个问题是不是拥有master权限的小伙伴直接在网页上修改的啊,😄。第三个问题,应该也可以不用提交commit,我们这是每build一次代码就备份一次当前构建的包,回滚的话列出最近10次备份的包,然后回滚对应的备份。 老师,我这最近回滚有点问题,比如说,代码发布了三次,然后都上线失败了,备份的三次包也是有问题的,然后测试不知道哪一个版本是最近正确的版本,导致到处问,这个有什么好办法吗?

    作者回复: gitlab高版本对保护分支做了更加精细的权限控制,允许角色或个人(不一定是master)对保护分支做merge和push。这道题主要让大家回顾一下集成分支代码revert的做法,不是删除不要的commit,而是新建一个commit,如果revert的时候不勾选发起merge request,那么这个revert产生的commt就只有一个parent。 发布包本身也是一条路径线,也需要被记录,建议发布包本身带一个比较容易辨识的版本号,commitid作为属性记录在发布包上,这样整个发布包历史也可以很好管理

    2018-07-17
    2
    1
  • 橙子
    commit粒度怎么控制才好,开发分支针对一个文件修改就有一个commit吗?还是一个功能点commit会比较好?

    作者回复: 没有特别的控制约束,最终是以merge request为单位,多个commit的集合,一个mr基本上就是一个功能

    2018-07-25
  • 还在想,还念
    老师可不可以先讲下分支策略流程 实践中基本的分支策略 master feature uat 等而不是一开始直接讲代码回滚 作为一个测试工程师表示很困惑

    作者回复: 分支策略可以看一下第4讲的内容

    2018-07-18
  • 在路上
    对于特定分支代码 commit 回滚使用 git debate -i 这种是不是更好操作一些。
    2020-04-07
    1
  • 天天向上
    我有个疑问哈,如果在集成分支上对某个特性分支request进行了revert后。那我之后这个特性分支改完后,再向集成分支进行merge,那么之前revert掉的就无法再合并了呀?
    2019-12-01
    1
    1
  • tanatang
    问题一:1、创建一个新分支,测试仅回滚3个commit后,是否正常可用。2、将新分支merge回集成分。 问题二:特性分支合并回master之后,出了合并的commit外,原本特性分支更新过程中的commit也同步到了master中。 问题三:需要,原因就类似于文中的 集成分支不要回滚,而是弄新的commit一样。
    2023-04-06归属地:四川
收起评论
显示
设置
留言
17
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部