赞
踩
开发过程中,我们经常会遇到代码回滚的情况。正常人都知道,git 回滚有两大宝:
当我们在本地开发,还未 git push
到远端时,可以毫无顾忌的使用 git reset
进行回滚。更多的情况中,我们不仅 push 了,而且由于开发周期长,在开发过程中不断的 merge master
和 merge other-branch
以发布到预发环境测试或者多需求合并测试。
上线后用户投诉,需要马上下线本次需求中的 A、B、C,只保留 D、E、F,迅速回滚,不要影响更多用户。
撕逼?那肯定是来不及了。一群人在你背后眼巴巴地盯着你,就问你慌不慌...
接下来,我们来说说,如何在紧急回滚面前,镇定(假)自若(装)地进行 git 操作
本地操作使用 git reset
随便玩玩就行了,我们主要讲讲 git revert
回滚合并时,如果直接使用 git revert mergeCommit
实际上是递归回滚里面的每一个节点,指定 -m
是指定以哪一个分支为主线,当前所在分支为 1,依次类推(一次合并多个分支时会 > 2,正常只有 1 和 2)
如果我们遇到的问题都像上面一样,那怎么能体现一个程序员的价值?
如以下场景中,我们期望回归的节点之间含有一次合并导致我们无法一次回滚到位。有两种方式:
1. 按顺序见招拆招回滚(三次操作)
2. 先回滚 D + F,再回滚合并(两次操作)
【推荐】使用方案1,按顺序回滚会处理更少的 conflict,否则假设 D、F 是一系列提交合集,那么回滚成本很高
如下的场景中,特殊的地方在于,我有一个 feature,搭车了一个 bugfix,我需要回滚需求但不回滚 bug
这种情况下,有两种选择:
- git revert G
- git revert F -m 1
- git revert D..E
- git cherry-pick C``
- git cherry-pick D``
- git cherry-pick E``
Copy
回滚方式
遇到这样的场景,一般有如下几种方案回滚:
- git revert N`..S`
- // 仅回滚非 merge Master 节点,保留 Master 代码
- git log B``^..L`` --first-parent --no-merges --pretty=format:%H | xargs | xargs git cherry-pick -n
- git revert E`..F`
Copy
想要回滚不头痛,提前就要做好功课并且保持清晰的提交记录,否则几百个 commit 回滚起来就变成了一场灾难。提几个好方法
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。