Git rebase 的使用(结合图与案例)

Git Rebase的使用 然而,在使用rebase时需要谨慎,特别是在处理公共分支时,避免因误操作导致的历史记录混乱。Git rebase是Git版本控制系统中的一个重要工具,用于重写提交历史,整合分支。在公共分支上rebase会改变提交历史,导致其他开发者的提交记录失效。不同,rebase不会创建新的合并提交,而是重新应用提交,以确保项目历史看起来像是线性的。在功能分支上工作时,经常需要保持与主分支同步。Git rebase是将一个分支上的所有提交移动到另一个分支的末端的过程。会创建一个新的合并提交,保留所有分支的提交历史。 阅读详情

Git rebase 的使用

在 Git 中整合来自不同分支的修改主要有两种方法:merge 以及 rebase

Git rebase 概念

**rebase概念:**用来重新应用提交(commits)到新的基础提交上

理解:

  • 我们可以将其理解成改变当前分支的base;
  • 比如在分支 hotfix 上执行rebase master,那么可以改变 hotfix 的base为master

**作用:**保持提交历史的线性化,避免分叉提交记录。

结合案例理解:

背景:我们需要在 c2 创建 hotfix 分支进行修复 bug

Plan1:采用 merge 来实现

git merge的操作如下所示,bug修复完后,在 master 上合并 hotfix 分支

image.png

通过 log 查看 图结构,如下所示:

nathanchen@192 rebase % git merge hotfix           
Merge made by the 'ort' strategy.
 foo.js | 1 +
 1 file changed, 1 insertion(+)
nathanchen@192 rebase % git log --pretty=oneline --graph
*   64e94a94dc6464bb42fc0c4f48419479d141d335 (HEAD -> master) Merge branch 'hotfix'
|\  
| * 04d6400f44b01ca420ef69bcad1a47e5310d5a6f (hotfix) hotfix commit
* | 8e3ebf3371cf5b2b95dabccfb57828f443df1f79 3 commit
|/  
* ec7d26252df6bb104ea15c85e8bbbffa4fe37818 2 commit
* 132fad134c2d9e7de97fcac8d105c416afda613c 1 commit
* c90491eb34784dd0a4f98184c6d44b80a32f4120 init commit
(END)

根据以上来看, 采用git merge 来合并分支会导致分支非线性。


Plan2:采用 rebase 来实现

目前情况如下所示,当前 hotfix 分支的base为c2

image.png

我们需要在 hotfix 上进行 rebase 操作,即我们需要在 hotfix 分支上将base改成 master 指向的提交对象c3,命令如下所示:

git rebase master

整体流程如下:

nathanchen@192 rebase % git checkout hotfix             
Switched to branch 'hotfix'
nathanchen@192 rebase % git rebase master  
Successfully rebased and updated refs/heads/hotfix.
nathanchen@192 rebase % git log --pretty=oneline --graph
* 5a3569383a81896decb866f5333ed0abd2bd2e46 (HEAD -> hotfix) hotifx commit
* 9e5912ce9fe64627394302d8dce03958aa41bc2a (master) 3 commit
* 3971f63e84c77d0266658a61283ceafc543b0c5b 2 commit
* 959e6c99e08492212666970d2af79bc3c4378979 1 commit
* cbddbfed8dc69ddb04b19bb2fef704b6ac94b5cb init commit
(END)
nathanchen@192 rebase % git checkout master             
Switched to branch 'master'
nathanchen@192 rebase % git log --pretty=oneline --graph
* 9e5912ce9fe64627394302d8dce03958aa41bc2a (HEAD -> master) 3 commit
* 3971f63e84c77d0266658a61283ceafc543b0c5b 2 commit
* 959e6c99e08492212666970d2af79bc3c4378979 1 commit
* cbddbfed8dc69ddb04b19bb2fef704b6ac94b5cb init commit

此时的git提交图结构如下所示:

image.png

我们需要将 master 指向最新的提交对象 hotfix

nathanchen@192 rebase % git merge hotfix                
Updating 9e5912c..5a35693
Fast-forward
 foo.js | 3 +++
 1 file changed, 3 insertions(+)
 create mode 100644 foo.js
nathanchen@192 rebase % git log --pretty=oneline --graph
* 5a3569383a81896decb866f5333ed0abd2bd2e46 (HEAD -> master, hotfix) hotifx commit
* 9e5912ce9fe64627394302d8dce03958aa41bc2a 3 commit
* 3971f63e84c77d0266658a61283ceafc543b0c5b 2 commit
* 959e6c99e08492212666970d2af79bc3c4378979 1 commit
* cbddbfed8dc69ddb04b19bb2fef704b6ac94b5cb init commit

最终的git提交图结构如下所示:

