git revert是个好东西

一个新同学对上线流程不太了解,提前把代码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后,便可把第二次提交的更改抵消。

图片

图片

操作总结

合并错误代码后的处理方法如下:

  1. 找到对应的merge记录

  2. 执行revert操作

  3. 将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.从master拉出一条分支
git checkout -b revert_tmp
#2.在revert_tmp将revert的commitid再次执行revert
git revert b846b23f1f7ec4c503f54885029a12169c6db190
#3.切换到开发分支
git checkout feature_pzq_status
#4.开发分支合并revert_tmp
git merge revert_tmp
#5.推送远端
git push origin feature_pzq_status

下图为push到远端重新merge master的效果。可以看到第二次提交的内容重新合并到了master。

图片

图片

图片

流程总结

将master的git log展示出来,完整过一遍流程:

CommitIdCommentDesc
9a3c3e067614d69b85574dbbf2d4c2615a136282Merge pull request #11 from shidawuhen/feature_pzq_status

Revert “Revert “need revert””
将重新生成的要添加的代码和master合并,上线完成
aacc14457a3bd46b435f616fd455de906e668ed5Revert “Revert “need revert””

This reverts commit b846b23f1f7ec4c503f54885029a12169c6db190.
b846b23是revert后的commitid,在本地对该commitid再次执行revert,重新生成要添加的代码
e134a0a940b8921c542573c42d90058311585569Merge pull request #9 from shidawuhen/revert-8-feature_pzq_status

Revert “need revert”
将反向代码合并到master,抵消第二次合并产生的影响
b846b23f1f7ec4c503f54885029a12169c6db190Revert “need revert”在github上,对f013b7d执行revert,生成第二次合并代码的反向代码
f013b7dd93b324f4c435e90e148aa5ebef30b859Merge pull request #8 from shidawuhen/feature_pzq_status

need revert
第二次提交代码合并到master
3be1b3ed9a188cbcf5d5d8193b67d6dbcffc4099need revert第二次提交
1fc6e450f148f1782ac9238b192e2f8c3be61ab4Merge pull request #7 from shidawuhen/feature_pzq_status

git revert
第一次提交代码合并到master
f2ffcf13ed5fa77ee995351290fc377cea1d1e48git revert第一次提交

资料

  1. https://www.freesion.com/article/6955430124/

  2. https://www.freesion.com/article/5604267330/

  3. https://git-scm.com/docs/git-revert

  4. https://blog.csdn.net/jarvan5/article/details/114028765

  5. Git命令之回退篇 git revert git reset

  6. https://zhuanlan.zhihu.com/p/412482122

  7. https://blog.csdn.net/jarvan5/article/details/114028765

最后

大家如果喜欢我的文章,可以关注我的公众号(程序员麻辣烫)

我的个人博客为:https://shidawuhen.github.io/

图片

往期文章回顾:

  1. 设计模式

  2. 招聘

  3. 思考

  4. 存储

  5. 算法系列

  6. 读书笔记

  7. 小工具

  8. 架构

  9. 网络

  10. Go语言

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值