git 如何撤销 git workflow中的某次提交或者某次merge
在团队协作开发过程中经常出现这种情况:可能不小心合入错误的代码,可能合并之后发现,合入的代码有问题,但是已经有新的提交加入,如何操作?
一般使用三种方法:
-
revert 执行撤销操作,git revert <commit>: 可以执行单个撤销,还有一系列提交,git revert <commit id1>..<commit id2>(前开后闭)。例如:
git revert --no-commit s32342d..23wsd23 # --no-commit 把提交放到最后一起进行手动提交 git commit -a -m 'revert commit from s32342d to 23wsd23'
即:移除 s32342d 后的到 23wsd23 的所有版本。HEAD 上火多去一个提交:revert commit from s32342d to 23wsd23
- 特点:不需要其他分支配置,不改变本分支的以前的工作流,只做新增操作,非常适用于有保护的分支
- 通过 rebase drop 某次提交
- 找到要撤销提交的前一次提交:commit_id
- 使用 git rebase -i commit_id 修改,把 commit_id 前的pick 改为 drop
- 保存退出
- git push -f
特点:操作简单,但是改变会改动工作流
3. 通过 rebase, git cherry-pick
- 对要撤销后的commit,rebase 合并成一次提交 commit_id
- 在撤销commit前的次节点,拉出新分支
- 新分支tmp合入 commit_id
- 原分支执行版本回退,
- 合并tmp
- git push -f
特点:操作复杂,会改动工作流,但是由于新建分支,过程中减少出错对原分支的影响