Git的merge和rebase你真的了解吗?

news2024/11/23 18:58:01

1. 前言

在我们的日常开发中,Git扮演着重要的角色,负责管理代码的版本。分支管理在开发过程中具有显著的影响。通常情况下,我们有生产、预发、测试和开发这几种分支。根据项目的不同阶段,我们会将代码提交到相应的版本上。标准的流程是先进行开发,然后进行测试,预发,最后上线到生产环境。然而,由于存在多个版本,有特定的上线顺序,并且我们的开发团队成员众多,因此,有效地管理项目的远程分支和每个开发人员的本地分支就变得至关重要。

在这里插入图片描述

在软件开发过程中,dev、test、uat和master这些版本阶段是常见的流程,它们分别代表了开发过程中的不同阶段。以下是每个阶段的详细解释:

  1. Dev(开发)版本:
    • 这个阶段通常由开发者进行。
    • 开发者在本地环境中进行代码编写和功能开发。
    • 代码可能尚未完成或存在一些bug。
    • 这个阶段的主要目的是完成新功能或修复已知问题。
  2. Test(测试)版本:
    • 一旦开发完成,代码会进入测试阶段。
    • 测试人员对dev版本进行详细的测试,确保软件的功能、性能和稳定性满足要求。
    • 在这个阶段,可能会发现一些新的bug或问题,需要进行修复。
    • 测试版本通常用于发现和修复问题,确保软件的质量。
  3. UAT(用户验收测试)版本:
    • UAT阶段是在软件开发接近完成时进行的。
    • 这个阶段通常由真实的用户或客户进行测试,以验证软件是否满足用户需求。
    • 用户验收测试的目的是确保软件在真实场景中能够正常工作,并满足用户期望。
    • 在这个阶段,用户可能会提出一些反馈和建议,以便进一步完善软件。
  4. Master(主)版本:
    • Master版本通常是软件的最终版本,代表软件发布前的状态。
    • 在这个阶段,所有的bug修复和功能改进都已经完成,并且通过了所有必要的测试。
    • Master版本用于最终的质量检查和准备发布。
    • 一旦软件达到Master版本状态,它就可以被发布给最终用户使用。

2. 普通开发流程

在正常的版本发布过程中,通常会经历dev、test、uat和master这四个阶段。按照以下流程进行操作是合理的:从master分支拉取版本,然后推送到相应的分支上进行发布。重要的是保持预发和生产环境的代码一致。然而,由于test分支上可能同时进行多个版本的并行开发,因此其代码可能与预发和生产环境有所不同。

在这里插入图片描述

3. 多版本并行开发

在存在多个版本并行开发的情况下,分支的管理会变得更加复杂。由于这些版本的上线时间节点各不相同,因此,test和uat阶段的时间节点也会有所差异。

这里涉及到多种情况

  1. 在后端开发人员较少的情况下,通常2-3人为例,完全可以从master拉取一个开发分支,分支格式以服务名+上线时间,例如xxx_20230130这个本地分支,后端开发人员一起在这个分支上进行并行开发,开发阶段将自己的本地分支merge到dev分支,因为只有2-3人所以冲突解决起来还好,有冲突解决冲突。
  2. 后端开发人员较多的情况,通常在5-8人为例,这时候从master分支拉取分支,分支格式就需要以服务名+姓名缩写+上线时间来命名,尽量每个人在自己命名的分支下进行开发,这样在开发阶段本地测试的时候,可以做到相互不影响,但是在merge到远程分支的时候,解决代码冲突的时候需要认真仔细一些,这种活还是交给心细的人来做吧,测试的时候也需要根据版本上线的优先级进行测试。
  3. 版本比较多的情况,比如一个月会有4-5个版本的开发,那么上线时间也是分4-5个节点,这样就需要每次从先发上线的远程分支,将代码merge到下个版本的本地开发分支上,以此类推。

在这里插入图片描述

4. Git merge

在我们的日常开发工作中,合并分支是一个频繁使用的Git命令。这个命令的主要作用是将一个版本中的最新代码合并到另一个较旧的版本,从而实现版本的同步更新。通过这种方式,我们可以确保各个分支的代码保持一致,并且避免出现分支间的冲突。

在这里插入图片描述

