Git分支开发中的问题

news2024/11/24 11:58:51

前言

我们在开发中,经常是很多人开发同一份代码,早期没有git工具的时候那可真是噩梦,要复制来复制去,不止繁琐,还容易出错,所以后来涌现了各种代码工具,Svn,Git等等,而Git是现在比较流行的

他支持多分支代码开发,可以多人同时进行,可谓是方便很多,但是,多分支开发同时也存在一个问题,那就是合并冲突问题,本篇文章重点在于说明多分支合并问题,而不是一篇关于如何介绍解决冲突的问题,下面就说一下存在的问题

注:如果对于分支不懂的可以参考我的另一篇文章:分支基本操作

多分支开发存在问题

比如你现在有一个git仓库代码,默认分支为master(真实环境中还有sit,qa,dev等,这里不讨论,为了方便说明只讨论master分支),如果只有一个人开发那是不会有任何问题,现在来看以下这么个问题:

master仓库中只有一个zxc.txt文件,内容如下

mulitDevelop为仓库名字,你会看到有一个.git的隐藏文件夹,假设现在有2个人需要对这个项目进行开发,如下:

开发者A ,他拉取了一个分支 develop-a 的分支

开发者B, 他拉取了一个分支 develop-b 的分支

现在,开发者A在zxc.txt文件中第三行添加内容,如下

接着,开发者在文件中添加内容,如下:

然后,这个时候master先把开发者a的内容合并过去,此时肯定是没问题的,命令如下

先切换到master分支 : git checkout master
然后把开发者a的代码进行合并: git merge develop-a

合并完master的文件内容如下:

可以看到master现在代码已经有了开发者a的内容了,这个时候还是正常操作,但是如果现在master要合并develop-b的代码那会怎样?没错,他就会产生冲突,因为zxc.txt文件中第三行出现了不一样的内容,git无法确定要使用谁的,这也是我们开发过程中经常会遇到的问题,执行的命令如下

先切换到master分支 : git checkout master
然后把开发者a的代码进行合并: git merge develop-b

执行后的内容如下:

这便是出现了冲突的问题,如果看不懂的这些标记的请自行寻找百度git冲突打的标记,现在问题就已经出来了,开发者a的代码先被合并到master,此时是正常的,开发者b的代码被合并到masterb的时候会产生冲突,如下所述,接下来我们就来说下这个问题解决至少有的方案

注:开发过程中合并的时候是合并远程的,如果有冲突在合并的时候操作端会有提示,然后我们再去解决,这里是为了方便,所以直接在本地让你看到了效果

至少有的解决方案

解决方案一

当提前发现有冲突的时候,我们可以站在develop-b的角度上先合并master的代码,然后自己解决再提交,如下是在develop-b的操作

然后进行解决冲突,解决后如下:

这个时候再回到master进行合并develop-b就不会冲突了,如下是master合并前后的代码

至此,解决方案一就完成了

注:可能有人会说,这不跟master合并develop-b代码一样吗,也确实,不过我上面就说了,真正的开发中可能是通过界面远程进行合并的,如果有冲突你是已经知道了,所以你可以这么操作

存在的问题

不知道你发现没有,这种方式其实是存在问题的,什么问题呢?就是develop-b的分支代码受到了污染,在刚开始从master创建develop-b分支的时候当时是没有develop-a的代码,也就是没有下面这个内容:hello i am develop-a

这让devleop-b分支的代码变得不纯正了,对于以后的后续操作可能会有问题,如果你能接受倒也没事,不能的话就需要其他的方式处理,还有这种操作可能会导致git分支走向图会有点奇怪,普通分支合并了master分支的代码等问题。。。。

解决方案二

为了解决上面的问题,一个简单的方式是直接站在master合并develop-b代码,然后解决就行,这样一来就不会污染了develop-b分支代码了,是不是很简单,但是有时可能由于其他问题,你没办法这么做,那你还能怎么做呢?就需要用其他的解决方案了,下面进行介绍

解决方案三(推荐)

rebase使用方法请参考: https://www.jianshu.com/p/a4478c97f1b7,一篇写的不错的

前面的操作逻辑都是一样的,关键还是回到master合并develop-b会冲突的那个步骤上,假设现在我们已经知道了master合并develop-b会冲突,执行以下的命令

git checkout master     ##切换到master分支
git pull orgin master   ##拉取远程master分支最新代码到本地

我上面的例子都是跟远程无关的,所以其实并没有这个步骤

