Merge和Rebase概念概述

rebase 和 merge 相似,但又不完全相同,本质上都是用来合并分支的命令,区别如下

  1. merge合并分支会多出一条merge commit记录,而rebase不会
  2. merge的提交树是非线性的,会有分叉,而rebase的提交树是线性的(通过重写提交历史),它是一条直线;
  3. rebase可以将多个commit合并,而merge不支持这个功能
  4. merge合并操作很友好,因为它没有破坏性。现存的分支历史不会发生什么改变,而rebase提交是线性的,虽然便于理解提交历史,却需要付出两种代价:安全性和可追溯性;

1、分支描述

请考虑这个场景,当你开始在一个专有的feature分支开发新的功能时,另一位团队成员更新了main分支的内容。这将会造成一个分叉的提交历史,接下来,我们将用merge和rebase来合并分支,并解释它们之间的区别;

2、使用merge合并

最简单的方法就是把main分支合并到feature分支:

# 先切换到 feature 分支
git checkout feature
# 将main分支的内容合并到 feature 分支
git merge main

或者用下面这样的单行命令:

git merge feature main

这会在feature分支中创建一个合并提交,这次提交会连结两个分支的提交历史,在分支图示结构中看起来像下面这样:

合并操作很友好,因为它没有破坏性。现存的分支历史不会发生什么改变。只是新增了一个commit记录(绿色带*号的就是合并记录);

但是另一方面来说,这也意味着每当feature分支需要应用上游分支的更改时,都会在提交历史上增加一个无关的提交历史。如果main分支的更新非常活跃,这种操作也会对功能分支的提交历史产生相当程度的污染。虽然通过复杂的git log命令可以减轻这种提交历史的混乱现状,但仍然会让其他开发者对于提交历史感到费解。

3、使用rebase合并

为了替代merge操作,你也可以把feature分支的提交历史rebase到main分支的提交历史顶端:

# 先切换到 feature 分支
git checkout feature
# 将main分支的内容合并到 feature 分支
git rebase main

这些操作会把feature分支的起始历史放到main分支的最后一次提交之上,也达成了使用main分支中新代码的目的。但是,相对于merge操作中新建一个合并提交,rebase操作会通过为原始分支的每次提交创建全新的提交,从而重写原始分支的提交历史(绿色带*号部分就是被重写提交历史)。

使用rebase操作的最大好处在于你可以让项目提交历史变得非常干净整洁。首先,它消除了git merge操作所需创建的没有必要的合并提交。其次,正如上图所示,rebase会造就一个线性的项目提交历史——也就是说你可以从feature分支的顶部开始向下查找到分支的起始点,而不会碰到任何历史分叉。这在使用git log,git bisect以及gitk等命令时更简单。

不过为了获得这种便于理解的提交历史,却需要付出两种代价:安全性和可追溯性。如果不能遵循rebase的黄金法则,重写项目提交历史会为协作工作流程带来潜在的灾难性后果。再次,rebase操作丢失了合并提交能够提供的上下文信息——所以你就无法知道功能分支是什么时候应用了上游分支的变更。

可交互式rebase (将多个commit合并为一个)

可交互式rebase让你在把变更提交给其他分支之前有机会对提交记录进行修改。这甚至比自动rebase操作更强大,毕竟它提供了对于分支提交历史的完全掌控力。通常来说这一操作的使用场景在于合并功能分支到main分支之前,对于功能分支杂乱的提交记录进行整理。

进行可交互式rebase操作,需要向git rebase命令传递i选项参数

git checkout feature
git rebase -i main

执行以上命令会打开一个文本编辑器,其中内容为分支中需要移动的所有提交列表:

pick 33d5b7a Message for commit #1
pick 9480b3d Message for commit #2
pick 5c67e61 Message for commit #3

上面这样的列表正表示了分支被rebase之后其历史的长相。通过修改pick命令或者对提交历史进行重新排序,你可以让最终的提交历史变成任何你希望的样子。比如说,如果第二次提交修复了第一次提交的什么BUG,你可以使用fixup命令替代pick来把两次提交压缩在一起。

