Git-优雅地解决冲突:使用ours和theirs
在实际的开发过程中,git冲突想必是很常见的事情,一些代码冲突可以通过进入文本编辑器,逐个手动解决冲突。但是对于rebase或者merge产生的冲突,涉及到很多文件,而且这类冲突一般是一道只保留一方的选择题。所以逐个手动解决这类冲突不太现实。
于是这今天这两位助手:--ours
和--theirs
。这两个命令适用于both added、both deleted、both modified等类型的冲突,通过这两个助手完整保留某一方的修改,而不用进入到文本编辑器逐行解决冲突。
在介绍两类助手之前,我们先回顾一下git rebase
,git merge
两类合并方式。
git merge 和 git rebase
假设在master主分支的基础上,有两个分支branch_a
和branch_b
,并在各自的分支上有一些提交,当前指向的分支为branch_a
,如图所示。
执行merge命令git merge branch_b
之后,分支的状态如下图所示。
执行rebase命令git rebase branch_b
之后,分支的状态如下。
git merge会抽取两个分支上新增的提交,并将其合并在一起,产生一个新的提交D,生成的D节点有两个父节点。其中在合并的过程中可能会发生冲突。
git rebase会以branch_a
为参照,提取branch_b
分支上的提交,将这些修改作用在branch_a
分支上,最终结果不会产生新的提交节点。其中在将提取的修改作用在branch_a
的过程中可能会发生冲突。
以我个人的经验,在开发过程中很少应用git merge
合并代码,更常用的是git rebase
。此外在开发过程中,经常使用git rebase
命令获取master主分支的最新提交代码,在完成个人的开发任务之后,也需要rebase master分支上的代码才能申请 Pull Request,自动合并。
使用ours与theirs解决冲突
在上述两种合并中,都可能会产生冲突,需要通过手动解决。如果想要保留两个分支中的某一个可以使用git chekout --ours <fileName>
或者git checkout --theirs <fileName>
,这里需要注意的是,一定要知道哪个分支对应ours
或theirs
。
直接说结论,对于merge
和rebase
来说,这两个选项对应的分支正好是相反的。以上述示例项目为例。在使用 merge 时,ours
指的是当前分支,即branch_a
,theirs
指的是要被合并的分支,即branch_b
。而在 rebase 的过程中,theirs
指的是当前分支,即branch_a
,ours
指向修改参考分支,即branch_b
。
这么容易混淆的概念记不住? 没关系,我个人还有另一个比较直观的办法,就是直接查看冲突文件中的冲突标记。在进入冲突状态后,git会将冲突的代码用<<<<<<< ======= >>>>>>>
标识出来,方便我们手动解决。在冲突标记中,=======
之前表示的是ours
分支,之后表示theirs
分支,只需要查看某一处冲突代码即可判断出要保留的分支。
<<<<<<<HEAD
<ours contents>
=======
<theirs contents>
>>>>>>>
冲突解决步骤
以git rebase
合并命令为例说明解决冲突的步骤。
$ git checkout --ours <fileName>
$ git add <fileName> //标记该冲突已解决
$ git rebase --continue
$ git status //查看当前冲突状态
- 使用
oers
或theirs
选择要保留一方的提交 - 标记冲突已解决
- 使用
--continue
继续执行rebase - 查看冲突状态
在解决冲突过程中,如果遇到某个提交记录不需要应用,可以用下面命令忽略:
git rebase --skip
使用--abort
命令可以取消本次rebase
git rebase --abort
Git-优雅地解决冲突:使用ours和theirs相关推荐
- 从0到1演示用 Git Rerere 自动解决冲突
前言 git rerere 功能是一个隐藏的功能. 正如它的名字 "reuse recorded resolution" 所指,它允许你让 Git 记住解决一个块冲突的方法,这样在 ...
- zbb20190109 git命令行解决冲突文件步骤
git命令行解决冲突文件步骤 方法一(推荐使用): git pull 出现冲突后丢弃本地冲突文件修改,采用远程文件覆盖本地文件 git checkout [文件路径] 例:git checkout ...
- git 主干修改合并到分支_idea+git合并分支解决冲突及详解步骤
Git分支详解参考: 分支管理组成 1.1.master主干 在版本管理中,代码库应该仅有一个主干.此主干是和当前生产保持一致的,是可用的.稳定的可直接发布的版本,不能再主干上进行任何开发操作.git ...
- git【--ours】及【--theirs】优雅的解决冲突
场景分析 在很多时候,我们在merge或者cherry-pick的时候,发生了冲突:然而对于某个冲突文件,我们需要全盘接收本地的代码或者全盘接收合并分支的代码:这个时候,如果我们在冲突文件一个个解决冲 ...
- git什么情况下会产生冲突以及如何优雅的解决冲突
制造冲突 在github上创建一个仓库. 在本地两个文件夹分别clone同一仓库.称之为仓库A,仓库B. 在仓库A修改文件,提交到远端. git add -A git commit -m " ...
- idea+git合并分支解决冲突及详解
1.什么是冲突 冲突是指当你在提交或者更新代码时被合并的文件与当前文件不一致.读起来有点绕,结合下面的案例理解. 从上面对冲突的定义来看,冲突时发生在同一个文件上的. 2.生产上冲突的场景 常见冲突的 ...
- sts配置maven及Git使用(解决冲突)
主要讲解四点: 1.物流项目整体分析(背景.业务场景.开发环境.技术) (了解) 2.STS(Spring Tool Suite).java开发工具.maven集成配置.Hbuilder页面开发 (掌 ...
- idea+git合并分支解决冲突及详解步骤
Git分支详解参考: https://blog.csdn.net/su1573/article/details/91988523 1. 切换分支 1)在idea页面右下角点击分支名 2)在git 分支 ...
- git bash、eclipse中git插件提交出现冲突以及解决办法
git bash提交到本地仓库后,执行git push origin时报错 error: failed to push some refs to 'https://github.com/XiangNo ...
- git(16)---解决冲突
(Git学习)解决冲突 人生不如意之事十之八九,合并分支往往也不是一帆风顺的. 准备新的feature1分支,继续我们的新分支开发: $ git checkout -b feature1 Switch ...
最新文章
- IBM中国研究院被曝已全面关闭
- 基于python的界面自动化测试-基于Python语言的自动化测试实战第二章(上)
- 我在学python-我在大学毕业后学习Linux、python的一些经验
- 不小心删除了某个包的一部分,重新安装方法
- sqlserver evaluation是什么版本_使用SSMS扫描和查找SQL Server数据库的潜在安全漏洞...
- hihocoder1051 补提交卡(贪心)
- 银联再发道歉声明;印度发布吃鸡禁令;甘肃全省校园禁售辣条;波音面临50亿罚款;女子撕扯民警头发罚两百;这就是今天的大新闻。...
- JAVA入门级教学之(逻辑(布尔)运算符)
- Win7电脑创建本地连接网络的操作方法
- c语言100块钱买100只鸡算法,JS计算输出100元钱买100只鸡问题的解决方法
- 软件工程导论 06章详细设计
- 一名靠谱的JavaScript程序员应备的素质
- 平衡二叉树——Balance Binary Sort Tree 设计与实现
- MVVM后,下一代开发模式在哪?
- 转:Maven通俗讲解
- @JsonView的简单使用
- java调用WebService接口工具
- 《光剑文集》春心沁透: 99首
- 【读书笔记】《我的奋斗》罗永浩
- 汇编指令: JO、JNO、JB、JNB、JE、JNE、JBE、JA、JS、JNS、JP、JNP、JL