ʕ•ᴥ•ʔ Kohath's Reflections

Git 实战:回滚合并提交

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

场景还原

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

 1                                       HEAD
 2 3 4                                      release
 5 6 71 ────► 2 ────► 3 ────► M ────► 4 ────► 5
 8 910        A ────► B ──────┘
111213               dev

回滚操作

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

1$ git revert -m 1 M

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

 1                                               HEAD
 2 3 4                                             release
 5 6 71 ────► 2 ────► 3 ────► M ────► 4 ────► 5 ────► W
 8 910        A ────► B ──────┘
111213               dev

其中的参数含义:

二次上线操作

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

 1                                                               HEAD
 2 3 4                                                             release
 5 6 71 ────► 2 ────► 3 ────► M ────► 4 ────► 5 ────► W ────► 6 ────► Y
 8 910        A ────► B ──────┘
111213               dev

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

 1                                                                       HEAD
 2 3 4                                                                     release
 5 6 71 ────► 2 ────► 3 ────► M ────► 4 ────► 5 ────► W ────► 6 ────► Y ────► *
 8                        ▲                                               ▲ 
 9                        │                                               │
10        A ────► B ──────┘ ────────────────────────────► C ────► D ──────┘ 
111213                                                               dev

References

#Git