pick 33d5b7a Message for commit #1
fixup 9480b3d Message for commit #2
pick 5c67e61 Message for commit #3
指令说明
  • p,pick <提交>: 保留当前的提交内容。
  • r,reword <提交>: 保留当前的提交内容。,但修改提交说明
  • e,edit <提交>: 保留当前的提交内容,并允许你修改该提交的文件内容
  • s,squash <提交> : 将当前提交与前一个提交合并,并将它们合并为一个提交,允许你合并提交信息。
  • f,fixup <提交>: 与 squash 类似,但将当前提交合并到前一个提交中,并丢弃当前提交的提交信息。
  • x,exec <命令>: 执行 shell 命令,可以在 rebase 过程中执行自定义操作
  • b,break : 在当前提交之后创建一个新的提交点,将当前提交内容分成两个独立的提交。 (使用git rebase–continue’继续变基)
  • d,drop <提交>: 丢弃当前的提交内容,不保留该提交。
  • l,label

当你保存并关闭这个文件之后,Git会根据你的调改结果执行rebase操作,根据上面的例子项目历史会变成下图这样:

通过清除那些并不重要的提交历史可以让项目整体的历史更易读易懂。这一点是git merge操作所无法提供的。

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

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

相关文章

React中的合成事件解释和理解

什么是合成事件&#xff08;Synthetic event&#xff09;?它和原生事件有什么区别?解题思路:解释合成事件&#xff0c;然后对比原生事件&#xff0c;然后再说他的优势1.一致性 在 react里面&#xff0c;这个合成事件是非常重要的&#xff0c;因为它就是为了解决浏览器之间与事…

【Python系列】使用 memory_profiler 诊断 Flask 应用内存问题

博客目录一、内存分析的重要性二、memory_profiler 基础使用安装与基本配置理解分析报告三、在 Flask 应用中使用 memory_profiler装饰视图函数使用 mprof 进行长期监控四、高级内存分析技巧精确测量代码块内存定期内存采样结合 objgraph 分析对象引用五、常见内存问题及解决方…

vue3【组件封装】超级表单 S-form.vue

最终效果 代码实现 components/SUI/S-form.vue <script lang"ts" setup> import type { FormInstance } from "element-plus";// 使用索引签名定义对象类型 type GenericObject {[key: string]: any; };const props defineProps<{Model?: Gen…

Android Studio Memory Monitor内存分析核心指标详解

Depth、Native Size、Shallow Size、Retained Size 解析 一、指标定义与对比指标定义计算逻辑重要性Shallow Size对象自身实例占用的内存基本类型字段大小 引用指针 内存对齐对象的基础内存成本Retained Size回收该对象可释放的总内存量&#xff08;含所有依赖对象&#xff0…

vue中使用wavesurfer.js绘制波形图和频谱图(支持.pcm)

新的实现方式&#xff1a;vue使用Canvas绘制频谱图 安装wavesurfer.js npm install wavesurfer.js第一版&#xff1a; 组件特点&#xff1a; 一次性加载好所有的数据&#xff1b; <template><div class"audio-visualizer-container"><div class&…

go mod教程、go module

什么是go mod go mod 是go语言的包管理工具&#xff0c;类似java 的maven&#xff0c;go mod的出现可以告别goPath&#xff0c;使用go module来管理项目&#xff0c;有了go mod账号就不需要非得把项目放到gopath/src目录下了&#xff0c;你可以在磁盘的任何位置新建一个项目 go…

150-SWT-MCNN-BiGRU-Attention分类预测模型等!

150-SWT-MCNN-BiGRU-Attention分类预测模型!基于多尺度卷积神经网络(MCNN)双向长短期记忆网络(BiGRU)注意力机制(Attention)的分类预测模型&#xff0c;matlab代码&#xff0c;直接运行使用&#xff01;1、模型介绍&#xff1a;针对传统方法在噪声环境下诊断精度低的问题&#…

MySQL数据一致性与主从延迟深度解析:从内核机制到生产实践

在高并发分布式系统中&#xff0c;数据一致性与复制延迟如同硬币的两面。本文深入剖析MySQL持久化机制与主从同步原理&#xff0c;并提供可落地的调优方案。一、数据持久化核心机制&#xff1a;双日志协同 1. Redo Log&#xff1a;崩溃恢复的生命线刷新策略&#xff08;innodb_…

【I】题目解析

目录 单选题 多选题 判断题 单选题 1.reg[7:0]A; A2hFF;则A&#xff08;&#xff09; A.8b11111110 B.8b03 C.8b00000011 D.8b11111111 C 2hFF实际上等效于2位二进制2b11&#xff0c;赋值给8位寄存器A之后&#xff0c;低位赋值&#xff0c;高位补0 A8b00000011 AMD FPG…

