Git提交代码发生冲突的场景与解决方案

问题

当我们在使用 Git 向远程仓库提交代码时,可能会遇到如下所述的错误提示:

To https://github.com/xxxxx/gitmerge.git! [rejected]        master -> master (fetch first)
error: failed to push some refs to 'https://github.com/xxxxx/gitmerge.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

image-20230512095606622

这种情况出现的原因是当前本地分支的一些提交被其它开发者推送到了远程仓库,导致远程仓库的最新代码已经超过了当前本地分支的代码状态,因此在将本地代码推送到远程仓库时出现了冲突。此时需要手动合并远程仓库的最新代码并提交代码。

场景一

$ git pull

然后再 push 到远程仓库即可。

适用场景:冲突比较简单、容易解决,可以尝试使用 git pull 命令来合并最新代码,并进行必要的手动部分解决和合并操作。

举个例子:

我在 github 的远程仓库上创建了一个 README 文件,而我本地仓库中没有这个 README 文件,所以当我在本地没有这个 README 文件的基础之上在 push 的话,就会出现冲突。恰好我们又想在本地编辑一下 README 文件,这样其实可以直接使用git pull,因为冲突比较简单。

  1. 首先在 github 上创建一个远程仓库,并且在初始化仓库的时候选择不添加 README.md 文件,如果选择添加的话,github 会自动帮你创建一个分支。
  2. 然后在本地初始化一个仓库:
$ mkdir test_git_merge
$ cd test_git_merge
$ git init
$ echo "这是本地仓库" >> hello.txt
$ git add .
$ git commit -m "test"
$ git remote add origin https://github.com/<your_username>/<your_repo_name>.git
$ git push -u origin <your_branch>
  1. 在 github 上的远程仓库新建一个 README.md 文件,修改或添加一定的内容到 README.md 文件

image-20230513192539002

image-20230513192659775

  1. 此时我们在本地修改hello.txt, 然后尝试将其推送到远程
$ echo "修改本地仓库" >> hello.txt
$ git add .
$ git commit -m "test2"
$ git push

此时会出现文章开头时的错误, 我们直接使用以下命令:

$ git pull

我们会看到如下:

remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), 715 bytes | 102.00 KiB/s, done.
From https://github.com/xxxxx/testgitmerge2c6c00c..466227d  master     -> origin/master
Merge made by the 'ort' strategy.README.md | 3 +++1 file changed, 3 insertions(+)create mode 100644 README.md

此时我们会发现本地仓库中多了远程仓库中的 README.md 文件,然后我们执行:

$ git add .
$ git commit -m "test3"
$ git push

这次我们顺利的 push 了!

场景二

假设你在本地更新 hello.txt 文件,并将其推送到远程分支,并且在此期间,远程分支也发生了变化(如在 GitHub 上通过在线编辑在 hello.txt 文件中添加了一些内容)。此时你从远程分支 pull 代码将会产生冲突,需要手动解决冲突并进行代码合并。

以下是一个手动解决代码合并冲突的示例:

  1. 在远程分支上编辑了 hello.txt 文件,增加一个新行 “修改远程仓库”
这是本地仓库
修改本地仓库
修改远程仓库
  1. 推送远程修改

  2. 在本地编辑 hello.txt 文件,增加一个新行 “helloworld”

这是本地仓库
修改本地仓库
helloworld
  1. 提交并推送修改,将其应用到远程仓库
$ git add hello.txt
$ git commit -m "add helloworld to hello.txt"
$ git push

出现错误:

To https://github.com/xxxxx/testgitmerge.git! [rejected]        master -> master (fetch first)
error: failed to push some refs to 'https://github.com/Xxxxxx/testgitmerge.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
  1. 然后,本地分支尝试 pull 远程仓库的修改,这时候 Git 将会自动合并尝试。发现 hello.txt 文件存在冲突,如下所示(原因是同一行中的内容不同):
Auto-merging hello.txt
CONFLICT (content): Merge conflict in hello.txt
Automatic merge failed; fix conflicts and then commit the result.
  1. 打开 hello.txt. 文件,可以看到冲突的内容:
这是本地仓库
修改本地仓库
<<<<<<< HEAD
helloworld
=======
修改远程仓库
>>>>>>> 6963a862d66fed43ccd87dad21b0dae8b7105c0b

在这个示例中,Git 将本地和远程更改放在两个不同的区块中,中间分隔符 <<<<<<< HEAD======= 标记着来自两个源的冲突,本地更改在上方,远程更改在下方,之后远程更改的 ID 用 >>>>>>> 标识出来。

  1. 然后,可以手动审查并解决冲突,如删除一个 区块来保留所需代码,或使用编辑器等工具进行更高级的合并操作。在这种情况下,我们可以手动将两个内容合并到一起(删除对应的分隔符即可):
这是本地仓库
修改本地仓库
helloworld
修改远程仓库
  1. 手动解决后,使用 git add 命令添加文件。
