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 仓库中,查看代码,是我们手动合并后的效果

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

相关推荐
jerrywus2 分钟前
为什么每个程序员都应该试试 cmux:AI 加持的终端效率革命
前端·人工智能·claude
codeniu8 分钟前
@logicflow/vue-node-registry 在 Vite 中无法解析的踩坑记录与解决方案
前端·javascript
孟祥_成都15 分钟前
AI 术语满天飞?90% 的人只懂名词,不懂为什么!
前端·人工智能
Lupino41 分钟前
被 React “玩弄”的 24 小时:为了修一个不存在的 Bug,我给大模型送了顿火锅钱
前端·react.js
米丘1 小时前
了解 Javascript 模块化,更好地掌握 Vite 、Webpack、Rollup 等打包工具
前端
Heo1 小时前
深入 React19 Diff 算法
前端·javascript·面试
滕青山1 小时前
个人所得税计算器 在线工具核心JS实现
前端·javascript·vue.js
小怪点点1 小时前
手写promise
前端·promise
国思RDIF框架1 小时前
RDIFramework.NET Web 敏捷开发框架 V6.3 发布 (.NET8+、Framework 双引擎)
前端
Mintopia1 小时前
如何在有限的时间里,活出几倍的人生
前端