image.png



Git rebase 原理

rebase工作原理:

首先找到这两个分支(即当前分支 hotfix、变基操作的目标基底分支 master) 的最近共同祖先 C2;

然后对比当前分支相对于该祖先的历次提交,提取相应的修改并存为临时文件;

接着将当前分支指向目标基底 C3;

最后将之前存储的临时文件的修改依序应用;

我们可以再次执行master上的合并操作:

$ git checkout master 
$ git merge experiment


rebase和merge的选择

开发中对于rebase和merge的选择:

事实上,rebase和merge是对Git历史的不同处理方法:

merge用于记录git的所有历史,那么分支的历史错综复杂,也全部记录下来;

rebase用于简化历史记录,将两个分支的历史简化,整个历史更加简洁;

了解了rebase的底层原理,就可以根据自己的特定场景选择merge或者rebase。

rebase的黄金法则:永远不要在主分支上使用rebase

  • 如果在main上面使用rebase,会造成大量的提交历史在main分支中不同;
  • 而多人开发时,其他人依然在原来的main中,对于提交历史来说会有很大的变化;

理解以上:

rebase前

image.png

在master上rebase,会导致c3的base变成hotfix2,导致历史混乱。

image.png

在hotfix上rebase:

image.png

Git Rebase ❗ 不要对已经 push 给别人的分支做 rebase(除非你非常清楚自己在干啥,并且团队都同意)。Rebase = 把一段提交“剪下来”,贴到另一个 commit 后面,并重新生成新的提交。A' 是一个全新的 commit(hash 不同), 但它包含 A~F 的所有代码改动。自己在本地开发的分支,还没 push 或只有你一个人用 → 随便 rebase。把你这一串提交,剪下来,贴到别的 commit 后面,再重新排一遍。Rebase 过程中,如果有冲突,Git 会停下来,让你解决。 阅读详情

相关推荐

Git基础教程:Git Rebase的完全指南

Git基础教程:Git Rebase的完全指南在软件开发中,版本控制是一个关键的部分,而Git作为最流行的分布式版本控制系统之一,提供了强大的功能来管理代码的版本和变更。其中一个重要的Git命令是git rebase,它可以帮助开发人员合并分支、整理提交历史和解决冲突。本文将深入介绍Git Rebase的用法和示例,并提供相应的源代码。

CyberSphinx的博客 1097

git rebase详解(图解+最简单示例,一次就懂)

在拉公共分支最新代码的时候使用rebase,也就是git pull -r 但往公共分支上合代码的时候,使用merge

风中一匹狼的博客 64万+

Leaflet 加载天地图完整配置指南:从插件修改到无限缩放(附源码)

本文详细介绍了Leaflet与天地图深度集成的完整配置指南,包括插件修改、无限缩放实现及源码示例。通过解析天地图服务的WMTS协议、双投影支持和密钥机制,帮助开发者突破缩放级别限制,优化地图应用性能,适用于Web地图开发和高精度GIS系统。

weixin_27180827的博客 441

Git常用命令rebase

Git常用命令rebase

YIYIYI 4万+

python基础·练习1(字符串作业)

python基础·练习1字符串作业一、填空二、编程初级中级 字符串作业 一、填空 1.已知s2 = ‘123’,则:s2 * 3 = ___________; s2 + str(456) = ___________; s2 = '123' print(s2 * 3) #123123123 print(s2 + str(456)) #123456 2.已知s1 = ‘123456789’。则: s1[:3] = ________; s1[-5:] =____________; s1[::2]=______;

qq_47326711的博客 8122

本地AI语音生成与配音工作台Pandrator:从TTS到RVC的完整实践指南

