前言

在开发过程中, 经常会遇到冲突。 下面我们分几点来讲述:

  • 什么是冲突?为什么会产生冲突?
  • 冲突的解决条件。
  • “以我的版本解决冲突 & 以他人版本解决冲突” 两者的区别

什么是冲突?冲突的产生原因?

什么是git push? 也就是代码提交操作?

我们都知道git是基于一棵树进行维护的. 想要将代码更新到远端结点. 必须满足如下几个条件:

  • 本地树版本与远端树版本一致
  • 更新基于远端的头部结点更新

光看文字可能有点抽象,我们用图像来描述这个步骤:

已知远端的版本为A-->B-->C. 本地的版本也为A-->B-->C. 但是本地有所更新,于是在C结点之上创建了结点D. 现在的操作步骤主要是2个步骤:

  1. 创建结点D,并推送到本地树内;
  2. D结点的操作推送到远端树。即本地树与远端树进行同步。

当更新成功后,远端的树结点应当为如下结构。

什么时候会出现冲突?冲突如何产生?

如果只有一个人进行开发。那么Git树必然是线性的。可就不会出现冲突的情况。
但是我们开发通常是多人开发。多人开发提交也就是冲突产生的起因。

我们先来想象有2个人进行开发的场景,一个叫张三,一个叫老王。

  1. 首先远端结点。老王和张三都拉取了最新的代码。

  2. 随后老王有了修改,并且同步到了远端。

  3. 但是,此时到张三并不知道这样到情况出现。他自己更新了版本F,也想提交到远端。

  4. 此时张三会更新失败!!!
    为什么?因为我们之前说的push的前置条件为1 本地树与远端树保持一致;2 并且在头结点进行更新. 我们来看下张三提交时候的树的情况:

    • 远端树 A--B--C--D--E
    • 老王树 A--B--C--D--E
    • 张三树 A--B--C--D--F

张三想把D--F这部分的内容同步到远端。如果更新成功那么远端树会变成A--B--C--D--F。那么老王的更新将会消失。所以是不可能这样设计的。

  1. 结果
    那么git树真实情况是如何设计的呢?
    其实这里也分2种情况: 操作同一文件,产生冲突 / 非操作同一文件,创建Merge结点

5.1. 我们先来说非操作同一结点的情况:


这里张三树主要做了2件事情:

  • 同步D--E这部分的结点。即将本地树同步与远端树一致。
  • 将F结点作为E结点之后。然后Push到远端。

注意: 这种自动提交到问题自然会出现一个问题。那么当操作同一文件的时候必然会产生冲突。也就是自动Merge操作失败的情况。这里我们需要回退本地结点,进行手动Merge。这里其实也分2种情况操作同一文件的同一行 / 操作同一文件的不同行。前者可以使用工具Merge ,后者需要手动Merge。


实战1 - 自动Merge (操作不同文件)

略。


实战2 - 手动Merge(操作同一文件的不同行 / 操作同一文件的同一行)

  • Version A
  • 网页更新Version B - 不同行操作 - 利用网页更新-模拟是有另外一个人更新的情况

  • 本地更新Version C


可以看到我本地A--C 而远端为A--B. 直接提交必然会导致异常.

hint: Updates were rejected because the tip of your current branch is behind 这个说的就是我们的本地版本滞后了。

  • 我们现在先使用git pull拉取一下。看看本地能否自动更新。
  • 出现冲突


出现冲突,我们现在有2个选项:

  • 以我的版本解决冲突;
  • 以他人版本解决冲突;
  • 手动修改文件

Quick Merge(以我的版本解决冲突 & 以他人版本解决冲突)

  • 我们先试试,以我的版本解决冲突

    生成一个空的Merge结点。

    可以看到,本地关于version.txt文件的修改消失了。


可以看到这时的我的版本,指的就是版本C。此时的Version.txt恰好是版本C.


  • 再试试,以他人版本解决冲突


可以看到。以他人版本解决冲突就是版本B. 即用远端版本覆盖本地版本更新.


  • 手动合并

    上方表示Version C也就是本地的版本。下方表示version B, 也就是远端版本.
    我们手动合并文件到我们希望到情况。


结论

什么时候会出现冲突?
答: 当项目有两个或两个以上的人操作。且更新同一个文件的时候会出现冲突。

冲突如何解决?
答: 冲突经常有3种解决方法:

  1. 以我的版本解决冲突。 即对于冲突的文件以本地缓存覆盖远端. 会导致远端修改丢失;
  2. 以他人版本解决冲突。即对于冲突的文件以远端缓存覆盖本地. 会导致本地修改丢失;
  3. 手动解决冲突。这也是我们经常推荐的解决冲突的方式。head >>>/ ===/>>>上方表示本地修改,下方表示远端修改。

其他:

  1. 冲突的产生一定是本地结点有滞后导致的。
    但是本地有时也有结点超前于远方。这就是难办的原因。
    为此, Git会自动创建一个合并结点来合并本地远方。你本地的提交其实这时就相当于一个临时分支

  2. 以他人版本解决/以我的版本解决
    由于我的版本滞后于远方。
    以我的版本解决。即用我的版本覆盖服务器版本
    以他人版本解决。即用服务器版本覆盖我本地版本。
    由此,可以看出都不太合适。都会出现某些覆盖导致异常的情况。所以,我们大多选择手动进行合并冲突。