大体就是这么一个步骤,从刚开始的公共分支,变为master和feature分支, 通过git merge master 命令将master分支merge到feature分支。Merge命令会将前面featrue分支所有的commit提交全部合并为一个新的commit提交。这里只有会在产生冲突的时候,才能产生新的commit记录。

可以理解为git pull = git fetch +git merge,拉取最新的远程分支,然后将这个分支合并到另一个分支。

在公司开发中,合并分支命令受到大家的喜爱,因为它简单而直接。通过合并其他分支到自己的分支,开发者可以轻松地同步代码并保持团队的协作。这个命令易于理解和使用,为开发过程提供了高效和可靠的代码合并机制。

5. Git Rebase

作为自己的个人喜好,比较喜欢rebase这个命令,核心理念就是“变基”。

在这里插入图片描述

  1. 由上图可看见,通过reabse命令将feature分支延续到了master分支后面。
  2. 在多人开发过程中,如果其他人在master进行commit,这个时候你在feature分支提交了几个commit,这时候你使用rebase命令,会将你的commit提交记录放在master的commit记录的后面,而merge就会将不同分支的commit合并成一个新的commit记录,这就是merge和rebase的不同点。
  3. 本地feature分支和远端的master分支如果是同一条分支的话,可以使用rebase,保证commit的记录的清晰性,这个很关键!

**注意:**不要在公共分支使用rebase命令,这样会污染公共分支,这样公共分支就会存在你的commit记录,别人拉取的时候会存在你的最新的commit记录。

6. 总结

在软件开发中,我们不仅要关注代码质量,版本管理同样至关重要。上线前遗漏代码的问题时有发生,这样的失误可能是非常危险的。因此,希望本文能够为大家在日常代码版本管理中提供一些警惕,学会合理地合并分支。
码质量,版本管理同样至关重要。上线前遗漏代码的问题时有发生,这样的失误可能是非常危险的。因此,希望本文能够为大家在日常代码版本管理中提供一些警惕,学会合理地合并分支。

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

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

相关文章

OpenGL ES 实现图像腐蚀、膨胀、边缘检测

前文我们详细讲了图像锐化的基本原理,本文再介绍一下图像基本处理之腐蚀、膨胀和边缘检测,它们在图像处理和计算机视觉领域有着广泛的应用。 图像腐蚀(Image Erosion):用于缩小或消除图像中物体的边界。主要用于去除图像中的小细节、噪声或不规则物体。 实现图像腐蚀的片…

【Android 10】 BatteryController

学习了一下电池的相关模式,也就是它的观察者模式,先附上图 图应该挺清晰的,BatteryControllerImpl就是被观察者,BatteryControllerImpl重写了CallbackController的两个方法用于添加或移除观察者。 void addCallback(T listener);…

编码下的雪景:如何用HTML和JS让雪花在屏幕上舞动

这段时间,全国各地都加入了下雪的队伍当中,看着窗外漫天飞雪,想着我的网站上面也来一场雪吧。正琢磨着如何实现,网上突然蹦出来一段下雪的代码,这不正是我要的么?先来看看效果吧。 效果一 效果二 效果三 要…

7.Feign远程调用

2.Feign远程调用 先来看我们以前利用RestTemplate发起远程调用的代码: 存在下面的问题: •代码可读性差,编程体验不统一 •参数复杂URL难以维护 Feign是一个声明式的http客户端,官方地址:https://github.com/OpenF…

Modbus通信无法正确接收应答的问题处理

问题现象: 现场反馈,modbus网关无法正确读取就地设备的温度信息。使用PC连接就地设备可以正常读取。 问题调查: 拿到末端设备后,故障现象可重复,不过使用PC的USB转485适配器也无法正常读取数据。 如下图&#xff1…

不要为了学习而学习

经常有朋友问我: 老师,从您这里学了很多方法,也一直想要改变自己,但总是没办法坚持下去,怎么办? 这个问题,我也很无奈啊。毕竟我也没办法飞到你身边,手把手把每一步都教给你。&…

万字长文详解Java线程池面试题

