原创 | 我在git merge的时候遇到了冲突,怎么解决?
大家好,今天来和大家聊一个老生常谈的问题,我们在使用git merge的时候遇到了冲突,怎么办?
首先我们来看看为什么会冲突,git冲突的原因很简单,就是两个分支当中对同一处代码进行了不同的改动。于是git会困惑,不知道在merge的时候究竟应该怎么做,于是就会出现冲突。
实战
光说不练没有意义,让我们来实际操作一下。
我们首先创建一个一个test.txt文件,在其中写入一行test。git add并且git commit。
接着我们checkout -b创建一个新的分支,在这个分支当中我们把test.txt之前的一行改成get conflict。然后我们同样add commit。
最后,我们回到master分支,尝试merge test_conf分支。merge了之后,会看到这样的结果:
输出的log当中提示我们有两个文件出现了冲突,这个第八篇.md就是当前编辑的文章,由于我们一直实时在写,所以也会产生冲突。但是文章里的冲突看起来不方便,所以我们就不展示相关的冲突了。我们重点来看test.txt这个文件,也就是我们刚才创建的演示文件。
会发现原本我们test.txt只有一行,现在多出了好几行。这个是git在merge的时候处理冲突的方法,它把两边的冲突都保留了下来。用>>>>>>和=======以及<<<<<<<<这样的符号进行分隔,我们简单介绍一下其中的含义。
其实还是挺明显的,这个<<<<<<<< HEAD后面跟着的内容是HEAD指针指向的节点的代码,也就是我们当前所处的分支master分支当中冲突的代码,这些代码的内容一直到========结束。从=========开始一直到最后>>>>>>> test_conf是我们合并进来的分支的代码。
除了直接打开文件之外,我们还可以运行git diff命令来查看冲突。
解决冲突
手动解决
查看完了冲突之后当然是解决冲突,最简单的方法将去做手动合并。手动合并的方法很简单,就是我们选择我们要保留的代码,然后再把>>>>>, ======, <<<<<<这些提示行给去掉。最后重新add commit。
放弃合并
这样当然可以完成合并,但是显然并不友好,如果改动量小还行,如果改动量很大的话,那么显然是非常费劲的。如果你觉得改动量太大想要先放弃合并,先想想其他的办法,可以使用git merge --abort命令,这样可以让你的代码恢复到合并之前的状态。如果你运行了git merge之后又进行了一些人为的改动,那么在abort之后,也会被回滚掉。
git merge --abort
mergetool
除了手动合并以及放弃之外,我们还有一些其他的合并工具。比如git官方也开发了一个专门用来合并的工具,叫做git merge tool,它会将找到一份两个分支的祖先代码作为base也就是基准,然后再将两个分支的改动都列举出来作为对比,让我们在git编辑器当中决定要留下什么。
它打开大概是这样的,我个人只用过一次,因为觉得太难用了。
git mergetool
IDE工具
除了git官方之外,一般的IDE当中也都会提供merge的工具。比如vscode当中的git插件为我们提供了非常好用的merge功能,它会用不同的颜色高亮不同分支的代码。并且还提供了几个非常好用的功能。分别是保留当前分支的代码,保留合并分支的代码,以及保留两者和对比改动。
我们用vscode打开test.txt之后会看到:
当我点击compare changes之后,它就会把这两个文件排列在一起给我们观察它们各自的改动,不得不说是非常好用了。
当然其他的IDE当中也有类似的工具,我个人觉得有这些工具就足够了,git merge还有一些其他的参数用法,以及一些复杂的情况,我们先放放如果后面遇到再来分享。
今天的文章就到这里,衷心祝愿大家每天都有所收获。如果还喜欢今天的内容的话,请来一个三连支持吧~(点赞、在看、转发)
- END -
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 芯片探针到基因组区段坐标的映射
- CDH5升级到CDP7.1
- 底层架构真的折磨死个人(急,在线等)
- Python基础语法(五)—常用模块和模块的安装和导入
- Python计算文件或字符串的MD5/SHA
- .NETCore中实现ObjectId反解
- GSE16561数据集的文章图表复现,小众的illumina表达量芯片
- 数据挖掘课程能带给你什么收获
- AkShare-股票数据-龙虎榜-机构席位成交明细
- AkShare-股票数据-龙虎榜-机构席位追踪
- AkShare-股票数据-龙虎榜-营业上榜统计
- AkShare-股票数据-龙虎榜-个股上榜统计
- React中路由的使用
- CyanX 基于ReactHook的状态管理器,遵循函数式编程的理念,极简、可扩展设计哲学上手
- Serverless 架构下如何实现日志的实时输出?