手把手教你 git revert merge

开发中git分支管理

在这里插入图片描述

研发流程
  • 从develop分支切出一个新分支,根据是功能还是bug,命名为id-xxx 或 id-fixbug-*。
  • 开发者完成开发,提交分支到远程仓库。
  • 开发者发起merge请求,将新分支请求merge到develop分支,并提醒code reviewer进行review(也可以在当前开发分支review)
  • code reviewer对代码review之后,若无问题,则接受merge请求,新分支merge到develop分支,同时可删除新建分支;若有问题,则不能- - 进行merge,可close该请求,同时通知开发者在新分支上进行相应调整。调整完后提交代码重复review流程。
  • 转测时,直接从当前develop分支merge到pre-release分支,重新构建测试环境完成转测。
  • 测试完成后,从pre-release分支merge到master分支,基于master分支构建生产环境完成上线。并对master分支打tag

git命令

问题
  • develop merge到 pre-release,发现有bug,此时,我们需要踢出此处merge,在develop分支bugfix,接着在commit,merge
  • 此处涉及到一个代码的回退,也就是revert操作,最近在上线过程中,因假期封网,导致必须将已经merge的代码回退,因此有此篇总结
命令解析
  • revert 可以取消指定的某次提交内容。
  • revert我们在讨论时候,需要分两种情况
    • 一种是常规的 commit,也就是使用 git commit 提交的 commit;
    • 另一种是 merge commit,在使用 git merge 合并两个分支之后,你将会得到一个新的 merge commit。
    • merge commit 和普通 commit 的不同之处在于 merge commit 包含两个 parent commit,代表该 merge commit 是从哪两个 commit 合并过来的。我们可以从git的可视化图形中看出,如下:

在这里插入图片描述

  • 如上有一个merge commit, 我们将分支 105700s-liaojiamin 合并到master,可以利用git show XXX来查看对应的commit,如下
    在这里插入图片描述

  • 如上对提交 id: fccc479 的查询,得到了 Merge: 5705f77 e4b8f63 这个结构,其中前后两个都是对应的commit id

  • 对5705f77 的查询,得到的是具体的修改信息,这样是能明显看出区别的

  • 此处我们主要多merge commit进行分析,在前后两个 commit Id中,这代表该 merge commit 是从 5705f77和 e4b8f63两个 commit 合并过来的。

  • 如上图中, 5705f77 是原来master的最后一个提交, e4b8f63 是开发分支中的最后一个提交

revert 常规 commit
  • 使用 git revert 即可,git 会生成一个新的 commit,将指定的 commit 内容从当前分支上撤除。
revert merge commit
  • 我们可以先按常规的方式执行,如下图:
    在这里插入图片描述
  • 提示信息说明:改commit 是一个merge commit,但是执行命令必须添加 -m操作,本次revert 失败
  • revert merge commit 有一些不同,按提示我们需要添加 -m 选项以代表这次 revert 的是一个 merge commit
  • 但如果直接使用 git revert ,git 也不知道到底要撤除哪一条分支上的内容,这时需要指定一个 parent number 标识出"主线",主线的内容将会保留,而另一条分支的内容将被 revert。
  • 如上面的例子中,从 git show 命令的结果中可以看到,merge commit 的 parent 分别为 5705f77 和 e4b8f63,其中 5705f77 代表 master 分支(从图中可以看出),e4b8f63代表 105700s-liaojiamin 分支。需要注意的是 -m 选项接收的参数是一个数字,数字取值为 1 和 2,也就是 Merge 行里面列出来的第一个还是第二个。
    • 我们要 revert 105700s-liaojiamin 分支上的内容,即 保留主分支,应该设置主分支为主线,操作如下:
git revert -m 1 fccc479

在这里插入图片描述

revert 后重新上线

  • 当前我们在分支 105700s-liaojiamin 上开发了一个功能,并合并到了 master 上,之后 master 上又提交了一个修改 h,这时提交历史如下:
a -> b -> c -> f -- g -> h (master)\      /d -> e   (105700s-liaojiamin)
  • 当前我们突然发现开发分支(105700s-liaojiamin)存在严重的 bug,需要 revert 掉,于是大家把 g 这个 merge commit revert 掉了,记为 G,如下:
a -> b -> c -> f -- g -> h -> G (master)\      /d -> e  (105700s-liaojiamin)
  • 然后在回到原开发分支进行 bugfix,修好之后想重新合并到 master,直觉上只需要再 merge 到 master 即可(或者使用 cherry-pick),像这样:
a -> b -> c -> f -- g -> h -> G -> i (master)\      /               /d -> e -> j -> k ----    (105700s-liaojiamin)
  • i 是新的 merge commit。但需要注意的是,这 不能 得到我们期望的结果。因为 d 和 e 两个提交曾经被丢弃过,如此合并到 master 的代码,并不会重新包含 d 和 e 两个提交的内容,相当于只有 105700s-liaojiamin 上的新 commit 被合并了进来,而 105700s-liaojiamin 分支之前的内容,依然是被 revert 掉了。
  • 所以,如果想恢复整个 105700s-liaojiamin 所做的修改,应该先把 G revert 掉:
a -> b -> c -> f -- g -> h -> G -> G' -> i (master)\      /                     /d -> e -> j -> k ----------    (105700s-liaojiamin)
  • 其中 G’ 是对 G 的 revert 操作生成的 commit,把之前撤销合并时丢弃的代码恢复了回来,然后再 merge 狗蛋的分支,把解决 bug 写的新代码合并到 master 分支。
  • 我来执行如下命令
//查找对应commit id
git log --oneline --graph
//回退revert
git revert e56a2ec
  • 效果图如下:
    在这里插入图片描述
  • 如上我们找回来了之前revert的代码,并且在master上提交的代码还在,并且存在冲突,我们解决冲突,在master上在commit即可完成

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/310253.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何把自己的经历写成小说_古天乐的经历教会我们:如何在被欺骗以后改善自己的心理状态...

众所周知,这个只有太阳能黑他的男人,早年未发迹时曾干过泊车小弟等工作,后来作为模特经纪人接触娱乐圈,传闻某次模特迟到,古爷临时救场,算是正式踏入娱圈,出现在无数大牌歌星的MV里,…

从GC的SuppressFinalize方法带你深刻认识Finalize底层运行机制

如果你经常看开源项目的源码,你会发现很多Dispose方法中都有这么一句代码: GC.SuppressFinalize(this); ,看过一两次可能无所谓,看多了就来了兴趣,这篇就跟大家聊一聊。一:背景1. 在哪发现的相信现在Mysql在…

NIO工作方式浅析

java Socket 工作机制 Socket是描述计算机之前相互通信的一种抽象功能。通过基于TCP/IP的流套接字协议建立连接A机器B机器通信—建立Socket连接—通过TCP连接(端口号指定唯一应用)----IP寻址(寻找唯一主机)----最终找到唯一主机上…

bufferedimage生成的图片模糊_Kaptcha图片验证码工具

阅读文本大概需要3分钟。验证码的作用图片验证码自从诞生以来从未被抛弃,依然发出属于它所应有的光。验证码经常验证如下一些场景。1、用户登录,防止机器人登录2、论坛留言,防止恶意灌水3、短信验证码发送,防止盗刷短信Kaptcha 简…

[Java基础]对象(反)序列化流