$ git add hello.txt
  1. 最后,使用 git commit 命令提交更改,git push 推送到远程仓库即可。
$ git commit -m "Merge the hello.txt from remote and local"
$ git push origin master

通过以上步骤,你已经手动解决了冲突并合并了代码。需要注意的是,在手动解决代码冲突时,要进行谨慎操作,确保代码的质量和准确性。

场景三

多个开发者分别在不同的分支上修改同一个文件,然后尝试合并分支,由于分支之间的代码修改冲突,导致合并失败。

  1. 在 GitHub 上创建一个新的空仓库。

  2. 将该仓库克隆到本地,并在本地仓库上创建一个新分支。

$ git clone https://github.com/<your_github_username>/<your_repo>.git
$ cd <your_repo>
$ git checkout -b test
  1. 修改并提交文件,将本地分支 push 到远程仓库。
# 编辑文件
$ echo "line1" >> test.md
echo "line2" >> test.md# 添加修改后的文件
$ git add test.md# 提交修改
$ git commit -m "Add line1 and line2"# 向远程仓库推送本地分支
$ git push origin test
  1. 切换到另一个本地分支,并修改相同文件中的相同行代码。
# 切换到另一个分支
$ git checkout -b another_branch# 编辑 test.md
$ sed -i '' 's/line1/line11/' test.md# 添加修改后的文件
$ git add test.md# 提交修改
$ git commit -m "Change line1 to line11"
  1. 此时尝试使用 git pull 命令将远程分支的修改拉取到本地分支进行合并,即可触发合并冲突。例如,执行以下命令:
# 从远程仓库拉取最新的代码
$ git fetch origin# 在当前分支上将远程分支合并到本地分支
$ git merge origin/test

此时,由于两个分支都修改了 test.md 文件的同一行代码,Git 将无法自动合并这两个本地分支,会提示冲突,并让你解决这些冲突。你需要手动解决这些冲突,合并文件中的代码,然后提交更改并完成该操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/604339.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jax.random.PRNGKey创建伪随机数生成器密钥

jax.random.PRNGKey 是 JAX 库中用于创建伪随机数生成器密钥&#xff08;PRNG key&#xff09;的函数。 PRNG key 是 JAX 中用于生成伪随机数序列的关键要素&#xff0c;通过分割&#xff08;splitting&#xff09;可以生成新的 PRNG key&#xff0c;确保生成的随机数序列是不相…

操作系统丨单元测试

文章目录 单元测试选择题填空题单元测试 选择题 【单选题】可以实现虚拟存储器的方案是(D)。 A. 固定分区方式 B. 可变分区方式 C. 纯分页方式 D. 请求页式 【单选题】文件系统中文件存储空间的分配是以(D)为基本单位进行的。 A. 字 B. 字节 C. 文件 D. 块 【单选题】哪种…

Vue2:脚手架Vue-CLI的使用

一、环境准备 vue脚手架&#xff08;vue-CLI&#xff09;的使用是基于nodejs环境下的。 你可以简单理解为&#xff0c;Java项目需要再jvm虚拟机上才能编译运行 nodejs的作用就是将vue文件编译成html、css、js代码文件。 如何安装nodejs 参考&#xff1a;https://blog.csdn.net…

ARMv8-AArch64 的异常处理模型详解之异常等级、执行状态以及安全状态

ARMv8-AArch64 的异常处理模型详解 一&#xff0c;特权和异常等级1.1 异常等级 Exception levels 二&#xff0c;特权的类型2.1 内存特权2.2 访问寄存器的特权 三&#xff0c;执行状态和安全状态3.1 执行状态 Execution states3.2 执行状态切换 3.3 安全状态 Security states3.…

第16课 播放rtsp流

在现实生活中有许多rtsp摄像头&#xff0c;这些摄像头如果能充分利用起来可以生成很多有趣、有用的应用&#xff1a;比如户外互动大屏等。在第4课&#xff0c;我们实现了一个播放器&#xff0c;当时来用它播放rtmp流和mp4时它好象工作的很好。这节课我们就用它来播放rtsp流试试…

二进制介绍

十进制转相应进制 (十进制)231 转 八进制 除八取余法 从下而上取余 231/828 ....7 28/83.......4 3/80........3 (十进制)231(八进制)0o347 (十进制)231 转 16进制 除十六取余法 从下而上取余 231/1614......7 14/160..........14 (十进制) 231(十六进制)0xe7 (十进制)231.3 转…

[EFI]Thinkpad L380 Yoga电脑 Hackintosh 黑苹果efi引导文件

硬件型号驱动情况主板 Thinkpad L380 Yoga 处理器 1.7 GHz Intel Core i5-8250U Quad-Core 已驱动内存16GB DDR 4 2400mhz已驱动硬盘m.2 nvme 256gb Kingston NV2已驱动显卡Integrated Intel UHD Graphics 620已驱动声卡暂无详细信息已驱动网卡以太网控制器 i225-LM已驱动无线网…

C++动态内存分配(动态内存分配函数)栈区