git checkout develop-b # 切换到develop-b分支

git rebase -i master #然后这时候就会有冲突了,解决冲突之后往下执行。ps:我用的是 SourceTree,冲突文件会被标注出来,手动解决冲突就行
git rebase --continue #是两个横杠,中间无空格,横杠跟“ continue” 之间也无空格

作者:柴小斌
链接:https://www.jianshu.com/p/5ac65cc387fa
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

git rebase -i master rebase master的代码

然后进行解决,再提交,如下

然后再切换到master合并develop-b分支就行了

疑问

你一定会有的疑问用这种方式develop-b不是一样被污染了吗,有啥意义,其实不是的,用rebase只会合并有冲突的代码,merge是合并了全部代码,也就是说,如果代码没有冲突,那你在develop-b执行git rebase -i master的时候(确实还是会污染分支,只是让提交历史看起来好看点,我也是边写博客边验证才发现的,,,我的锅,如果没兴趣的可以不需要往下看了....),会展示如下:

现在develop-a添加的代码如下:

develop-b的代码如下:

由于分支develop-a核develop-b添加的内容在文件里并没有冲突,那么此时先合并develop-a再合并develop-b其实是不会有问题的,步骤还是一样的,我还是在master上合并develop-a的代码,如下

此时如果直接再合并develop-b,肯定也是没问题的,因为并不冲突,我这里就不试了,有空的可以试下,这里我主要是试一下此时如果在develop-b会发生啥:git rebase -i master , 如下:

可见,最终还是会污染代码,那么rebase有什么用呢,只是会让提交历史看起来正常点.....,中文称为变基,我也是边写博客边学习,看来rebase并不能解决分支污染的问题,,大意了了,那目前就只有第二种方式可以了,如果有其他方式我再补上来....

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

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

相关文章

一、mysql基础、MySQL的安装及卸载、DML、DQL

MySQL基础 1、数据库相关概念 以前我们做系统,数据持久化的存储采用的是文件存储。存储到文件中可以达到系统关闭数据不会丢失的效果,当然文件存储也有它的弊端。 假设在文件中存储以下的数据: 姓名 年龄 性别 住址 张三 23 男 北京西三…

干货|app自动化测试之Andriod WebView如何测试

Hybrid App(混合模式移动应用)是介于 Web-app、Native-app 之间的 app,本质上是 Native-app 中嵌入 WebView 组件,在 WebView 组件里可以访问 Web App。Hybrid App 在给用户良好交互体验的同时,还具备了 Web App 的跨平…

Python数学建模问题总结(2)数据可视化Cookbook指南【源自Google可视化团队】

今天跟大家分享一套谷歌数据可视化团队形成的全面的数据可视化指南,涵盖了设计原则、图表分类、图表的选用、样式设计、交互设计、仪表板设计等方面。一、可视化问题不论你是从事数据相关工作,还是业务相关工作,或多或少都会需要用到数据可视…

docker 部署maven服务器用于项目的部署和发布

书接上文 现状: 已经搭建好了maven远程服务器,并将自己的项目从自己的pc部署到maven远程服务器.假设了kie-server集群可以每个node都连接这个远程服务器 要做的: 1.创建kie-server集群的时候设置环境变量. 2.看是否能连上自己搭建的maven服务器.3.如果2 ok 把kie-server需要…

干货|app自动化测试之Appium 原理 与 JsonWP 协议分析

想要使用 Appium 进行测试,那么就一定要先了解Appium的原理。Appium 不仅能够实现移动端的 JSONWP,并且延伸到了 Selenium 的 JSONWP,它能够控制不同移动设备的行为,例如通过会话安装和卸载 APP。Appium 原理图中依赖关系解释&…

MySQL高级 【视图】

目录 1:视图 1.1:介绍 1.2:语法 1.3:检查选项 1.4:视图的更新 1.5:视图作用 1.6:案例 1:视图 1.1:介绍 视图(View)是一种虚拟存在的表。…

一文看懂什么是「低代码」!低代码真的能取代程序员吗?

早在数年前,亚马逊、微软、阿里、腾讯等国内外巨头公司就已纷纷入局“低代码”赛道,而很多人连低代码是什么,究竟有什么用都不太知道。 本文就从概念讲起,结合三个生动的行业案例,一文讲通“什么是低代码”。 文章有…

【强训】Day03