《Foundation 面板:设计、功能与最佳实践解析》

《Foundation 面板:设计、功能与最佳实践解析》 引言 在当今数字化时代,用户界面(UI)设计的重要性不言而喻。其中,Foundation 面板作为一种流行的前端框架,因其灵活性和高效性而被众多开发者所青睐。本文将深入解析 Foundation 面板的设计理念、功能特点以及最佳实践,…

React服务端渲染 Next 使用详解

1. Next.js 概述 Next.js 是一个基于 React 的开源框架&#xff0c;专注于服务器端渲染&#xff08;SSR&#xff09;和静态站点生成&#xff08;SSG&#xff09;&#xff0c;提供开箱即用的 SSR 功能&#xff0c;简化 React 应用的开发与部署。 2. Next.js 的核心特性 SSR 支…

Deforum Stable Diffusion,轻松实现AI视频生成自由!

摘要&#xff1a; 你是否曾被那些充满想象力、画面流畅的AI视频所震撼&#xff1f;你是否也想亲手创造出属于自己的AI动画&#xff1f;本文将为你提供一份“保姆级”的详尽教程&#xff0c;从环境配置到参数调整&#xff0c;一步步带你复现强大的Deforum Stable Diffusion模型&…

不同环境安装配置redis

不同环境安装配置redis windows 环境安装redis redis所有下载地址 windows版本redis下载&#xff08;GitHub&#xff09;&#xff1a; https://github.com/tporadowski/redis/releases &#xff08;推荐使用&#xff09;https://github.com/MicrosoftArchive/redis/releases]官…

汇川Easy系列PLC算法系列(回溯法ST语言实现)

Easy系列PLC 3次多项式轨迹插补算法 Easy系列PLC 3次多项式轨迹插补算法(完整ST代码)_plc连续插补算法-CSDN博客文章浏览阅读122次。INbExecuteBOOLOFFOFF不保持1INrStartPosREAL0.0000000.000000不保持起始位置unit2INrEndPosREAL0.0000000.000000不保持结束位置unit3INrStar…

Linux C:构造数据类型

目录 一、结构体&#xff08;struct&#xff09; 1.1类型定义 1.2 结构体变量定义 1.3 结构体元素初始化 1.4 结构体成员访问 1.5 结构体的存储&#xff08;内存对齐&#xff09; 1.6 结构体传参 本文主要记录了C语言中构造数据类型部分的内容&#xff0c;今天暂时只写了…

Python:self

在Python面向对象编程中&#xff0c;self是一个指向类实例自身的引用参数&#xff1a;‌1. 本质与作用‌‌身份标识‌&#xff1a;self是类实例化后对象的"身份证"&#xff0c;代表当前实例本身&#xff0c;用于区分不同实例的属性和方法‌‌自动传递‌&#xff1a;调…

【SpringMVC】SpringMVC的概念、创建及相关配置

什么是SpringMVC 概述 中文翻译版&#xff1a;Servlet 栈的 Web 应用 Spring MVC是Spring Framework的一部分&#xff0c;是基于Java实现MVC的轻量级Web框架。 查看官方文档&#xff1a;https://docs.spring.io/spring/docs/5.2.0.RELEASE/spring-framework-reference/web.h…

浅谈存储过程

问题引入 面试的时候有时候会问到知不知道存储过程&#xff0c;用没用过&#xff1f; 是什么 存储过程&#xff08;Stored Procedure&#xff09;是在大型数据库系统中&#xff0c;一组为了完成特定功能的SQL 语句集&#xff0c;它存储在数据库中&#xff0c;一次编译后永久…

maven optional 功能详解

前言 最近参与了一个项目,使用maven管理依赖.项目拆分了很多模块.然后交个多个团队各自开发.最后在一个项目骨架中,把各自的模块引入进来,一起启动. 后来随着项目的深入.引入的jar包变多.发现 jar包太多,编译太慢, 打包之后的war包非常大.这种情况就可以使用optional来优化什么…

Python基础--Day04--流程控制语句

流程控制语句是计算机编程中用于控制程序执行流程的语句。它们允许根据条件来控制代码的执行顺序和逻辑&#xff0c;从而使程序能够根据不同的情况做出不同的决策。流程控制实现了更复杂和灵活的编程逻辑。 顺序语句 顺序语句是按照编写的顺序依次执行程序中的代码。代码会按照…