解决Git?Revert?再次合代码无效问题_相关技巧

来源:脚本之家  责任编辑:小易  
目录
背景Demo复现该问题用Squash方式解决该问题小结

背景

将开发分支dev合并进主分支main以后,如果发现bug需要回滚代码时,我们常使用git revert完成操作,但是当我们将dev上的bug修复之后想再把它合进main却会发现,dev上的功能代码合不进去了,原因是这些功能代码的commit已经在main分支上了(虽然被revert了,但仍在),所以git会拒绝合进重复的commit。

本人最近就遇到了这种问题场景,查阅网上资料推荐的做法一般是把main之前的revert再revert掉然后合dev,但是实际操作过程中却发生了如下错误:

不明就里,估计是因为多人协作导致main分支日新月异,revert操作产生了不可描述的冲突,翻看长串的git log已难以厘清... ...但我决定不去深究这些细节,因为已想到更完美的解决方案??!

那就是利用git rebase -i将dev的commit们 squash(压缩)为一个commit(主要目的是生成一个新的commit哈希),然后再去rebase main分支即可,实测效果拔群??再也不用担心类似的问题了!

Demo复现该问题

初始状态:基于main分支切了dev分支并开发

dev合并到main后

发现bug,在main上进行回滚

在dev上做bugfix并测试OK

dev重新合并到main

到这里问题来了,我们希望得到的main分支效果应该相当于以下分支:

c0 <- c1 <- c2 <- c3 <- c4

但由于c2 c3被revert掉(改动内容消失了),却已经存在于main上(重新合并时main分支认为已经合过它俩,于是拒绝重复引入c2 c3),所以到第5步得到的效果实际相当于:

c0 <- c1 <- c4

这就是标题所说「Git Revert之后再次合代码无效」的问题

用Squash方式解决该问题

在上述Demo的步骤4基础上改

1、切到dev执行git rebase -i,让它自己rebase自己,目的是把dev上多个commit squash(压缩合并)为一个commit,这个新commit将具有新的哈希值(这样main分支就不会拒绝它了)

我们希望将c2 c3 c4合并(即dev分支上完整的变更内容),假设c2的哈希值为c2_hash,需要执行以下shell命令

$ git checkout dev
$ git rebase -i c2_hash

2、弹出的vi编辑界面如下,根据提示squash掉dev上的commit

3、填写commit信息,dev squash完成,效果如下

4、再用dev去rebase main分支,此时我们可以彻底忘掉git revert的黑历史,就像将一个新鲜出炉的功能分支rebase主分支一样,有冲突解决冲突即可

5. 再次将dev合并到main即可,完美收官!

小结

解决git revert副作用问题,网上主流的方法是:

在main分支找到之前revert的commit(可能有多个,如果是多人协作则还可能分散)将之前的revert再次进行revert合dev分支,解决冲突

本文介绍的方法是:

在dev分支上找功能代码涉及的commit(开发分支上一般是连续的几个commit,容易找)将这些commit压缩合并为一个dev分支rebase到main分支,解决冲突

个人比较倾向于本文这种做法,一则处理起来比较舒服,完全不用去关心之前的revert记录;

二则看起来舒服,处理完之后dev分支较main分支只会多一个commit,这个commit包含dev上的所有功能代码变更

以上就是解决Git Revert 再次合代码无效问题的详细内容,更多关于Git Revert 合代码无效的资料请关注真格学网其它相关文章!

您可能感兴趣的文章:Git恢复之前版本的两种方法reset、revert(图文详解)Git撤销&回滚操作(git reset 和 get revert)git revert和git reset的区别详解Git获取本地仓库及基础操作指令总结45个GIT经典操作场景使用详解Git远程仓库配置SSH的实现(以github为例)

  • 本文相关:
  • 算法系列15天速成 第十四天 图【上】
  • 将sublime?text?设置成中文版的完整教程
  • jetbrains(ieda、clion、pycharm) 学生获得免费使用资格
  • git 教程之工作区、暂存区和版本库详解
  • postman扩展程序包安装与使用步骤
  • 代码中到底应不应当写注释?
  • zend studio 快捷键收集
  • cnblogs 运行代码功能尝试
  • idea+git+gitlab使用详细教程
  • 2020年最火的6种编程语言推荐
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全javascriptasp.netphp编程ajax相关正则表达式asp编程jsp编程编程10000问css/htmlflex脚本加解密web2.0xml/rss网页编辑器相关技巧安全相关网页播放器其它综合dart首页相关技巧git恢复之前版本的两种方法reset、revert(图文详解)git撤销&回滚操作(git reset 和 get revert)git revert和git reset的区别详解git获取本地仓库及基础操作指令总结45个git经典操作场景使用详解git远程仓库配置ssh的实现(以github为例)算法系列15天速成 第十四天 图【上】将sublime?text?设置成中文版的完整教程jetbrains(ieda、clion、pycharm) 学生获得免费使用资格git 教程之工作区、暂存区和版本库详解postman扩展程序包安装与使用步骤代码中到底应不应当写注释?zend studio 快捷键收集cnblogs 运行代码功能尝试idea+git+gitlab使用详细教程2020年最火的6种编程语言推荐2019最新的pycharm激活码(推荐)vscode检测到#include错误请更新includep从console.log说起(console.log详细介绍分享最新sublime text4 build 4107注册进制转换算法原理(二进制 八进制 十进制 十六进制)eclipse 格式化代码时不换行与自动换行的实现方法微信小程序设置http请求的步骤详解抓包工具fiddler的使用方法详解(fiddler中文教程低版本vs项目在vs2019无法正常编译的问题五个最佳编程文本编辑器分享三大uml建模工具visio、rational rose、powerdesitortoisegit的安装与配置教程详解visual studio使用git忽略不想上传到远程仓库的文件对web开发人员有用的8个网站小结彻底解决页面文字编码乱码问题jetbrains公司三大编辑器迭代循环模板快捷键详解vscode配置远程开发与免密登录的技巧
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved