git 回滚 add 操作_炫技!git 优雅回滚一次错误的合并操作!

点击蓝色小字关注! 关注一下你就不会有bug!合并操作

相对于常规的 commit,当使用 git merge 合并两个分支的时候,你会得到一个新的 merge commit。

当我们 git show 的时候会出现类似信息:

1commit 6dd0e2b9398ca8cd12bfd1faa1531d86dc41021a
2Merge: d24d3b4 11a7112
3Author: test 
4...............

Merge: d24d3b4 11a7112 这行表明了两个分支在合并时,所处的 parent 的版本线索。

比如在上述项目中我们开出了一个 dev 分支并做了一些操作,现在分支的样子变成了这样:

1init -> v1 -> v2 -> v3  (master)
2           \      
3            d1 -> d2  (dev)

当我们在 dev 开发的差不多了:

1#git:(dev)
2git checkout master 
3#git:(master)
4git merge dev

这个时候形成了一个 Merge Commit faulty merge:

1init -> v1 -> v2 -> v3 -- faulty merge  (master)
2           \            /
3            d1  -->  d2  (dev)

此时 faulty merge 有两个 parent 分别是 v3 和 d2。

回滚错误的合并

这个 merge 之后还继续在 dev 开发,另一波人也在从别的分支往 master 合并代码。变成这样:

1init -> v1 -> v2 -> v3 -- faulty merge -> v4 -> vc3 (master)
2        \  \            /                     /
3         \  d1  -->  d2  --> d3 --> d4  (dev)/
4          \                                 / 
5           c1  -->  c2 -------------------c3 (other)

这个时候你发现, 妹的,上次那个 merge 好像给共享分支 master 引入了一个 bug。这个 bug 导致团队其他同学跑不通测试,或者这是一个线上的 bug,如果不及时修复老板要骂街了。

这个时候第一想到的肯定是回滚代码,但怎么回滚呢。用 reset?不现实,因为太流氓不说,还会把别人的代码也干掉,所以只能用 revert。而 revert 它最初被设计出来就是干这个活的。

怎么操作呢?首先想到的是上面所说的 git revert ,但是貌似不太行。

1git revert faulty merge
2error: Commit faulty merge is a merge but no -m option was given.
3fatal: revert failed

这是因为试图撤销两个分支的合并的时候 Git 不知道要保留哪一个分支上的修改。所以我们需要告诉 git 我们保留那个分支 m 或者 mainline。

1git revert -m 1 faulty merge

-m 后面带的参数值可以是 1 或者 2,对应着 parent 的顺序。

上面列子:1 代表 v3,2 代表 d2。

所以该操作会保留 master 分支的修改,而撤销 dev 分支合并过来的修改。提交历史变为:

1init -> v1 -> v2 -> v3 -- faulty merge -> v4 -> vc3 -> rev3 (master)
2          \            /                     
3           d1  -->  d2  --> d3 --> d4  (dev)

此处 rev3 是一个常规 commit,其内容包含了之前在 faulty merge 撤销掉的 dev 合并过来的 commit 的(反操作)的合集。

到这个时候还没完,我们要记住,因为我们抛弃过之前 dev 合并过来的 commit,下次 dev 再往 master 合并,之前抛弃过的其实是不包含在里面的。那怎么办呢?

恢复之前的回滚

很简单,我们把之前 master 那个带有反操作的 commit 给撤销掉不就好了?

1git checkout master
2git revert rev3
3git merge dev

此时提交历史变成了:

