#Git 变基(Rebase)案例

适合学习理解的 Git 变基(Rebase)案例

为了帮助你更好地理解 Git 变基(Rebase)的操作和效果,下面通过一个简单的案例来演示变基的过程和影响。


案例背景

假设我们有一个 Git 仓库,包含两个分支:

  • 主分支(main):包含最新的稳定代码。
  • 特性分支(feature):开发新功能的分支,从 main 分支的某个旧提交创建。
初始提交历史
A --- B --- C --- D  (main)\E --- F --- G  (feature)
  • A、B、C、Dmain 分支的提交。
  • E、F、Gfeature 分支的提交,基于 main 分支的提交 B
场景

feature 分支开发期间,main 分支有了新的提交 CD。现在,我们希望将 feature 分支的变更应用到 main 分支的最新提交 D 之后,使提交历史更加线性。


变基操作步骤

1. 切换到 feature 分支
git checkout feature
2. 执行变基操作
git rebase main
3. Git 的操作过程
  • 找到共同祖先:Git 找到 feature 分支和 main 分支的共同祖先提交 B
  • 应用提交:将 feature 分支上的每个提交(EFG)依次应用到 main 分支的最新提交 D 之后。
  • 解决冲突(如果有):如果在应用提交时遇到冲突,需要手动解决冲突后继续变基。
4. 变基完成后的提交历史
A --- B --- C --- D  (main)\E' --- F' --- G'  (feature)
  • E’、F’、G’:变基后的新提交,基于 main 分支的最新提交 D
  • 原提交 E、F、G:被新提交 E’、F’、G’ 替代,提交哈希值发生变化。

详细步骤演示

步骤 1:创建初始提交历史
# 初始化仓库
git init# 创建 main 分支并提交
git checkout -b main
echo "Initial commit" > file.txt
git add file.txt
git commit -m "A"echo "Second commit" >> file.txt
git add file.txt
git commit -m "B"echo "Third commit" >> file.txt
git add file.txt
git commit -m "C"echo "Fourth commit" >> file.txt
git add file.txt
git commit -m "D"# 创建 feature 分支并提交
git checkout -b feature HEAD~3  # 基于提交 B 创建分支
echo "Feature commit 1" >> file.txt
git add file.txt
git commit -m "E"echo "Feature commit 2" >> file.txt
git add file.txt
git commit -m "F"echo "Feature commit 3" >> file.txt
git add file.txt
git commit -m "G"
步骤 2:执行变基操作
# 切换到 feature 分支
git checkout feature# 变基到 main 分支
git rebase main
步骤 3:查看变基后的提交历史
# 查看提交历史
git log --oneline --graph --all

输出示例:

* 1234567 (HEAD -> feature) G' - Feature commit 3
* 2345678 F' - Feature commit 2
* 3456789 E' - Feature commit 1
* 4567890 (main) D - Fourth commit
* 5678901 C - Third commit
* 6789012 B - Second commit
* 7890123 A - Initial commit

案例解析

1. 变基前
  • feature 分支的提交 EFG 基于 main 分支的旧提交 B
  • 提交历史呈现分支结构,不够线性。
2. 变基后
  • feature 分支的提交 E'F'G' 基于 main 分支的最新提交 D
  • 提交历史变得线性,易于阅读和理解。