语音合成(TTS)技术通过深度学习模型将文本转换为自然语音,其核心原理涉及声学建模与波形生成。这项技术不仅提升了人机交互体验,更在内容创作领域展现出巨大价值,广泛应用于有声书制作、视频配音、虚拟助手等场景。本文聚焦于一个集成了XTTS-v2、RVC等先进模型的本地化AI语音工作台——Pandrator,它通过模块化架构将语音合成、声音克隆、音频转录与翻译等流程无缝整合,为用户提供了一个图形化、可定制的完整解决方案。文章深入解析了其基于TTS与RVC(Retrieval-based Voice Convers

weixin_42676876的博客 340

Git进阶(十八):git rebase详解

rebase使用方法git rebase [基节点]git rebase [基节点] [待变基节点]rebase后面的参数可以是两个,也可以是一个,当rebase为一个参数的时候其实是省略了第二个参数,第二个参数为HEAD指针当前指向的那个节点。

IT全栈 华强工作室 1万+

Agentic RAG:RAG从静态到具有理解、推理、决策的Agentic RAG

RAG技术演进:从静态检索到智能代理 RAG(检索增强生成)技术经历了五个关键发展阶段:基础RAG(关键词检索)、高级RAG(语义理解)、模块化RAG(灵活架构)、图RAG(知识图谱)和最新的Agentic RAG(智能代理)。Agentic RAG通过引入自主AI代理,具备反思、规划、工具使用和多代理协作能力,实现了动态决策和自适应工作流。相比传统RAG的静态检索流程,Agentic RAG能处理复杂多步推理任务,通过自我改进机制提高输出质量,并支持多专业代理协作,显著提升了RAG系统在复杂场景下的表现。

2542

【GIT】一文带你彻底了解 git rebase(图解+案例+实战)

git rebase,顾名思义即变基,不过这是一条多功能命令,既可以重建提交历史,还可以整合不同分支间的变更。本文将对相关功能进行介绍。文中的截图为使用创建的,不熟悉git的可以使用这个练习一下。

Friday 2万+

MPC-CBF 控制原理详解

假设系统满足如下离散时间动力学模型xt1fxtutxt∈Xut∈Uxt1​fxt​ut​xt​∈Xut​∈Uxtx_txt​:状态变量,定义域为可行状态集X⊆RnX⊆Rnutu_tut​:控制输入,定义域为控制约束集U⊆RmU⊆Rm系统需满足安全约束,由如下控制障碍函数(CBF)hX→RhX→RCx∈X∣hx≥0C:=x∈X∣hx≥。

m0_54691290的博客 1184

Ollama本地大模型部署指南:从核心原理到实战避坑

大语言模型(LLM)作为人工智能领域的核心技术,通过海量数据训练获得强大的语言理解和生成能力。其工作原理基于Transformer架构,通过自注意力机制处理序列数据,在文本生成、代码编写和对话系统等场景展现出巨大价值。随着开源模型的普及,本地部署成为关注焦点,它解决了数据隐私和定制化需求,但面临环境配置和资源管理的挑战。Ollama作为开源工具,通过封装模型格式和统一API,简化了本地部署流程,支持GPU加速和性能调优,让开发者能够快速集成到IDE和自动化脚本中,实现高效的本地AI应用部署。

weixin_30915951的博客 452

【Git系列】rebase的使用场景

Rebase 是 Git 版本控制系统中的一种操作,它用于将一个分支的修改应用到另一个分支上。Rebase 的主要目的是将分支的提交历史整理成一条直线,使得项目的提交历史更加清晰、整洁。通常情况下,你可以在以下情况使用 rebase:合并分支:当你想要将一个分支的修改合并到另一个分支上时,可以使用 rebase。通过 rebase,你可以将待合并分支的修改应用到目标分支上,从而在目标分支上形成一个干净的提交历史。

优快云站内信: https://i.youkuaiyun.com/#/msg/chat/qyj19920704 1万+

三模冗余、纠错编码、单粒子翻转防护

本文探讨了高可靠性FPGA系统设计的三大关键技术:三模冗余(TMR)、纠错编码(ECC)和单粒子翻转(SEU)防护。TMR通过三个并行模块和表决器实现容错,但会增加硬件资源和功耗;ECC利用汉明码等编码方式检测和纠正数据错误,适用于存储器保护;SEU防护则针对高能粒子引发的位翻转问题,采用配置刷新、TMR和ECC等方法。文章还通过Verilog代码示例展示了这些技术的实现,并提出了一个综合应用案例,结合三种技术构建高可靠性控制系统。这些技术在航空航天、医疗设备等关键领域具有重要应用价值。

2301_79143213的博客 715

Git Rebase 详解:原理、用法与实战案例

Git Rebase(变基)是一种重写提交历史的方式,能够让 Git 分支的提交记录保持线性,使代码库更加整洁。

YiYueHuan的专栏 2326

(五)深入理解Bluez协议栈之“GATT Server Profile”

上一篇介绍Bluez协议栈的了GAP Profile的实现,本章节我们继续介绍GATT Profile的实现,参考的程序是Peripheral。通过阅读它的实现代码可以发现,它广播部分是通过mgmt来实现的,然后在初始化完成之后,创建了一个L2CAP类型的socket,来负责实现GATT Server的逻辑。

1143

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

git fetch、git rebase和merge区别

merge和rebase都是用来合并分支的 merge和rebase的区别 什么是分支;分支就是便于多人在同一项目中的协作开发。比方说:每个人开发不同的功能,在各自的分支开发过程中互不影响,完成后都提交到develop分支。极大的提高了开发的效率。 合并分支;每个人创建一个分支进行开发,当开发完成,需要合并到develop分支的时候,就需要

muzidigbig的博客 2万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Git Rebase 详解:原理、使用场景与回滚操作

git rebase是 Git 中的一个命令,用于将一个分支的提交历史重新应用到另一个分支上。与git merge不同,rebase不会创建合并提交,而是将提交历史线性化,使得提交记录更加清晰。String id;'}';git rebase是一个强大的工具,可以帮助我们整理提交历史、合并分支以及解决冲突。然而,使用不当可能会导致提交历史混乱,因此需要谨慎操作。本文详细介绍了git rebase的原理、使用场景、注意事项以及如何回滚错误的操作。

私聊前往站内信:https://i.youkuaiyun.com/#/msg/chat/weixin_44976692 3771

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

git rebase的使用

本地开发:在feature分支上进行开发,可以随意使用rebase -i来整理你的本地提交历史。准备集成:当你准备将分支推送到远程并发起 Pull Request 时:# 1. 获取远程最新代码 git fetch origin # 2. 将你的特性分支变基到 origin/main 上,解决可能出现的冲突 git rebase origin/main # 3. (可选) 最后整理一下你的提交,使其逻辑清晰 git rebase -i HEAD~5 # 例如整理最近5次提交 # 4. 推送到远程。

weixin_44794260的博客 1243

git-rebase看这一篇就可以了

前言 哈喽,everybody,不知不觉8天的小长假也接近了尾声,玩耍了这么多天,今天也要收一收心,开始学习了呦~。明天就要上班啦,今天姐姐突然问我git-rebase指令是干什么的,怎么用?其实我是不想给他讲的,但是还是没有逃过姐姐的软磨硬泡,那么我们就一起来看一看什么是git-rebase吧!!! 缘起 话说,我和姐姐的缘分是在那一个月黑风高的晚上,啪,姐姐一巴掌打在了我的脸上并说了一句:能不能讲重点~~~。哈哈,不开玩笑了,直接说重点吧。我们先来看一个场景,我查看了一下我github上的个人仓库,

qq_39397165的博客 7054

[Git] Git整理(四) git rebase 的使用

概述 在之前总结分支相关内容时说道,合并两个分支的提交可以使用git merge,然而除了这种方式之外,还有一种方式就是使用git rebase,这两种方式的最终结果都相同,但是合并历史却不同;git merge是将两个分支做一个三方合并(如果不是直接上游分支),这样一来,查看提交历史记录,可能会显得非常凌乱。git rebase则会将当前分支相对于基低分支的所有提交生成一系列补丁,然后放到基底...

FightFightFight的博客 1万+

彻底搞懂git rebase命令

使用 Git 已经好几年了,却始终只是熟悉一些常用的操作。对于 Git Rebase 却很少用到,直到这一次,不得不用。 一、起因 上线构建的过程中扫了一眼代码变更,突然发现,commit提交竟然多达62次。我们来看看都提交了什么东西: 这里我们先不说git提交规范,就单纯这么多次无用的commit就很让人不舒服。可能很多人觉得无所谓,无非是多了一些提交纪录。 然而,并非如此,你可能听过破窗效应,编程也是如此! 二、导致问题 1.不利于代码review 设想一下,你要做code...

只为成功找方法 不为失败找借口 1万+

git merge和rebase的区别与选择

git merge和rebase的区别与选择 转自:https://github.com/geeeeeeeeek/git-recipes/wiki/5.1-%E4%BB%A3%E7%A0%81%E5%90%88%E5%B9%B6%EF%BC%9AMerge%E3%80%81Rebase-%E7%9A%84%E9%80%89%E6%8B%A9#merge BY 童仲毅(geeeeeeeeek@github) 这是一篇在原文(BY atlassian)基础上演绎的译文。除非另行注明,页面上所有内容采用知识共享

weixin_44966641的博客 6382

Git Rebase 使用说明

本文介绍如何使用 git rebase 整理提交历史,特别适合 Merge Request 开发流程

weixin_45367434的博客 1595

Git Merge 和 Git Rebase 的区别详解

git merge和git rebase如果你希望保留完整的提交历史,清晰地显示每个分支的更改和合并点,那么git merge是更好的选择。如果你倾向于保持一个清洁、线性的提交历史,并且团队成员对解决冲突感到舒适,那么可以选择git rebase。在团队环境中,最重要的是确保所有成员都理解并遵守相同的工作流程,无论是选择merge还是rebase,都需要谨慎处理冲突并确保团队成员对合并策略达成共识。版权声明:本博客内容为原创,转载请保留原文链接及作者信息。参考文章。

ning的博客 1788
上一篇: Git:版本控制工具介绍
下一篇: Git 原理(提交对象)(结合图与案例)
CaptainDrake
博客等级 码龄6年 5363粉丝 187原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值