王有志,一个分享硬核 Java 技术的互金摸鱼侠 加入 Java 人的提桶跑路群:共同富裕的Java人 今天是《面霸的自我修养》第 6 篇文章,我们一起来看看面试中会问到哪些关于线程池的问题吧。数据来源: 大部分来自于各机构(J…

编程入门:五个你必须知道的编程常识

常识1:编程不仅仅是写代码 当我们谈论编程时,大多数人首先想到的是写代码。这是正确的,但并不完整。编程不仅仅是写代码,而是解决问题的一种方式。编程是一种工具,我们使用它来创建能够解决特定问题的产品和服务。 比…

【日常聊聊】自然语言处理的发展

🍎个人博客:个人主页 🏆个人专栏: 日常聊聊 ⛳️ 功不唐捐,玉汝于成 目录 前言 正文 技术进步 应用场景 挑战与前景 伦理和社会影响 实践经验 结语 我的其他博客 前言 自然语言处理(NLP&#xf…

iLO 安装中文固件包

前言 安装中文版本的安装包,需要把对应的ilo安装到固定的版本上,ilo的版本是2.70。必须是这个版本; 如果不是这个版本就需要刷到对应的ilo版本 下载对应的固件包。 到这个界面选择文件,然后点击上载。 以上就是刷系统包的步骤。 …

物流实时数仓——概述与准备工作

目录 一、架构设计与技术栈 (一)数仓架构设计 (二)所用技术栈 (三)最终效果 二、关于离线与实时的相关概念 三、实时数仓设计思路 一、架构设计与技术栈 (一)数仓架构设计 (二)所用技术栈 Hadoop 3.3.4 Zookeeper 3.7.1 Kafka 3.3.1 Hbase 2.4.11 Redis 6.0.8 Flink 1.17…

Linux操作系统概念

绪论​: “心灵纯洁的人,生活充满甜蜜和喜悦。——列夫托尔斯泰”,本章的主要内容是介绍了硬件的组成结构冯诺依曼体系结构以及操作系统的概念和操作系统的作用,本章的内容主要是理论他起到承上启下的作用只有理解了操作系统的运行…

基于SpringBoot Vue宠物领养系统

大家好✌!我是Dwzun。很高兴你能来阅读我,我会陆续更新Java后端、前端、数据库、项目案例等相关知识点总结,还为大家分享优质的实战项目,本人在Java项目开发领域有多年的经验,陆续会更新更多优质的Java实战项目&#x…

了解面试必会算法Sliding Window 模式的前世今生

大家好,今天我们来聊一聊sliding window pattern。又是给有个机会给班花讲题的好机会,不能错过! Sliding Window Pattern,中文名字叫滑动窗口模式,是一种常见的算法思想。它可以用来解决很多问题,比如&am…

STATA DEA代码说明及样本数据

STATA_DEA代码说明及样本数据 含DEA模型代码和malmquist指数stata代码 包含具体说明 数据包络分析(Data envelopment analysis,DEA)是运筹学和研究经济生产边界的一种方法。该方法一般被用来测量一些决策部门的生产效率。 DEA是一个线性规…

苹果眼镜(Vision Pro)的开发者指南(5)-主要工具

主要工具有:Xcode、Reality Composer Pro、Unity 第一部分:【用Xcode进行开发】 开始使用Xcode为visionOS进行开发。将向你展示如何在你现有的项目中添加一个visionOS目标,或者构建一个全新的应用,在Xcode预览中创建原型,以及从Reality Composer Pro中导入内容。还将分享…

七八分钟快速用k8s部署springboot前后端分离项目

前置依赖 k8s集群,如果没有安装,请先安装 kubectl ,客户端部署需要依赖 应用镜像构建 应用镜像构建不用自己去执行,相关镜像已经推送到docker hub 仓库,如果要了解过程和细节,可以看一下,否…

从零学Java MySQL

MySQL 文章目录 MySQL初识数据库思考:1 什么是数据库?2 数据库管理系统 初识MySQLMySQL卸载MySQL安装1 配置环境变量2 MySQL目录结构及配置文件 连接MySQL数据库基本命令MySQL基本语法:1 查看MySQL服务器中所有数据库2 创建数据库3 查看数据库…

C++ 之LeetCode刷题记录(十六)

😄😊😆😃😄😊😆😃 开始cpp刷题之旅。 依旧是追求耗时0s的一天。 100. 相同的树 给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。 如果两个树在…

DophineScheduler通俗版

1.DophineScheduler的架构 ZooKeeper: AlertServer: UI: ApiServer: 一个租户下可以有多个用户;一个用户可以有多个项目一个项目可以有多个工作流定义,每个工作流定义只属于一个项目;一个租户可…