3. 提交哈希值变化
  • 变基会重写提交历史,导致提交哈希值发生变化(如 E 变为 E')。
  • 这也是变基不适用于已推送的共享分支的原因。

类比理解

类比
想象你正在写一本小说,main 分支是主线剧情,feature 分支是支线剧情。

  • 变基前:支线剧情基于主线剧情的某个旧章节。
  • 变基后:你将支线剧情的修改应用到主线剧情的最新章节之后,使整个故事更加连贯。

注意事项

  1. 不要在已推送的共享分支上使用 rebase
    如果 feature 分支已经推送到远程仓库,并且其他开发者基于该分支进行了开发,使用 rebase 会导致提交历史不一致,引发问题。

  2. 备份分支
    在进行 rebase 操作前,建议创建分支备份,以防出现问题。

  3. 理解提交历史
    rebase 会改变提交历史,需要理解其影响,避免误操作。


总结

  • 变基(Rebase):将当前分支的变更应用到目标分支的最新提交之后,使提交历史更加线性。
  • 案例演示:通过 feature 分支变基到 main 分支,展示了变基的操作和效果。
  • 适用场景:本地开发分支整合、清理提交历史。
  • 注意事项如果分支已经推送到远程仓库,其他开发者可能已经基于该分支的提交进行了开发。变基后,提交历史发生变化,导致其他开发者的本地仓库与远程仓库不一致。 不要对已经推送的记录进行变基!

变基之后仍然存在两个分支,但 feature 分支的基准点(base)发生了变化。具体来说,feature 分支原来是基于 main 分支的提交 B,变基后变成了基于 main 分支的最新提交 D。

图片中, 右边 在dev分支上 变基

在这里插入图片描述


变基后合并操作的步骤

1. 前提条件
  • 已完成变基:假设你已经对某个分支(如 feature 分支)执行了 git rebase main,使其基于 main 分支的最新提交。
  • 目标分支:你希望将变基后的 feature 分支合并到 main 分支。
2. 切换到目标分支
git checkout main
  • 目的:确保你在要合并到的目标分支上。
3. 更新目标分支
git pull origin main
  • 目的:确保目标分支是最新的,避免合并冲突。
4. 合并变基后的分支
git merge feature
  • 情况 1:如果变基后没有冲突,Git 会自动完成合并,生成一个合并提交(如果使用 --no-ff 选项)。
  • 情况 2:如果有冲突,Git 会提示你解决冲突。
5. 解决冲突(如果有)
  • 查看冲突文件
    git status
    
  • 手动编辑冲突文件:解决冲突后,标记冲突已解决:
    git add <conflicted-file>
    
  • 完成合并
    git commit
    
6. 推送更新到远程仓库
git push origin main
  • 目的:将合并后的更改推送到远程仓库。

变基后合并的注意事项

  1. 确保变基已完成且无冲突

    • 在合并前,确保 feature 分支已经成功变基到 main 分支的最新提交。
    • 解决变基过程中可能出现的冲突。
  2. 避免在已推送的共享分支上变基

    • 如果 feature 分支已经推送到远程仓库,并且其他开发者基于该分支进行了开发,变基可能导致问题。
    • 建议:在本地分支上变基,合并前与其他开发者沟通。
  3. 使用 --no-ff 选项(可选)

    • 合并时可以使用 --no-ff(no fast-forward)选项,保留分支历史,便于查看合并记录。
    git merge --no-ff feature
    
  4. 备份重要分支

    • 在进行合并操作前,建议备份重要分支,以防出现问题。

变基后合并的优势

  • 线性提交历史:变基后,提交历史更加线性,易于阅读和理解。
  • 减少合并提交:如果变基成功,合并时可能不会产生额外的合并提交(取决于是否使用 --no-ff)。
  • 清晰的开发流程:通过变基和合并,可以保持代码库的整洁和一致性。

变基后合并的示例

场景描述
  • 初始状态
    • main 分支:A --- B --- C --- D
    • feature 分支:A --- B --- E --- F --- G(基于 B
  • 变基后
    • feature 分支:A --- B --- C --- D --- E' --- F' --- G'(基于 D
合并操作
  1. 切换到 main 分支

    git checkout main
    
  2. 更新 main 分支

    git pull origin main
    
  3. 合并 feature 分支

    git merge feature
    
  4. 解决冲突(如果有)

    • 编辑冲突文件,标记解决,完成合并。
  5. 推送更新

    git push origin main
    
  6. 最终提交历史

    A --- B --- C --- D --- E' --- F' --- G'  (main, feature)
    

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

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

相关文章

泰博云平台solr接口存在SSRF漏洞

免责声明&#xff1a;本号提供的网络安全信息仅供参考&#xff0c;不构成专业建议。作者不对任何由于使用本文信息而导致的直接或间接损害承担责任。如涉及侵权&#xff0c;请及时与我联系&#xff0c;我将尽快处理并删除相关内容。 漏洞描述 SSRF漏洞是一种在未能获取服务器…

MyBatis 动态SQL 详解!

目录 一、 什么是动态 SQL&#xff1f;二、 为什么需要动态 SQL&#xff1f;三、 MyBatis 动态 SQL 标签四、 标签详解及示例1、 if 标签2、 choose、when、otherwise 标签3、 where 标签4、 set 标签5、 foreach 标签6、 sql、include 标签 五、 总结 &#x1f31f;我的其他文…

阿里云服务器遭遇DDoS攻击有争议?

近年来&#xff0c;阿里云服务器频繁遭遇DDoS攻击的事件引发广泛争议。一方面&#xff0c;用户质疑其防御能力不足&#xff0c;导致服务中断甚至被迫进入“黑洞”&#xff08;清洗攻击流量的隔离机制&#xff09;&#xff0c;轻则中断半小时&#xff0c;重则长达24小时&#xf…

如何在Springboot的Mapper中轻松添加新的SQL语句呀?

在如今的软件开发界&#xff0c;Spring Boot可是非常受欢迎的框架哦&#xff0c;尤其是在微服务和RESTful API的构建上&#xff0c;真的是让人爱不释手&#xff01;今天&#xff0c;我们就来聊聊如何为Spring Boot项目中的Mapper添加新的SQL语句吧&#xff01;说起来&#xff0…

Qt 中 findChild和findChildren绑定自定义控件

在 Qt 中&#xff0c;findChild 和 findChildren 是两个非常实用的方法&#xff0c;用于在对象树中查找特定类型的子对象。这两个方法是 QObject 类的成员函数&#xff0c;因此所有继承自 QObject 的类都可以使用它们。当您需要查找并绑定自定义控件时&#xff0c;可以按照以下…

leecode第19天

15、三数之和 # 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c; # 同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。 # 注意&#xff1a;答案中不可以包含重复…

2109. 向字符串添加空格

2109. 向字符串添加空格 题目链接&#xff1a;2109. 向字符串添加空格 代码如下&#xff1a; class Solution { public:string addSpaces(string s, vector<int>& spaces) {string res "";int j 0;//直接遍历即可for (int i 0;i < spaces.size();i…

Java Spring Boot 与前端结合打造图书管理系统:技术剖析与实现

目录 运行展示引言系统整体架构后端技术实现后端代码文件前端代码文件1. 项目启动与配置2. 实体类设计3. 控制器设计4. 异常处理 前端技术实现1. 页面布局与样式2. 交互逻辑 系统功能亮点1. 分页功能2. 搜索与筛选功能3. 图书操作功能 总结 运行展示 引言 本文将详细剖析一个基…

CSRF跨站请求伪造——入门篇【DVWA靶场low级别writeup】

CSRF跨站请求伪造——入门篇 0. 前言1. 什么是CSRF2. 一次完整的CSRF攻击 0. 前言 本文将带你实现一次完整的CSRF攻击&#xff0c;内容较为基础。需要你掌握的基础知识有&#xff1a; 了解cookie&#xff1b;已经安装了DVWA的靶场环境&#xff08;本地的或云的&#xff09;&am…

BT-Basic函数之首字母R

BT-Basic函数之首字母R 文章目录 BT-Basic函数之首字母Rrandomizercallremoterenamereportreport clearreport fault syndromereport isreport level isreport outreport usingre‑savere‑storereturnrevision$rexitrinitrli$rndrotaterpmcrpsrun randomize 以下是这段英文的…

CentOS 7 如何挂载ntfs的移动硬盘

CentOS 7 如何挂载ntfs的移动硬盘 前言一、查看硬盘并尝试挂载(提示无法挂载)二、yum安装epel-release提示yum被锁定三、强行终止yum的进程四、yum安装epel-release完成五、yum安装ntfs-3g六、此时可正常挂载NTFS硬盘 前言 CentOS 7默认情况下是不支持NTFS的文件系统&#xff…

面试常考简单操作

参考文章 面试常考简单操作 快速排序归并排序Dijkstra自定义排序交替打印奇偶数冒泡排序插入排序堆排序欧几里得算法求最大公约数单例模式的双重校验LRU 快速排序 public class Solution {private static int partition(int[] arr, int left, int right) {int temp arr[left]…

2025图像处理和深度学习国际学术会议(IPDL 2025)

重要信息 官网&#xff1a;www.IPDL.xyz 时间&#xff1a;2025年4月11-13日 地点&#xff1a;中国-成都 简介 随着深度学习和图像处理技术的迅速发展&#xff0c;相关技术的应用逐渐渗透到各个行业&#xff0c;如医疗影像分析、自动驾驶、安防监控和智能制造等。这些应用的…

RNN万能逼近定理证明

RNN万能逼近定理证明 RNN原理图和数学表达式RNN的万能逼近定理及其证明证明 RNN原理图和数学表达式 s t U h t − 1 W x t b ∈ R D h s_tUh_{t-1}Wx_tb\in\mathbb{R}^{D_h} st​Uht−1​Wxt​b∈RDh​ s t ∈ R D h s_t\in\mathbb{R}^{D_h} st​∈RDh​ U ∈ R D h D h U\…

算力重构营销生态:广电数字人 “造星“ 运动背后的智能革命

一、数字人 "造星" 运动&#xff1a;广电行业的智能觉醒 当陕西广电的虚拟主播 "小雅" 在柞水县融媒体中心实现日更 100 秒新闻&#xff0c;当湖北广电的 "王丹" 从新闻主播转型为城市文化 IP&#xff0c;一场由算力驱动的数字人 "造星&qu…

大数据Spark(五十六):Spark生态模块与运行模式

文章目录 Spark生态模块与运行模式 一、Spark生态模块 二、Spark运行模式 Spark生态模块与运行模式 一、Spark生态模块 Spark 生态模块包括&#xff1a;SparkCore、SparkSQL、SparkStreaming、StructuredStreaming、MLlib 和 GraphX。与 Hadoop 相关的整个技术生态如下所示…

Could not find artifact com.microsoft.sqlserver:sqljdbc4:jar:4.0 in central

具体错误 [ERROR] Failed to execute goal on project datalink-resource: Could not resolve dependencies for project com.leon.datalink:datalink-resource:jar:1.0.0: Could not find artifact com.microsoft.sqlserver:sqljdbc4:jar:4.0 in central (https://repo.maven…

运营商在网状态查询API接口如何对接?

运营商在网状态查询 API 接口是一种能够让开发者通过编程方式查询手机号码在运营商网络中当前状态的应用程序接口。该接口是一组规范和协议&#xff0c;允许第三方开发者通过特定的编程方式与运营商的系统进行交互&#xff0c;以查询手机号码在运营商网络中的当前状态。 运营商…

【JavaScript】---- 数组的交集,并集,差集的实现,以及Set对象的交集,并集,差集的详细介绍和使用

1. 前言 数组的交集,并集,差集的实现。其实本质来说都不算难,但是 Set 类直接实现这些方法,所以我们先自己实现一下,然后再讲解一下 Set 类的相同方法。 2. intersection 交集 用数学公式,交集被表示为: A ∩ B = { x ∈ A ∣ x ∈ B } A \cap B = \{x \in A \mid x…

青铜与信隼的史诗——TCP与UDP的千年博弈

点击下面图片带您领略全新的嵌入式学习路线 &#x1f525;爆款热榜 88万阅读 1.6万收藏 第一章 契约之匣与自由之羽 熔岩尚未冷却的铸造台上&#xff0c;初代信使长欧诺弥亚将液态秘银倒入双生模具。左侧模具刻着交握的青铜手掌&#xff0c;右侧则是展开的隼翼纹章。当星辰…