1init -> v1 -> v2 -> v3 -- faulty merge -> v4 -> vc3 -> rev3 -> rev3` -> final merge (master)
2          \            /                                               /
3           d1  -->  d2  --> d3 --> d4  --------------------------------(dev)
你学会这个骚操作了吗?评论区见!
8d27b4e73f9517197ac227904fae2b0e.gif▼往期精彩回顾▼卧槽!Java 长整数的这个坑你踩过吗?唉,因为 Java 的装逼简化炫技写法背锅了!

b71d85d0eddf8bef3fe37131ea0d1753.png

3aca321f3fdf231b8adbdeb5c1fe3dda.png

b678f464698df4d4fae17f9a93f0b893.png点击左下角阅读原文查看历史经典技术问题汇总,看完顺手走一波PYQ呀~

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

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

相关文章

PS教程第十八课:放大缩小

导航器进行放大缩小操作

[Gamma阶段]展示博客

水哥牛X团队[Gamma阶段]展示博客 微信小程序搜索“小小易校园”即可体验 项目愿景 想参加竞赛,锻炼自己,却找不到合适的队友想进行实习,体验工作,每天不得不翻遍吐槽版的几百条信息却一无所获发布在吐槽版的“求组队”被聊天淹没&…

删除sessionstorage_localStorage 和 sessionStorage 介绍

一、 简述sessionStorage 和 sessionStorage 是 HTML5 新增的两个特性,这两个特性主要是用来作为会话存储和本地存储来使用的,解决了 cookie 存储空间不足的问题;sessionStorage 属性允许你访问一个 session Storage 对象,用于存储…

redis springmvc mysql_redis和mysql怎么一起在springmvc里面

展开全部一、mysql集成到springMVC中的方法:1、在SRC目录下创建一个32313133353236313431303231363533e4b893e5b19e31333361323538db-config.properties文件来存放我们的数据源配置信息:db.url jdbc:mysql:///springmvcdb?useUnicodetrue&character…

mysql安装了libaio还是报错_ubuntu安装mysql遇到的坑----解决Mysql报错缺少libaio.so.1

rootmaster:/usr/local/mysql# /usr/local/mysql/bin/mysqld --initialize --usermysql --datadir/usr/local/mysql/data --basedir/usr/local/mysql弹出一个错:/usr/local/mysql/bin/mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object f…

Notepad++连接VMWare中Linux只能看到/root目录

如下图,使用SFTP协议连接,用root用户登录后,我一开始只能看到root下的文件。稍作修改,把下面的“Initial remote directory”设置成“/”就可以看到根目录了。 转载于:https://www.cnblogs.com/bigbigbigo/p/11054876.html

创建没有Document的MFC MDI应用程序

程序源代码 效果,如图:1)创建一个MFC MDI应用程序,Wizard设置如图,然后点Finish2)CMyTreeView 在CMyTreeView中新增三个函数,显示些示例数据virtual BOOL PreCreateWindow(CREATESTRUCT& cs);//本例没有使用该函…

glassfish mysql 配置文件_最新glassfish配置mysql

在百度搜了一个下午,都没有搞定glassfish配置mysql,特别是百度文库中的GlassFish中MySQL连接池配置这篇文章,我不知道它是不是过时了,配一个jdbcConnPool就要写一个mysql.xml,那我要再配一个,岂不是再写一个mysql2.xml…

Apollo 无人驾驶平台中多传感器标定

传感器标定是无人车最基础也是最核心的模块之一。作为软件层提供的第一项服务,标定质量和准确度极大地影响着感知、定位地图、PNC 等模块。在 Apollo 开源自动驾驶平台中,我们提供了丰富的多传感器标定服务,如激光雷达、惯导、摄像头、多普勒…

mysql数据库的数据类型转换_MySQL 和Server 2000 数据库中数据类型的转换

问题阐述在某些特殊的时候,可能要将MySQL 数据库转换为SQL Server 2000 数据库,这时问题也就随之而来。例如,在MySQL 数据库中,创建的字段使用varchar 类型,该类型的数据可以进行聚合运算,其返回的值是stri…

【Silverlight】Bing Maps开发应用与技巧二:自定义图钉标注控件和动态ToolPanel

在Bing Maps Silverlight Control中以及为我们提供了地图图钉控件Pushpin,我曾经在《使用图钉层(Pushpin layer)及地图图层(MapLayer)》一文中介绍过他的使用方法,本篇主要介绍如何自定义图钉标注控件以及对…

java 创建线程的三种方法_java 创建线程的几种方式

说道线程,肯定会想到使用 java.lang.Thread.java这个类那么创建线程也主要有2种方式第一种方式:public class MyThread extends Thread {public void run() {System.out.println("这是MyThread线程");}}然后在调用处,执行start方法…

【iOS】从实际出发理解多线程(二)--NSThread基础操作

简介 NSthread是苹果官方提供面向对象操作线程的技术,简单方便,可以直接操作线程对象,不过需要自己控制线程的生命周期。在平时使用较少,常用的就是下面的方法来获取当前线程。 [NSThread currentThread] 使用 1.实例初始化、属性…

双绞线制作方法和标准

双绞线的制作方法: 标准568B:橙白--1,橙--2,绿白--3,蓝--4,蓝白--5,绿--6,棕白--7,棕--8 (如图2) 标准568A:绿白--1,绿--2&#xff0c…

深入理解Java枚举类型(enum)

理解枚举类型 枚举类型是Java 5中新增特性的一部分,它是一种特殊的数据类型,之所以特殊是因为它既是一种类(class)类型却又比类类型多了些特殊的约束,但是这些约束的存在也造就了枚举类型的简洁性、安全性以及便捷性。下面先来看看什么是枚举…

Flash/Flex学习笔记(47):反向运动学(上)

先回顾上篇所说的"正向运动学":以人行走的例子来说,基本上可以理解为大腿驱动小腿,小腿驱动脚,从而引发的一系列姿态调整和运动。再举一个例子,我们用着拿一根软鞭或链条的一端挥舞,被手挥舞的这…

java tomcat jms_JavaWeb之使用Tomcat、JNDI与ActiveMQ实现JMS消息通信服务

前言之所以使用JNDI 是出于通用性考虑,该例子使用JMS规范提供的通用接口,没有使用具体JMS提供者的接口,这样可以保证我们编写的程序适用于任何一种JMS实现(ActiveMQ、HornetQ等)。什么是JNDI:JNDI(Java Naming and Directory Inte…

你是第几名:Excel 中 Large 和 Small 的用法

类似于 SQL 语言中的 TOP X, Large 和Small 有2个参数 Large(Array,k) Array 可以为一个单元格区域,k 为第k各最大值,Small 与之对应返回第k个最小值。 注意:单元格区域中的非数字会被忽略掉。 例子如下: 可以类比Rank的用法&…