git 基础之 merge 和 rebase 的比较

在这里插入图片描述

在团队软件开发过程中,代码合并是一个基本且频繁执行的任务。

Git 提供了多种合并代码的策略,其中最常用的是 merge 和 rebase。

尽管二者的终极目标是相同的——整合代码变更——它们的方法和推荐的使用场景却有所区别。本文将详细介绍和比较这两种策略。

一、基于 merge 的合并介绍

1.1 如何使用

情景 1:

当你的代码处在分支 branch-a,而本地有另外一个分支 branch-b 的时候,使用

git merge branch-b

可以将 branch-b 分支的代码,merge 到当前所处的 branch-a 分支上。

情景 2:

当你的代码处在分支 branch-a,直接使用 git pull origin branch-b 拉取仓库中 branch-b 分支的最新代码时,默认情况下,git pull 命令执行的是 fetch 后跟 merge。也即:

git pull origin branch-b
# 等价于
git fetch origin branch-b  # 拉取远端 branch-b 的最新状态,此刻本地的 branch-b 依旧不是最新代码
git merge origin/branch-b  # 合并远端 branch-b 最新代码,此刻本地的 branch-b 依旧不是最新代码

最新版本的 git 会在项目首次 pull 时,让你设置默认的合并行为;这里说的默认选用 merge 是老版本的 git。

要全局设置 git pull 使用 merge,可以配置

git config --global pull.rebase false