内存拷贝函数&#xff1a; void *memcpy(void *dest,const void *src,size_tn);#include<string.h>功能&#xff1a;从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest内存地址的起始位置 分配内存使用new 例如&#xff1a;salarynew int[num]; 最后需要释放…

Linux文件操作命令(touch、cat、more、cp、mv、rm)

之前我们学习了对目录&#xff08;即文件夹的操作&#xff0c;那么现在我们来一起看一下怎么操作文件吧&#xff09; 1.touch命令 功能&#xff1a;创建文件 语法&#xff1a;touch 参数 参数&#xff1a;被创建的文件路径 注意&#xff1a;touch命令无选项&#xff0c;参…

(二)C++新手入门必知

C只是一门语言 通常说的学习C仅仅是学习C这门语言本身&#xff0c;网上有很多的教程&#xff0c;也有很多的书籍都是在介绍C语言&#xff0c;C语法以及一些使用C实现的算法。C 语法应该是现在高级语言中最复杂的&#xff0c;特别是C11 之后加入了很多的新特性。其他的高级语言…

【Docker-Dev】Mac M2 搭建docker的redis环境

Redis的dev环境docker搭建 1、前言2、官方文档重点信息提取2.1、创建redis实例2.2、使用自己的redis.conf文件。 3、单机版redis搭建4、redis集群版4.1、一些验证4.2、一些问题 结语 1、前言 本文主要针对M2下&#xff0c;相应进行开发环境搭建&#xff0c;然后做一个文档记录…

面试算法88:爬楼梯的最少成本

题目 一个数组cost的所有数字都是正数&#xff0c;它的第i个数字表示在一个楼梯的第i级台阶往上爬的成本&#xff0c;在支付了成本cost[i]之后可以从第i级台阶往上爬1级或2级。假设台阶至少有2级&#xff0c;既可以从第0级台阶出发&#xff0c;也可以从第1级台阶出发&#xff…

C++ 具名要求-全库范围的概念

此页面中列出的具名要求&#xff0c;是 C 标准的规范性文本中使用的具名要求&#xff0c;用于定义标准库的期待。 某些具名要求在 C20 中正在以概念语言特性进行形式化。在那之前&#xff0c;确保以满足这些要求的模板实参实例化标准库模板是程序员的重担。若不这么做&#xf…

window使用cpolar实现内网穿透

文章目录 cpolar下载和安装启动和配置cpolar卸载 cpolar下载和安装 进入spolar官网&#xff0c;完成注册&#xff0c;下载相应的cploar版本解压和运行安装文件 配置安装路径&#xff0c;然后选择next&#xff0c;完成即可 启动和配置 点击首页的快捷图标打开网页&#xf…

【LeetCode】1158. 市场分析 I

表&#xff1a; Users ------------------------- | Column Name | Type | ------------------------- | user_id | int | | join_date | date | | favorite_brand | varchar | ------------------------- user_id 是此表主键&#xff08;具有唯一值…

Defi安全-Monox攻击事件Foundry复现

其它相关内容可见个人主页 Mono攻击事件的介绍见&#xff1a;Defi安全–Monox攻击事件分析–phalconetherscan 1. 前情提要和思路介绍 Monox使用单边池模型&#xff0c;创建的是代币-vCash交易对&#xff0c;添加流动性时&#xff0c;只需添加代币&#xff0c;即可进行任意代…

Jmeter相关概念

Jmeter相关概念 jmeter性能指标 Aggregate Report 是 JMeter 常用的一个 Listener&#xff0c;中文被翻译为“聚合报告”。今天再次有同行问到这个报告中的各项数据表示什么意思&#xff0c;顺便在这里公布一下&#xff0c;以备大家查阅。 如果大家都是做Web应用的性能测试&a…

八、Vue3组件库经验[Ant Design]

一、Ant Design 地址&#xff1a;https://2x.antdv.com/components/overview-cn/ 1.DatePicker 日期选择框 问题1&#xff1a;当将时间加载到DatePicker 日期选择时&#xff0c;用出现bug卡住&#xff0c;并报错 原因&#xff1a;DatePicker 需要的dayjs处理后的数据格式 …

C语言中关于函数调用的理解

理论 关于函数调用的方式有两类&#xff1a;传值调用和传址调用 传值调用&#xff1a;函数的形参和实参分别占有不同的内存块&#xff0c;对形参的修改不会影响实参。 传址调用&#xff1a;把函数外部创建变量的内存地址传递给函数参数的一种调用方式。可以让函数和函数外面…

每周一算法:倍增法求区间最大最小值(RMQ)

RMQ RMQ 是英文 Range Maximum/Minimum Query 的缩写&#xff0c;表示区间最大&#xff08;最小&#xff09;值。使用倍增思想解决 RMQ 问题的方法是 ST 表&#xff08;Sparse Table&#xff0c; 稀疏表 &#xff09;。ST 表是用于解决 可重复贡献问题 的数据结构。 可重复贡献…