Git 仓库中 -- 代码冲突产生、定位、解决的流程

目录

  • 前置知识
  • [1 工具环境](#1 工具环境)
  • [2 冲突的产生](#2 冲突的产生)
    • [2.1 仓库中的源代码](#2.1 仓库中的源代码)
    • [2.2 人员 A 首先更改代码](#2.2 人员 A 首先更改代码)
    • [2.3 人员 B 更改代码,产生冲突](#2.3 人员 B 更改代码,产生冲突)
      • [2.3.1 第一次错误提示:](#2.3.1 第一次错误提示:)
      • [2.3.2 第二次错误提示:](#2.3.2 第二次错误提示:)
  • [3 查看冲突](#3 查看冲突)
  • [4 手动解决冲突](#4 手动解决冲突)
    • [4.1 方式一](#4.1 方式一)
    • [4.2 方式二(tortoisegit)](#4.2 方式二(tortoisegit))
  • [5 合并冲突后重新commit](#5 合并冲突后重新commit)
  • [6 合并冲突后重新 push](#6 合并冲突后重新 push)

前置知识

远程仓库: 是指存储在远程服务器上的Git仓库,如 github、gitee 中创建的仓库
本地仓库: 是指存储在开发者本地计算机上的Git仓库。开发者可以在本地仓库中进行代码修改,而这些变更只影响到本地仓库。开发者可以将本地仓库中的代码推送(Push)到远程仓库,也可以从远程仓库拉取(Pull)最新的代码到本地仓库。

1 工具环境

git + tortoisegit

2 冲突的产生

举例说明,在当前分支上,有一段代码是这样的

html 复制代码
<h2>金融领域情感分析系统</h2>

人员 A 开始开发,将代码修改为如下

html 复制代码
<h2>金融领域情感分析系统,第一次更改</h2>

并且将代码 push 到远程仓库

但是在 A 将代码 push 之前,人员 B 就开始开发,将代码修改为如下

html 复制代码
<h2>金融领域情感分析系统,第二次更改</h2>

A 人员 push 代码后,B 才开发完,准备提交代码,但由于 A B 都修改了同一行代码,就造成了代码冲突,无法 push 上去

下面 DEMO 记录了冲突产生、寻找、解决的完整流程

2.1 仓库中的源代码

源代码如下:

目前有两个人员 A、B 进行开发任务,基于当前代码 clone 到本地

2.2 人员 A 首先更改代码

A 将代码进行修改,并 push 代码至远程仓库

2.3 人员 B 更改代码,产生冲突

B 人员原本代码如下

为了模拟代码冲突,修改代码如下

然后 B 执行 commit,commit 是不会有错误的,如下图

commit 成功后,进行 push 操作,到这一步就会提示 error,如下图

2.3.1 第一次错误提示:

上图的的红色error,表明:这是由于远程库与本地库代码不一致造成的说通俗点,就是远程仓库存在一些新代码,你没有拉取 (pull),根据下面的提示也可以知道,我们需要进行 git pull 操作

接下来执行 git pull 命令, git pull 会拉取远程仓库的代码至本地,进行代码合并

2.3.2 第二次错误提示:

如下图,我执行了 git pull,希望将远程仓库的代码拉取同步,一般情况下,远程仓库的代码会自动合并到我的本地,但是!由于 A B 人员修改过同一行代码,必然会造成冲突 ,。git pull会提示错误:CONFLICT (冲突)

图中有两处信息提示值得我们注意:

  • 1 提示:CONFLICT (content): Merge conflict in src/components/myHeader.vue,表示该文件存在冲突
  • 2 提示:Automatic merge failed; fix conflicts and then commit the result.,表示需要我们自己手动解决冲突,然后再次进行 commit

说通俗点,就是由于 A B 人员修改过同一行代码,必然会造成冲突,需要我们自己手动解决冲突,也就是,我们手动对代码进行合并,将冲突的代码合并起来,再重新进行 commit push

3 查看冲突

下面我们来看看是哪些具体代码产生了冲突

此时我们打开文件夹,可以看到有冲突的文件会携带一个 黄色的警告标识

我们使用 VScode 打开,可以看到当前代码会使用如下符号,将代码分隔开

bash 复制代码
<<<<<<<<<HEAD
代码
==========
代码
>>>>>>>>>>

如下图所示:

这些 <<<<< >>>>> 符号表示什么意思?我将这里分为三个重要的部分

  • 1 黄色区域:为我们提供了一些快捷的解决冲突方式
    • 采用当前更改:代码会抛弃人员 A 的更改,仅保留人员 B 的更改,一般不会使用
    • 采用传入的更改:代码会抛弃人员 B 的更改,仅保留人员 A 的更改,一般不会使用
    • 保留双方更改:A 和 B 的更改都会被保留下来,一般不会使用
    • 比较变更:会打开一个界面,我们可以更清晰的看到代码变更
  • 2 红色区域:这里是人员 B 修改的代码,即本次提交作者改的代码
  • 3 绿色区域:这里是人员 A 修改的代码,即上一次提交作者改的代码

到此,我们就知道了哪里的代码产生了冲突

4 手动解决冲突

接下来,我们要手动,将冲突的代码合并起来

4.1 方式一

方式一是使用编辑器 vscode 进行修改,打开编辑器,如下图

上一节中,已经解释了 <<<<< 和 >>>>>> 分隔代码的含义

假设我们目前希望,A B的代码都保留,即保留所有文案:"第一次更改"和"第二次更改"和""按钮,我们只需要在编辑器中,将代码合并为我们希望的样子,并删除多余的内容,如下图所示

保存后,然后右键选择文件,点击 resolve,表示将冲突已经解决,文件的黄色警告就会消失

4.2 方式二(tortoisegit)

左上:人员 A 的修改

右上:人员 B 的修改

下面:我们需要手动处理合并,即我们希望怎么保留代码,将代码写在下面

其中,黄色表示该部分代码已被删除,我们要将保留的代码写在红色区域

如果我们希望,将人员A的修改,和人员B的修改都保留 ,那么可以在下面的区域,将文案"第一次更改""第二个更改"都添加上,即代码会被合并为这样

保存关闭窗口,右键选择文件,点击 resolve,表示将冲突已经解决,文件的黄色警告就会消失

5 合并冲突后重新commit

到这里,我们已经将冲突合并

我们需要重新进行 commit 和 push操作

此时,message 上自动会有文案如下图

表示当前 commit 的代码合并了冲突

点击 commit ,会出现弹窗,点击 ignore

6 合并冲突后重新 push

执行 git push,代码提交成功

进入 github 仓库中,查看代码,是我们手动合并后的效果

到此代码冲突的问题就解决好了

相关推荐
以对_几秒前
uview表单校验不生效问题
前端·uni-app
程序猿小D1 小时前
第二百六十七节 JPA教程 - JPA查询AND条件示例
java·开发语言·前端·数据库·windows·python·jpa
奔跑吧邓邓子1 小时前
npm包管理深度探索:从基础到进阶全面教程!
前端·npm·node.js
前端李易安2 小时前
ajax的原理,使用场景以及如何实现
前端·ajax·okhttp
汪子熙2 小时前
Angular 服务器端应用 ng-state tag 的作用介绍
前端·javascript·angular.js
Envyᥫᩣ2 小时前
《ASP.NET Web Forms 实现视频点赞功能的完整示例》
前端·asp.net·音视频·视频点赞
Мартин.6 小时前
[Meachines] [Easy] Sea WonderCMS-XSS-RCE+System Monitor 命令注入
前端·xss
昨天;明天。今天。8 小时前
案例-表白墙简单实现
前端·javascript·css
数云界8 小时前
如何在 DAX 中计算多个周期的移动平均线
java·服务器·前端
风清扬_jd8 小时前
Chromium 如何定义一个chrome.settingsPrivate接口给前端调用c++
前端·c++·chrome