下图是一个更加复杂的示例,branch-a 签出 branch-bbranch-c,按照时间顺序(图中由下到上)发生了如下事情

  1. branch-a 签出 branch-bbranch-c
  2. branch-b 提交了一次代码(节点 b1
  3. branch-c 提交了一次代码(节点 c1
  4. branch-b 提交了一次代码(节点 b2
  5. branch-c 提交了一次代码(节点 c2
  6. branch-c 被合并进了 branch-a(图中这种情况不会发生任何冲突,因为 branch-c 签出、提交、合并过程中,branch-a 并未发生代码改变)
  7. branch-b 提交了一次代码(节点 b3
  8. branch-b 被合并进了 branch-a(此时有可能发生冲突,因为 branch-bbranch-c 可能修改同一个位置的代码)
    在这里插入图片描述

1.2 合并方式

git merge 创建一个新的合并提交,它具有两个父提交,分别指向合并前两个分支的最新提交。

例如上面的例子中,branch-c 被合并进 branch-a

  • 节点 a2 就是新的合并提交
  • 节点 a1c2 就是 a2 的两个父提交

1.3 历史记录呈现形式

使用 merge 时,历史记录保持了分支形式,从而可以清晰地展示各个分支的合并点与路径。

例如上面的例子中,合并后即便删掉 branch-bbranch-c,提交历史也会保留,即: b1b2b3c1c2

1.4 冲突处理方式

如果合并时遇到冲突,Git 会停止合并过程,让用户一次性解决冲突,然后创建一个新的合并提交来完成合并过程。

二、基于 rebase 的合并介绍

2.1 如何使用

情景 1

当你的代码处在分支 branch-a,而本地有另外一个分支 branch-b 的时候,使用

git rebase branch-b

可以将 branch-b 分支的代码,merge 到当前所处的 branch-a 分支上。

git rebase 命令用于将一个分支的更改重新应用到另一个分支上。在分支上执行 git rebase 时,Git 将更改从一个分支上提取出来,然后在基底分支的头部重新应用它们。

情景 2

要使 git pull 默认执行 rebase 而不是 merge,可以通过 git config --global pull.rebase true 命令进行设置。

关于 rebase 的示例,要比 merge 的复杂一些,让我们先考虑如下情况

  1. branch-a 签出 branch-bbranch-c
  2. branch-b 提交了一次代码(节点 b1
  3. branch-c 提交了一次代码(节点 c1
  4. branch-b 提交了一次代码(节点 b2
  5. branch-c 提交了一次代码(节点 c2
    在这里插入图片描述

此时如果处于 branch-a 分支上,执行

git rebase branch-c

将得到如下的分支和提交结构

在这里插入图片描述
此时如果处于 branch-a 分支上,执行

git rebase branch-b

将得到如下的分支和提交结构
在这里插入图片描述
那么,为什么 branch-c 的操作早于 branch-b,但是整体操作完,b1b2 位于 c1c2 之前呢?

这是因为执行 git rebase branch-name 的时候,会找到当前分支和 branch-name 分支的共同祖先,然后把当前分支在最早公共祖先之后的提交,好像新的提交一样一个个提交到 branch-name 的最新代码之后。

在上面的例子中,branch-a 分支和 branch-b 的公共祖先是 a1,所以会以 branch-b 的最后一次提交(b2)作为基础,将 branch-aa1 之后的提交(c1c2)依次应用上去。

合并方式

rebase 通过提取分支上的更改,并将它们应用到目标分支的最新提交之后,从而使得项目历史线性化

在上面的例子中我们可以看到,使用 rebase 合并得到的提交记录不像使用 merge 合并得到的提交记录一样交错在一起,不容易拆分。

历史记录呈现形式

使用 rebase 会产生一个线性的历史记录,好像所有更改都是顺序发生的,使得项目历史看起来像是单线程进行的。

冲突处理方式

rebase 过程中的冲突必须按照每个提交顺序单独解决。解决每个冲突后,需使用 git rebase --continue 来继续 rebase 过程。

三、二者对比

适用场景比较

  • merge 适合于需要保持详细合并历史的公共分支,如主分支或发布分支。
  • rebase 更适合于个人开发分支,在合并到公共分支之前,保持历史记录的整洁和线性。
比较维度mergerebase
合并方式创建新的合并提交,有两个父提交提取提交在目标分支最新提交后重新应用
历史记录呈现形式分支式,能看到分支合并情况线性,看上去像所有提交在一条直线上
冲突处理方式一次性解决冲突后提交合并结果逐个解决每个提交的冲突,使用 git rebase --continue 继续
适合的公共分支场景多开发者频繁合并,要求完整历史记录需要线性历史记录,对美观度有要求
适合的个人分支场景无特殊要求,记录分支合并历史即可保持历史整洁和线性,便于审查

在实际开发中,团队可能会结合使用 merge 和 rebase 策略来充分利用它们的优势,例如在个人分支上使用 rebase 保持历史整洁,最后在合并到公共分支时使用 merge。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

sagemaker中使用pytorch框架的DLC训练和部署cifar图像分类任务

参考资料 https://github.com/aws/amazon-sagemaker-examples/blob/main/sagemaker-python-sdk/pytorch_cnn_cifar10/pytorch_local_mode_cifar10.ipynbhttps://sagemaker.readthedocs.io/en/stable/frameworks/pytorch/using_pytorch.html 获取训练数据 # s3://zhaojiew-sa…

jmeter常用配置元件介绍总结之配置元件

系列文章目录 1.windows、linux安装jmeter及设置中文显示 2.jmeter常用配置元件介绍总结之安装插件 3.jmeter常用配置元件介绍总结之线程组 4.jmeter常用配置元件介绍总结之函数助手 5.jmeter常用配置元件介绍总结之取样器 6.jmeter常用配置元件介绍总结之jsr223执行pytho…

vite+vue3+ts编译vue组件后,编译产物中d.ts文件为空

一、前言 使用vue3vitets实现一个UI组件库,为了生成类型文件便于其他项目引用该组件库。根据推荐使用了vite-plugin-dts插件进行ts文件的生成 二、版本 组件版本vue ^3.5.12 vite ^5.4.10 vite-plugin-dts ^4.3.0 typescript ~5.6.2 三、问题描述 使用vitevi…

红外相机和RGB相机外参标定 - 无需标定板方案

1. 动机 在之前的文章中红外相机和RGB相机标定:实现两种模态数据融合_红外相机标定-CSDN博客 ,介绍了如何利用标定板实现外参标定;但实测下来发现2个问题: (1)红外标定板尺寸问题,由于标定板小…

柔性仿人手指全覆盖磁皮肤,具备接触觉和运动觉的双模态感知能力

人体精细触觉和本体运动觉依赖于相同类型的感受器,这些感受器位于肌肉、肌腱、关节和皮肤中,负责感知轻触、挠痒、细微压力、形状变化、肌肉张力、肌腱拉伸和关节位置变化等信息。因此方斌教授团队着手于具有高精度、小尺寸、可定制等优势的磁触觉传感器…

【摘要】正点原子--Makefile--学习笔记

目录 一、Makefile 基础1、Makefile引入2、Makefile初次编写 二、Makefile语法1、Makefile规则格式2、Makefile第一次升级 一、Makefile 基础 1、Makefile引入 2、Makefile初次编写 二、Makefile语法 1、Makefile规则格式 2、Makefile第一次升级

【WPF】Prism学习(八)

Prism Dependency Injection 1.处理解析错误 1.1. 处理解析错误: 这个特性是在Prism 8中引入的,如果你的应用目标是早期版本,则不适用。 1.2. 异常发生的原因: 开发者可能会遇到多种原因导致的异常,常见的错误包括…

第8章硬件维护-8.2 可维护性和可靠性验收

8.2 可维护性和可靠性验收 可维护性和可靠性验收非常重要,硬件维护工程师在后端发现问题后,总结成可维护性和可靠性需求,在产品立项的时候与新特性一起进行需求分析,然后经过设计、开发和测试环节,在产品中落地。这些需…

Java 岗面试八股文及答案整理(2024最新版)

春招,秋招,社招,我们 Java 程序员的面试之路,是挺难的,过了 HR,还得被技术面,小刀在去各个厂面试的时候,经常是通宵睡不着觉,头发都脱了一大把,还好最终侥幸能…

sglang 部署Qwen2VL7B,大模型部署,速度测试,深度学习

sglang 项目github仓库: https://github.com/sgl-project/sglang 项目说明书: https://sgl-project.github.io/start/install.html 资讯: https://github.com/sgl-project/sgl-learning-materials?tabreadme-ov-file#the-first-sglang…

Debezium日常分享系列之:Debezium3版本Debezium connector for JDBC

Debezium日常分享系列之:Debezium3版本Debezium connector for JDBC 概述JDBC连接器的工作原理消费复杂的Debezium变更事件至少一次的传递多个任务数据和列类型映射主键处理删除模式幂等写入模式演化引用和大小写敏感性连接空闲超时数据类型映射部署Debezium JDBC连…

Java项目实战II基于微信小程序的科创微应用平台(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着科技的…

C++ Primer习题集----题目+答案版

具体源码请见:Cprimer习题上半部分资源-CSDN文库 目录 第一章 开始 练习1.1 编写程序,在标准输出上打印Hello.world 练习1.2 我们的程序使用加法运算符来将两个数相加。编写程序使用乘法运算符*,来打印两个数的积。 练习1.4 编译一个包…

Zookeeper的简单使用Centos环境下

目录 前言 一、ZOokeeper是什么? 二、安装Zookeeper 1.进入官网下载 2.解压到服务器 3.配置文件 三.使用Zookeeper 3.1启动相关指令 3.2其他指令 3.3ACL权限 总结 前言 记录下安装zookeeper的一次经历 一、ZOokeeper是什么? ZooKeeper是一…

【Linux】————多线程(概念及控制)

作者主页: 作者主页 本篇博客专栏:Linux 创作时间 :2024年11月19日 再谈地址空间: OS对内存进行管理不是根据字节为单位,以字节为单位效率过低,是以内存块为单位的,一个内存块的大小一般为4…

蓝桥杯每日真题 - 第17天

题目:(最大数字) 题目描述(13届 C&C B组D题) 题目分析: 操作规则: 1号操作:将数字加1(如果该数字为9,变为0)。 2号操作:将数字…

视频融合×室内定位×数字孪生

随着物联网技术的迅猛发展,室内定位与视频融合技术在各行各业中得到了广泛应用。不仅能够提供精确的位置信息,还能通过实时视频监控实现全方位数据的可视化。 与此同时,数字孪生等技术的兴起为智慧城市、智慧工厂等应用提供了强大支持&#…

SIMCom芯讯通A7680C在线升级:FTP升级成功;http升级腾讯云对象储存的文件失败;http升级私有服务器的文件成功

从事嵌入式单片机的工作算是符合我个人兴趣爱好的,当面对一个新的芯片我即想把芯片尽快搞懂完成项目赚钱,也想着能够把自己遇到的坑和注意事项记录下来,即方便自己后面查阅也可以分享给大家,这是一种冲动,但是这个或许并不是原厂希望的,尽管这样有可能会牺牲一些时间也有哪天原…

前端访问后端实现跨域

背景&#xff1a;前端在抖音里做了一个插件然后访问我们的后端。显然在抖音访问其他域名肯定会跨域。 解决办法&#xff1a; 1、使用比较简单的jsonp JSONP 优点&#xff1a;JSONP 是通过动态创建 <script> 标签的方式加载外部数据&#xff0c;属于跨域数据请求的一种…

网络安全-web架构-nginx配置

1. nginx访问&#xff1a; 访问的是index.html&#xff0c; 访问ip访问的资源就是在/usr/share/nginx/html中&#xff1b; 当nginx不认识&#xff0c;浏览器认识的话&#xff0c;浏览器会自动渲染。 当nginx认识&#xff0c;浏览器不认识的话&#xff0c;浏览器会把它加载成…