Reference

[SourceTree - Git] 如何解决冲突 (以我的版本解决冲突以他人版本解决冲突)相关推荐

  1. SourceTree/git解决pre-commit hook failed的问题

    SourceTree/git解决pre-commit hook failed的问题 参考文章: (1)SourceTree/git解决pre-commit hook failed的问题 (2)http ...

  2. 【Git】SSL certificate problem: unable to get local issuer certificate错误的解决办法

    问题描述 unable to access 'https://*****.git/': SSL certificate problem: unable to get local issuer cert ...

  3. git head指向老版本_Git HEAD detached from XXX 解决

    Git 中的 HEAD 可以理解为一个指针,我们可以在命令行中输入 cat .git/HEAD 查看当前 HEAD 指向哪儿,一般它指向当前工作目录所在分支的最新提交. cat .git/HEAD r ...

  4. Git: remote: aborting due to possible repository corruption on the remote side. 的解决办法

    问题概述 关于这个问题,博主是在项目开发过程中遇到的,写完一个功能模块后,在拉取更新提交代码时异常, 报:" Git: remote: aborting due to possible re ...

  5. 使用git时ssh提示“Load key /home/devid/.ssh/id_rsa: bad permissions”的解决办法

    2019独角兽企业重金招聘Python工程师标准>>> 使用git时ssh提示"Load key "/home/devid/.ssh/id_rsa": ...

  6. git小技巧之分支、关联远程仓库、回滚、解决.gitignore不生效等

    1.分支管理 新建并切换分支:git checkout -b <name>新建本地分支并关联到远程分支git checkout -b myRelease origin/Release合并某 ...

  7. 优雅的解决uniapp 页面多个组件调用同一个生命周期时的冲突

    优雅的解决uniapp 页面多个组件调用同一个生命周期时的冲突 场景 当前有个页面,此页面有个 tabs,点击对应的 tabs 下面显示不同的模块,且每个模块都有上拉刷新的功能 <!-- pag ...

  8. 无法解决 equal to 运算中 “Chinese_PRC_CI_AI_KS_WS“ 和 “Chinese_PRC_CI_AS“ 之间的排序规则冲突

    在执行sql查询中遇到了如下错误: 无法解决 equal to 运算中 "Chinese_PRC_CI_AI_KS_WS" 和 "Chinese_PRC_CI_AS&qu ...

  9. Git中Your branch is ahead of ‘origin/master‘ by x commits的解决办法

    @[TOC]Git中Your branch is ahead of 'origin/master' by x commits的解决办法 问题描述:新的全局用户名下,修改原有本地库的代码,上传时遇见的问 ...

  10. maven依赖的jar包版本不一样_Maven依赖jar包冲突常见的解决方法

    项目中,经常会遇到ClassNotFound,NoSuchMethod异常,第一反应往往是类路径不对,jar没有正确的引用.第一步判断jar是否加载,还是 加载的jar由于maven依赖管理存在传递依 ...

最新文章

  1. oracle导出客户机使用us7a,导入 Oracle WORLD SAMPLE
  2. sql 插入新数据 如何处理等字符_条码打印软件之如何在条码数据插入字符而不被扫描...
  3. ElementUI 中日期选择器总结
  4. linux如何查看硬件驱动,linux查看硬件信息及驱动设备相关整理
  5. 在linux+nginx+mysql+php环境下安装 phpmyadmin
  6. java BigDecimal八种舍入模式
  7. 蓝桥杯真题训练 2019.3题
  8. jquery-1.10.2.min.map是什么,怎么用?
  9. 别再纠结线程池大小 + 线程数量了,没有固定公式的!
  10. oracle删除临时表空间语句,Oracle中临时表空间的清理
  11. 【重磅预告】揭秘阿里双11技术进步历程!
  12. IDEA Spring环境搭建+简单入门(图文教程)
  13. Java我的世界forge安装失败,我的世界forge安装失败install怎么办
  14. 《机关单位办公自动化应用指南 (基于国产信息技术应用创新终端)》
  15. 苹果客服说的「重置SMC、NVRAM、PRAM」都是干嘛的?
  16. Python爬取Google图片(2021.11.21编写)
  17. 阿里云视频云正式支持AV1编码格式 为视频编码服务降本提效
  18. ux设计_如何草绘UX文章
  19. php代码审计之bluecms
  20. 记录学习过程——SIMetrix如何放置光耦

热门文章

  1. Typora、Markdown 字体样式
  2. 怎么两边同时取ln_回归分析为什么要取LN值
  3. 中小学python教材电子版_【python爬虫】中小学人教版教材下载实践
  4. 如何构建高效可信的持续交付能力,华为云有绝活!
  5. win7查看计算机设置密码,如何查看win7电脑开机密码_win7专业版电脑开机密码怎么查看...
  6. seaweedFS基本使用
  7. 大气传输、大气辐射传输
  8. mic in和line in
  9. sow 项目范围说明书的区别
  10. 进行日常记账后,怎样导出表格