git revert后导致合并代码丢失
起因
我有一个开发分支antd3.x和一个主分支develop,我在合并antd3.x到develop的时候发现有些修改没有合并进来。
查找问题
然后就去网上查,发现这篇文章《git合并丢失代码问题分析与解决》给我了一些启发。
其中说到git merge的原理是三方合并,简单来说就是假设我有a和b两个分支,我要合并b到a,这个时候git 其实还会去找到a和b的最近的父节点c,将c作为基础的分支,然后对abc进行比较,如果有一个文件xxx.js,xxx.js的内容abc三个分支上同一行都不一样那么就会报conflict,因为git也不知道该保留谁的代码,就会让你自行决断;如果只有一个分支比如b上面的xxx.js的同一行代码和c分支上的不一样那么git就会自作主张的认为应该保留b上面的修改,看到这我就有了方向,我应该去找我此次合并的两个分支的那个最近的父节点,问题应该就出在他上面。
通过执行 git merge-base antd3.x develop 找到了他俩base节点2344a88,然后查看该节点的代码发现那些没有合并进来的修改已经存在于这个base节点上了,怪不得进行三方合并的时候没有合并进来,因为git发现develop分支上对比base分支没有这些修改,于是这些修改就被删除掉了。但是到这一步我又有疑问了,我没有手动的删除过develop上的这些修改,为啥这些修改会没有了呢,于是我查看log发现我曾经通过 git revert 撤销过一个合并,而这个合并恰巧就是那个修改的内容,到这块问题基本就清楚了,下面我总结一下。
总结
让我们从头捋一下这个问题的前因后果:
- 我有三个分支develop、antd3.x和std-08,其中antd3.x是根据develop拉取的,std-08是根据antd3.x拉取的
- 此时我想要合并antd3.x到develop分支上,执行代码 git merge --no-ff antd3.x
- 发现antd3.x上面的有些修改(x)没有合并到develop上
- 通过 git merge-base antd3.x develop 找到了他俩base节点2344a88
- 发现base节点上面存在修改x
- 通过 git log 发现develop分支上曾经执行过 git revert
- 本来当时是想把std-08合并到antd3.x上结果合并到了develop上,也就是此时修改x合并到了develop分支上
- 然后执行了 git revert 撤销了此次合并,并正确合并std-08到antd3.x上,这就导致了antd3.x和develop的共同父节点变成了std-08的最后一次提交2344a88
- 所以后续再想合并antd3.x到develop上时,进行三方合并,发现base节点上的修改在develop上面被删除了,所以合并的结果就是删除这些修改,但是实际上这些修改我们是想保留的
解决方案
解决方案有两个:
1.在develop上执行 git reset commitId 到合并std-08之前的那次提交然后 git push -f origin ,这样develop的commit历史就不包含那次合并了
2.在develop上执行 git revert HEAD~ 把之前revert的再revert掉,这个我没有试过
思考
其实这个教训充分暴露了我对 git revert 和 git reset 的区别不甚了解,可以看下这篇文章《git revert 用法》,对它俩的区别解释的很清楚,其实就是 git revert 的撤销原理就是删除掉之前的提交然后执行commit,这样所有的commits都会保留下来,也就埋下了隐患,在我的场景里就是在git 合并的时候寻找的base节点就是develop revert之前的那个commit,如果是 git reset 就不会保留这个commit,也就不会把它作为base节点,合并的时候就不会有问题。我看了下网上还有另一种解释就是执行完 git revert 后,git就认为你不在需要这些修改,以后再合并的时候如果有这样的修改要合并,git就会忽略,我没有验证过这种说法的真实性,如果有人清楚的话,还请不吝赐教。
git revert后导致合并代码丢失的更多相关文章
- git 分回滚后无法合并代码问题
git reset & git revert 区别: 1. git revert是用一次新的commit来回滚之前的commit,git reset是直接删除指定的commit. 2. 在回滚 ...
- 代码回滚:git reset、git checkout和git revert区别和联系
git reset.git checkout和git revert是你的Git工具箱中最有用的一些命令.它们都用来撤销代码仓库中的某些更改,而前两个命令不仅可以作用于提交,还可以作用于特定文件. 因为 ...
- git使用,多分支合并代码解决冲突,git删除远程分支,删除远程master默认分支方法
git使用,多分支合并代码解决冲突,git删除远程分支,删除远程master默认分支方法提交代码流程:1.先提交代码到自己分支上2.切换到devlop拉取代码合并到当前分支3.合并后有变动的推送到自己 ...
- 项目管理---git----快速使用git笔记(七)------coding.net项目管理多人操作的流程规范--合并代码审核
我们在前面已经介绍了coding.net和本地git的基本用法. 但是多人协作开发时情况会复杂得多,所以我们最好有一些规范来保证项目多人开发顺利进行. 比如说 规范一 master代码分支 需要开启 ...
- git 合并代码
分支 dev 及衍生分支 dev-ctj 一.rebase 1.git checkout dev-ctj 2.git rebase -i head~num[num 是本分支的提交数,多个提交数先合并为 ...
- eclipse git如何切换分支,拉取代码,合并代码,解决冲突等
(如果想看eclipse拉取git项目,移步到我上一篇文章)以下步骤是eclipse运用git的切换分支,拉取合并代码的基本操作: 1.切换远程分支:鼠标右键项目--team--switch to - ...
- git的几种实用操作(合并代码与暂存复原代码)
总述 git工具也用了很久,自己也写了几篇使用教程,今天继续给大家分享一些我工作中使用过的git操作. 1.git合并远程仓库的代码 2.git stash保存当前的修改 这两种情况大家应该都 ...
- git合并代码到主分支
git合并login分支到master分支 1.首先查看源码状态 git status 2.添加到暂存区 git add . git status //添加到暂存区后再次查看源码状态 3.提交代码到本 ...
- 合并代码操作 | git fetch 与 git pull
前言 首先我们要说简单说git的运行机制.git分为本地仓库和远程仓库,我们一般情况都是写完代码,commit到本地仓库(生成本地仓的commit ID,代表当前提交代码的版本号),然后push到远程 ...
随机推荐
- 部署WSUS服务(一)
引言:随着网络的发展,我们的生活也越来越离不开网络,但面临的安全威胁也越来越多.像去年爆发的针对Windows系统的勒索病毒(Wanna Cry)和年初爆发的Intel芯片漏洞告诉我们网络威胁时时刻刻 ...
- leetcode-78-子集(用bfs解决)
题目描述: 给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: nums = [1,2,3] 输出: [ [3], [1] ...
- luogu_1379 八数码难题
八数码-->BFS+set #include<iostream> #include<cstdlib> #include<cstdio> #include< ...
- linux常见编辑命令
保存命令 按ESC键 跳到命令模式,然后: :w 保存文件但不退出vi :w file 将修改另外保存到file中,不退出vi :w! 强制保存,不推出vi :wq 保存文件并退出vi :wq! 强制 ...
- FZU_1894 志愿者选拔 【单调队列】
1 题面 FZU1894 2 分析 单调队列的典型引用 需要注意的是在用维护辅助队列的时候,$L$和$R$的初始化都是0时,队列第一个数就是$L$,最后一个数就是$R-1$. 3 AC代码 #incl ...
- [转] 两个静态html页面传值方法的总结
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/csdn_ds/article/details/78393564 问题 因最近尝试实现客户端与服务端分 ...
- Cisco ASA 8.3前及8.3后版本Access-list 变化
8.2及之前 access-list:源地址是真实IP地址,目的地址是映射地址packet-tracer:源地址为真实IP地址,目的地址为映射地址 8.3及之后access-list:源地址和目的地址 ...
- e的理解
1. e是一个重要的常数,但是我一直不知道,它的真正含义是什么. 它不像π.大家都知道,π代表了圆的周长与直径之比3.14159,可是如果我问你,e代表了什么.你能回答吗? 维基百科说: " ...
- 谈谈数据库的ACID
一.事务 定义:所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位. 准备工作:为了说明事务的ACID原理,我们使用银行账户及资金管理的案例进行分析. // 创建 ...
- [中英对照]The sysfs Filesystem | sysfs文件系统
The sysfs Filesystem | sysfs文件系统 Abstract | 摘要 sysfs is a feature of the Linux 2.6 kernel that allow ...