努力经营当下,直至未来明朗! 文章目录一、选择二、编程1. 字符串中找出连续最长的数字串2. 数组中出现次数超过一半的数字答案1. 选择2. 编程普通小孩也要热爱生活! 一、选择 以下代码运行输出的是() public class …

都2023了,为什么选择Nacos,这篇文章让你入门Nacos

👳我亲爱的各位大佬们好😘😘😘 ♨️本篇文章记录的为 Nacos入门 相关内容,适合在学Java的小白,帮助新手快速上手,也适合复习中,面试中的大佬🙉🙉🙉。 ♨️如果文章有什么…

传奇开服一条龙GEE引擎登录器配置教程

1、首先我们打开我们版本文件夹找到登录器文件夹进入找到GEE登录器配置器(MakeGameLogin.exe)打开2、接下来开始填写我们的主列表和备列表,这时候我们要自己创建一个列表,因为登录器自带的列表肯定是读取不了的,我们在…

Speckle核心概念【3D数据引擎】

本节将详细介绍你的3D数据如何发送到 Speckle 并存储在 Speckle 中。 无论你是 Speckle 的新手还是只是需要复习,这都是一个很好的起点! 1、关于Speckle术语 我们尽量使本指南简单明了,删除了技术语言,除非绝对必要。 值得注意的…

页面表格中每行前添加复选框,点击复选框导出本行数据(掉后端接口)

需求如下:html表格中,每行前面添加一个复选框,单机复选框下载/到处本行数据 思路: 页面: 页面首先要添加复选框,然后点击复选框,调用导出方法 同时获取到与它对应的数据库唯一id信息&#xf…

Seata 1.6.0 正式发布,大幅度提升存储性能

作者:Seata 社区 用户登记* * 欢迎已使用用户在此链接登记,便于我们更好的针对业务场景优化: https://github.com/seata/seata/issues/1246 发布概览* * 主要新增特性:支持 oracle 和 pgsql 多主键;支持 seata-ser…

芯片+步进电机档位控制实验

1、系统功能 目的:学习步进电机的控制。 使用设备:步进电机、两位共阴数码管、按键 功能:驱动步进电机以不同转速(4档)转动,并将当前档位用数码管显示 (1)按键 KEY1 作为启动和停止的切换按键;…

【Git】Git概述与安装

1、Git 概述 Git 是一个免费的、开源的分布式版本控制系统,可以快速高效地处理从小型到大型的各种项目。 Git 易于学习,占地面积小,性能极快。 它具有廉价的本地库,方便的暂存区域和多个工作流分支等特性。其性能优于 Subversio…

SwitchResX for Mac 屏幕分辨率修改工具

前言 SwitchResX V4.12.1 是Mac上一款功能强大的屏幕分辨率修改软件,可以为您提供控制显示器分辨率所需的所有工具。在switchresx帮助下,您可以管理无论是Mac Retina显示器,Cinema Displays还是电视机甚至投影仪的任何分辨率。而且switchres…

C语言-三子棋

文章目录三子棋一、问题描述二、基本流程在写三子棋的代码之前,我们来看看实现这个游戏的逻辑:三、步骤1. 菜单界面2. 创建棋盘3. 棋盘初始化4.打印棋盘(1)简陋棋盘:(2)自己打印棋盘:5.玩家落子6.电脑落子7.判断胜负1) 判定是否和…

CAPL学习之路-测试功能集函数(最终篇,其他的一些函数介绍)

TestSetEcuOffline 断开ECU与总线的连接 这个ecu是仿真ecu,不是真实ecu哦! testcase TCExample() {testSetEcuOffline(Engine); }void MainTest () {TCExample(); }Trace窗口: TestSetEcuOnline 将ECU连接到总线 testGetCurrentCycle 返回测试的当前周期 这里不管怎么试都返…

【目标检测】TOOD:Task-aligned One-stage Object Detection

TOOD:Task-aligned One-stage Object Detection 论文题目:《TOOD:Task-aligned One-stage Object Detection》——任务对齐的单阶段目标检测 论文地址: https://arxiv.org/abs/2108.07755 论文代码: https://github.com/fcjian/TOOD 1、前言…

优秀的 Verilog/FPGA开源项目介绍(三十六)-RISC-V(新增一)

关于RISC-V的二三事risc-v官网❝https://riscv.org/RISC-V(跟我读:“risk----------------five”)是一个基于精简指令集(RISC)原则的开源指令集架构(ISA)。这里要明确两个概念:指令集…