之前需求开发分支(dev)已经合到(merge)上线分支(release)后,产品又说不上了要回滚代码,shit。我能想到的是用 git revert 来回滚公共分支(release)的提交,但对 git revert 的使用还停留在 git revert A 上,抓瞎。下面是我实践和验证后的操作记录。

场景还原

提交历史如下所示,dev merge 到 release 上产生了 mrege 提交 M,后面可能还有其他开发者的提交或合并记录(这里的 4 和 5)。

12Ad3BevM4rHeEl5AeDase

回滚操作

使用 -m 参数回滚 merge 提交,命令:

$ git revert -m 1 M

生成 merge 提交 M 的 revert W(W 像不像 M 倒过来,:P),此时 release 分支就完成了回滚,不包含不上需求的提交(dev 的 A 和 B),可以正常上线了。

12Ad3BevM45reHlEeWAaDse

其中的参数含义:

  • -m 1:指定主线的父节点编号(从 1 开始计数),让 revert 操作基于该父节点对应的分支状态进行变更反转。简单来说:

    • -m 1:revert 到目标分支(这里的 release)的状态;

    • -m 2:revert 到来源分支(这里的 dev)的状态。

  • M:合并提交的哈希值(这里的 M),也就是要撤销的合并操作。

二次上线操作

如果之后需求又要上线,回滚之前的回滚操作即可,命令:git revert W,其中 Y 是 W 的 revert。

12Ad3BevM45W6reHlEeYAaDse

另外如果 dev 还有新修改(需求变更或 Bug 修复),直接在 dev 上进行修改后,然后再合到 release 上。

12A3BM45W6CdYDevreHlEeAaDse

References