对象序列化流: 代码如下: package ObjectOutputStreamPack;import java.io.Serializable;public class Student implements Serializable {private String name;private int age;public Student() {}public Student(String name, int age) {this.name name;this.age age;}pu…

C# 9 新特性:代码生成器、编译时反射

前言今天 .NET 官方博客宣布 C# 9 Source Generators 第一个预览版发布,这是一个用户已经喊了快 5 年特性,今天终于发布了。简介Source Generators 顾名思义代码生成器,它允许开发者在代码编译过程中获取查看用户代码并且生成新的 C# 代码参与…

I/O性能与可靠性

I/O调优 磁盘I/O优化 性能检测: 压力测试应用程序,观察系统I/O wait指标是否正常,例如有n个CPU,利息情况下I/O wait参数不超过25%,如果超过,就是这个程序的瓶颈就是在IO操作上了可以用iostat命令查看另外…

.NET开源工具类库:Masuit.Tools

【开源框架】| 通用工具类库这是恰童鞋骚年的第223篇原创文章本文介绍一个我的同事【懒得勤快】(人称勤快哥,我们叫他骚哥)写的一个.NET开源工具类库项目,包含一些常用的操作类,大都是静态类,加密解密&…

[Java基础]字节,字符打印流

代码如下: package PrintWriterPack;import java.io.FileNotFoundException; import java.io.PrintWriter;public class PrintWriterDemo {public static void main(String[] args) throws FileNotFoundException {PrintWriter pw new PrintWriter("D:\\Java…

javaI/O包中的包装模式

设计模式解析–适配器模式 对适配器模式功能比较好理解,就是讲一个类的接口换成客户端所能接受的另外一个接口,从而使两国接口不匹配而无法在一起工作的两个类能在一起工作。 适配器的结构 适配器UML图如下 Target(目标接口)&…

DevOps vs. Agile:它们有什么共同点?

导语DevOps与Agile有很多不同,但它们之间仍可发现很多共同点,这篇文章为读者揭晓。正文DevOps和Agile之间有着明显的关系。Agile是方法论,Scrum是框架,并DevOps随着看板也落在了Agile的“伞”下。精益,大规模的Scrum&a…

[Java基础]Properties

代码如下: package PropertiesPack;import java.util.Properties; import java.util.Set;public class PropertiesDemo01 {public static void main(String[] args){Properties prop new Properties();prop.put("001","Tom");prop.put("002",&…

空心点_空心砖的新玩法,看完大开眼界

我们所见的空心砖大都在建筑工地上常见的有水泥空心砖和粘土空心砖特点是轻质、环保、保温和隔音如此常见的空心砖仅仅是只为建筑而生吗不是,不管是古朴砖红色空心砖,还是高冷的水泥空心砖他们可以演绎不同的角色甚至让每个渴望回归本真的我们&#xff0…

IO与零拷贝

IO与零拷贝 零拷贝基本介绍 零拷贝时网络编程的一个关键优化点在Java程序中,常用的零拷贝又mmap(内存映射)和sendFile。那么在OS中的设计时如何,我们需分析mmap和sendFile对比最后通过案例分析 用户进程与操作系统关系 我们先…

从堆里找回“丢失”的代码

前言 前一阵子,使用小乌龟(TortoiseGit)提交代码的时候,错误的 Revert 了部分代码,本文记录了找回这部分代码的过程。文章标题致敬张银奎老师《格蠹汇编》的第一章 —— 从堆里抢救丢失的博客。说明: 本文的…

[Java基础]线程基础与实现多线程

代码如下&#xff1a; package MyThreadPack;public class MyThread extends Thread {Overridepublic void run() {for (int i 0;i<100;i){System.out.println(i);}} }package MyThreadPack;public class MyThreadDemo01 {public static void main(String[] args){MyThrea…

gpio 树莓派3a+_树莓派4上市:性能飙升起售价依然是35美元

旨在通过超实惠方式&#xff0c;鼓励孩子们投身编程事业的奇趣开发套件树莓派&#xff0c;在昨天迎来了Raspberry Pi 4正式开售的消息。新一代树莓派引入64位处理器、802.11ac双频Wi-Fi以及通过HAT的以太网供电(PoE)等新卖点。树莓派Raspberry Pi 4的处理能力是前一代的三倍、多…

入门级微单反性能对比

入门级相机筛选 先说挑选规则 由于微单体型小于单反&#xff0c;所以在机型选择上微单&#xff1e;单反&#xff1b;最好具备翻转屏和触摸屏&#xff1b;机身防抖不是刚需&#xff0c;但能解决小范围抖动情况下稳定问题&#xff1b;自动对焦很重要&#xff0c;眼控对焦是加分…

知识更新越来越快,但是学习起来越来越困

大家好&#xff0c;我是Z哥&#xff0c;先祝大家节日快乐。不知道这个假期你打算出门吗&#xff1f;Z哥我是打算不出远门了&#xff0c;怕死&#xff0c;哈哈。索性好好宅家里学习&#xff0c;强化一下自己。相信大家也感受到了&#xff0c;随着互联网加速了信息的流动速度&…