一个新同学对上线流程不太了解,提前把代码merge了。只能用git revert进行回滚,当上线前再次合并代码,git上没有显示更改。revert大家用的比较少,很多细节可能不知晓,所以这次聊一下git revert的使用,希望大家不会用到它。
命令
git revert
用于撤销文件,撤销文件后不会影响其他的提交。
1.git revert <commit-id>
:撤销某个提交
2.git revert -n|--no-commit <commit-id>
:撤销某个提交,但执行命令后不进入编辑界面,也就是不会自动帮你提交文件,需要手动提交,这与第1点的差别就是撤销和提交分开了。
简单来说,revert做了一个反向操作,并生成新的commitid。如果commitA中增加了几行,对commitA revert后,会生成新的commitB,内容为删除最初增加的几行,且commitB>commitA。
复现
将过程进行复现,方便大家理解,代码用 https://github.com/shidawuhen/asap ,分支为feature_pzq_status。
第一次提交
创建一个新文件,并合并到master
第二次提交
第二次提交模拟误提交情况,内容如下。
代码merge后发现代码不应上线。
revert
点击右侧的revert,git会自动生成一个新的revert分支revert-8-feature_pzq_status。
查看该分支的改动,可看出是将第二次提交的代码进行了反向操作。
重新合并
将revert-8-feature_pzq_status重新合并到master后,便可把第二次提交的更改抵消。
操作总结
合并错误代码后的处理方法如下:
- 找到对应的merge记录
- 执行revert操作
- 将revert产生的分支,重新merge到master,将更改抵消
diff丢失
问题
当分支feature_pzq_status需真正合并master进行上线时,发现feature_pzq_status和master没有任何不同。
这是因为对于master而言,已经合并过feature_pzq_status,master包含feature_pzq_status的commitid,这些提交不会参与diff,所以不会显示出两个分支的不同。
解决方案
解决方案是将revert之后产生的分支,再次进行revert。这个操作能够将本要提交的代码,放置到最新的HEAD,其commitid要比master高,所以会重新diff。
具体操作如下:
1 | 1.从master拉出一条分支 |
下图为push到远端重新merge master的效果。可以看到第二次提交的内容重新合并到了master。
流程总结
将master的git log展示出来,完整过一遍流程:
CommitId | Comment | Desc |
---|---|---|
9a3c3e067614d69b85574dbbf2d4c2615a136282 | Merge pull request #11 from shidawuhen/feature_pzq_status Revert “Revert “need revert”” |
将重新生成的要添加的代码和master合并,上线完成 |
aacc14457a3bd46b435f616fd455de906e668ed5 | Revert “Revert “need revert”” This reverts commit b846b23f1f7ec4c503f54885029a12169c6db190. |
b846b23是revert后的commitid,在本地对该commitid再次执行revert,重新生成要添加的代码 |
e134a0a940b8921c542573c42d90058311585569 | Merge pull request #9 from shidawuhen/revert-8-feature_pzq_status Revert “need revert” |
将反向代码合并到master,抵消第二次合并产生的影响 |
b846b23f1f7ec4c503f54885029a12169c6db190 | Revert “need revert” | 在github上,对f013b7d执行revert,生成第二次合并代码的反向代码 |
f013b7dd93b324f4c435e90e148aa5ebef30b859 | Merge pull request #8 from shidawuhen/feature_pzq_status need revert |
第二次提交代码合并到master |
3be1b3ed9a188cbcf5d5d8193b67d6dbcffc4099 | need revert | 第二次提交 |
1fc6e450f148f1782ac9238b192e2f8c3be61ab4 | Merge pull request #7 from shidawuhen/feature_pzq_status git revert |
第一次提交代码合并到master |
f2ffcf13ed5fa77ee995351290fc377cea1d1e48 | git revert | 第一次提交 |
资料
- https://www.freesion.com/article/6955430124/
- https://www.freesion.com/article/5604267330/
- https://git-scm.com/docs/git-revert
- https://blog.csdn.net/jarvan5/article/details/114028765
- Git命令之回退篇 git revert git reset
- https://zhuanlan.zhihu.com/p/412482122
- https://blog.csdn.net/jarvan5/article/details/114028765