当在发布系统发起回滚时, 一般会有一个选项 (但大概率默认不勾选): 是否回滚代码;
如果勾选, 发布系统一般会使用 git revert 命令对从上一次发布基线开始到当前提交的所有 commit 执行 revert 操作;
本文总结 git revert 命令及相关使用经验;
使用场景
情况一: revert commit
1 | # revert 某一次 commit |
如果是 revert 最新的 commit (即 HEAD), 是不会发生 conflict 的, 但是如果要 revert 的 commit 是好几个 commit 之前的提交, 而不巧那次 commit 修改过的内容在之后的 commit 又有了新的修改, 就会发生冲突了;
所以, 如果是真的需要 revert 掉好几次提交之前的某一次 commit, 就需要做好处理冲突的准备; 不过, 如果是需要 revert 掉某一次 commit 之后的所有 commit, 我们就可以按从新到旧的顺序依次 revert, 从而避免 conflict:
1 | # 先将最近的 commit 列出来 |
不过, git revert 默认生成一次 commit; 当我们想要 revert 掉连续的多次 commit 时, 明显不希望每次 revert 就生成一个 commit, 所以这里需要用到一个选项, 阻止其自动 commit; 本文第四节会讨论该问题;
情况二: revert merge
相比 revert commit, revert merge 的概念会稍微复杂一点: 作为 merge commit, 在其基础上的回退有一个路径选择的问题, 因为该 commit 是由 2 至多个不同的分支的 commit 合并而来的;
1 | # -m: --mainline, 选择 revert 掉哪个 parent commit |
这里 --mainline
的值, 表示 revert 掉哪个 parent commit, 是一个整数值, 于是这里就牵扯到 git merge 时各 commit 所对应的 parent commit 序号的问题:
1 | > git log -1 |
git revert 常用选项
1.默认情况下, git revert 完成后, 会自动作一次 git commit, 将本次操作提交; 如果不希望自动提交, 有如下选项:
1 | # -n: --no-commit |
正如第二节所说, -n 选项比较适合需要多次 revert 多个 commit 时, 避免产生多个同类的 revert commit 记录;
2.默认情况下, git revert 完成后, 其默认的 commit message 是 Revert "${target_revert_commit_message}"
, 然后 git 会调用系统默认编辑器让操作者修改本次 commit message; 这里有一个选项可以直接使用默认的 message, 而不需要编辑:
1 | # -e: --edit, 默认选项, 需要编辑 |
3.revert merge 时指定 revert 哪一个 parent commit 的选项: --mainline
, 本文第三节已详细介绍, 此处不再赘述;