效率工具- git rebase 全解

article/2025/7/13 4:02:58

一、前言

对于git rebase 一直不太了解,这几天想着提高下git提交质量,就发现了这个好用的指令,顺便记录一下,好加深记忆

贴出官方文档以便大家进一步学习 Git

二、rebase是作用

  • rebase 官方解释为变基,可以理解为移动你的分支根节点,维护一个更好的提交记录。rebase把你当前最新分支与其他分支合并时候,会把其他分支的提交记录放在我们当前分支时间线最开始的位置。也就是说,会把我们的提交记录整合在公共分支的后面。
  • 简单来讲,合并本地其他分支 为了不产生多余的分叉,及合并记录时可以使用rebase
  • 接下来我们看一下rebase有哪些应用场景及使用技巧与merge的差异。

三、rebase与merge的差异

  • rebase 会把你当前分支的 commit 放到公共分支的最后面,所以叫变基。就好像你从公共分支又重新拉出来这个分支一样。
  • merge 会把公共分支和你当前的 commit 合并在一起,形成一个新的 commit 提交。

四、应用场景

  • 你刚入公司,技术leader让你以 master 分支为基础,拉出一个分支进行开发需求。此时 master 分支提交记录为 a、b。你在 dev 分支分别 commit 了2次记录为 e、f ,有其他同事在 master 分支提交了两次记录为 c、d 这个时候你要合并master分支代码。

  • 当前分支状态节点如下图所示:

五、使用git merge 进行合并操作

5.1、结论

  1. 如上图所示 merge 会把两个分支合并在一起,形成一个新的 commit 提交记录。
  2. 我们发现 coomit 提交记录是把合并的分支记录放到我们当前dev分支记录的后面。
  3. 并且coomit 提交记录会产生分叉

七、使用git rebase 进行合并操作

  $ git rebase master  // 合并master分支代码$ git log --graph --oneline // 查看log点线图// 符号解释:* 表示一个commit, 注意不要管*在哪一条主线上 | 表示分支前进 / 表示分叉 \ 表示合入

7.1、结论

  1. 首先,我们发现目前 dev 分支上面的提交记录为 abcdef 并没有像 merge 一样产生新的提交记录
  2. 其次 rebase master 分支到 dev 分支, dev 分支的历史记录会添加在 master 分支的后面。
  3. 如图所示,历史记录成一条线,非常整洁,最后并没有像使 merge 一样提交记录产生分叉

八、rebase的使用业务场景

  • 认识到了rebase,让我们来看看有哪些实战场景可以参考使用。

8.1 场景一

  • 经典场景,优化本地提交记录,使其减少分叉。
  • 和上面👆那个经典案例一样,这里就不做重复描述了😁

8.2 场景二

  • 连续性冲突
  • 此时你从master分支拉出一个dev分支来对以v1版本为基础a功能进行需求更改,由于项目经理分功能时,让你的同事也对master分支中的a功能中的某个公共页面a也进行了整改,过一会你同事改完,提交x版本并合并push到了master远程分支上面。此时我们在dev分支完成一次开发提交了v2版本,产品经理过来说,需求有变更,要再做修改,然后我们又以v2的基础上在做修改,并提交为v3版本。过一会测试又提了一个需求建议。我们接着以当前dev分支v3版本为基础做好了整改并commit一个v4版本。到此我们本地假设对页面a修改了三次。同事修改了一次,并push到了远程master上面。那么我们对master分支进行合并到时候就会产生冲突。
  • 简单来讲就是。远程分支 master 对文件a进行了1次 commit ,而别的分支dev对文件A进行了3次commit,但是本地分支dev提交的n次 commit都与master分支的1次commit有冲突,

8.2.1 使用 git rebase 解决冲突

 
$ git fetch  // 更新本地存储的远程仓库的分支引用
$ git rebase origin/master // 拉去远程分支master中的代码与当前分支合并且变基
// 此时我们会产生第一次冲突,为当前dev分支版本v2中的a页面与远程分支master中的a页面冲突。解决后,根据提示进行 
$ git add .
$ git rebase continue // 继续进行合并
// 此时我们会产生第二次冲突,为当前dev分支版本v3中的a页面与远程分支master中的a页面冲突。解决后,根据提示进行 
$ git add .
$ git rebase continue // 继续进行合并
// 此时我们会产生第三次冲突,为当前dev分支版本v4中的a页面与远程分支master中的a页面冲突。解决后,根据提示进行 
$ git add .
$ git rebase continue // 继续进行合并
// 至此我们使用 rebase 变基完成 可以根据产品需求push到远程dev分支
$ git log --graph --oneline // 查看log点线图
// 符号解释:
* 表示一个commit, 注意不要管*在哪一条主线上 
| 表示分支前进 
/ 表示分叉 
\ 表示合入

8.3 结论

1、不会因为像使用 merge 时合代码时遇到冲突产生新的提交记录

2、用 merge 只需要解决一次冲突即,简单粗暴,而用 rebase 的时候 ,需要依次解决每次的冲突,才可以提交。

3、使用 rebase 提交记录不会分叉,一条线干净整洁

4、冲突解决完之后,使用 git add 来标记冲突已解决,最后执行git rebase --continue继续。如果中间遇到某个补丁不需要应用,可以用下面命令忽略:git rebase --skip

5、如果想回到 rebase 执行之前的状态,可以执行:git rebase --abort

8.4 场景三

  1. 你开发的一个需求产品反复更改,导致你的commit记录多次重复功能点
  2. 在日常开发中,难免有重复的commit提交记录.这时候我们想优化一下提交记录该如何做呢
  • 当前分支状态节点如下图所示:

使用git rebase 进行commit记录合并操作
 
 $ git rebase -i HEAD~x  // i(interactive)交互,HEAD~x 代表要合并到距离HEAD最近的几个历史提交,如 HEAD~3就是历史的前3个提交.$ git log --graph --oneline // 查看log点线图// 符号解释:* 表示一个commit, 注意不要管*在哪一条主线上 | 表示分支前进 / 表示分叉 \ 表示合入
  • 这里我们使用git rebase -i HEAD~3,此时我们会出现如下界面,我们进行简单设置

  此时我们会产生一条新的提交记录,并选择填写提交相关信息,并删减掉合并掉的提交记录 

  • 到此我们的合并已结束。

8.4.1 结论

  1. 合并了冗余的提交记录,并产生了一条新的提交记录
  2. 使提交记录看起来更整洁,也方便同事查阅

九、使用过程中可能出现的问题

当你在自己的分支A上完成开发,并执行git rebase develop后,本地分支A的历史已经被重写,此时尝试推送(git push)到远程仓库时,可能会遇到需要先拉取(pull)的情况。以下是详细解释及解决方

原因分析

  1. 历史冲突

    • 假设你之前已将分支A推送到远程仓库,此时远程分支A指向某个提交(如commit-old)。

    • 执行rebase develop后,本地分支A的提交历史被重写,生成新的提交(如commit-new)。

    • 此时本地分支与远程分支的历史分叉(尽管内容可能相同,但提交的哈希值不同),Git会检测到冲突。

  2. Git的安全机制
    Git默认拒绝直接推送分叉的历史,提示你需要先拉取远程变更(pull),以避免覆盖他人提交。但由于分支A只有你使用,这实际是本地与远程的历史不一致导致的“假冲突”。

解决方案

1. 强制推送(推荐)

如果你确认远程分支A没有他人提交,且需要保持线性历史,使用强制推送覆盖远程分支:

bash

复制

git push --force-with-lease origin A
  • --force-with-lease:安全强制推送,确保远程分支未被他人修改过。

2. 拉取并合并(不推荐)

若执行常规的git pull,Git会尝试合并本地与远程的历史,导致以下问题:

  • 生成一个无意义的合并提交,破坏rebase后的线性历史。

  • 可能引入冲突,需手动解决,增加复杂性。

git pull origin A  # 不推荐,除非你明确需要合并

根本原因总结

  • Rebase重写历史rebase会修改提交的父节点和哈希值,导致本地与远程历史不一致。

  • Git的保守策略:Git默认阻止直接推送分叉的历史,提示pull以合并变更,但这对个人分支来说通常是多余的。

最佳实践

  1. 推送前Rebase:在开始新功能前,先拉取主分支最新代码(git pull --rebase origin develop),减少后续冲突。这步确保develop 最新的拉取到本地是最新,后边进行本地rebase才能将自己最新的合并到devleop的最前面

  2. 及时强制推送:若分支仅自己使用,rebase后直接强制推送,保持远程与本地一致。

  3. 避免共享分支的Rebase:多人协作的分支不要使用rebase,以免影响他人工作。

通过理解Git的历史管理机制,合理选择rebasepush --force,可以高效维护代码库的整洁性

9.1 执行完上面做作后,通过在web 发起merge request 到develop-多出一条分支线

 这宗情况会产生自己分分支线从rebase 分支来在合进develop 的一条分支线

9.2 通过 --ff-only 合入,这种情况始终只有一条线

会检查是否可以快进合并。由于你已通过 rebase 将 A 分支对齐到 develop 最新提交,此时一定可以快进

--ff-only 会检查是否可以快进合并。由于你已通过 rebase 将 A 分支对齐到 develop 最新提交,此时一定可以快进git checkout develop
git merge --ff-only A

具体操作步骤

1. 保存工作进度

在开始操作之前,确保你 A 分支上的工作已经完成并且所有修改都已经提交。如果你有未提交的修改,可以使用以下命令保存:

bash

git add .
git commit -m "保存当前工作进度"

2. 切换到 develop 分支并拉取最新代码

bash

git checkout develop
git pull origin develop

此操作会让你切换到 develop 分支,并且从远程仓库拉取最新的代码。

3. 切换回 A 分支并进行 rebase

bash

git checkout A
git rebase develop

这里,git rebase develop 会把 A 分支上的提交移到 develop 分支的最新提交之后。若在 rebase 期间碰到冲突,你需要手动解决这些冲突,然后使用以下命令继续 rebase

bash

git add .
git rebase --continue

4. 切换回 develop 分支并进行快进合并

bash

git checkout develop
git merge --ff-only A

--ff-only 参数会保证只有在 develop 分支可以快进合并到 A 分支时才进行合并,也就是确保提交历史是一条直线。要是 develop 分支无法快进合并,就意味着之前的 rebase 操作可能有误,你需要重新检查。

5. 将更新后的 develop 分支推送到远程仓库

bash

git push origin develop

完整操作流程示例

bash

# 保存工作进度
git add .
git commit -m "保存当前工作进度"# 切换到 develop 分支并拉取最新代码
git checkout develop
git pull origin develop# 切换回 A 分支并进行 rebase
git checkout A
git rebase develop# 解决可能出现的冲突
# ...
# git add .
# git rebase --continue# 切换回 develop 分支并进行快进合并
git checkout develop
git merge --ff-only A# 将更新后的 develop 分支推送到远程仓库
git push origin developgit log --graph --oneline

关键点总结

  1. 先更新 develop 分支:确保本地 develop 分支与远端同步。

  2. 用 rebase 对齐提交历史:将 A 分支的提交“移动”到 develop 最新提交之后。

  3. 快进合并git merge --ff-only 保证提交历史线性。

  4. 解决冲突:在 rebase 过程中解决冲突,而不是在合并时。

十、总结

  • 我们发现分享 rebase 全文都是围绕 优化分支提交记录 来举例子介绍该命令,我个人觉得这也就是该命令的核心之处。
  • 在学习 rebase 之前我日常使用的基本都是 merge 导致 commit 记录过于混乱

参考文献

  • # 从git log 点线图(graph)看merge和rebase操作

  • # 从git rebase的常见冲突及解决办法


http://www.hkcw.cn/article/mPSHnTlwsv.shtml

相关文章

【开源】Python打造高效剪贴板历史管理器:实现跨平台生产力工具

📋【开源】Python打造高效剪贴板历史管理器:实现跨平台生产力工具 🌈 个人主页:创客白泽 - CSDN博客 🔥 系列专栏:🐍《Python开源项目实战》 💡 热爱不止于代码,热情源自…

π0的微调——如何基于各种开源数据集、以及私有数据集微调openpi(含我司七月的微调实践及在机械臂上的部署)

前言 25年2.4日,几个月前推出π0的公司Physical Intelligence (π)宣布正式开源π0及π0-FAST,如之前所介绍的,他们对用超过 10,000 小时的机器人数据进行了预训练 该GitHub代码仓库「 π0及π0-FAST的GitHub地址:github.com/Ph…

开源模型应用落地-qwen模型小试-Qwen3-8B-融合VLLM、MCP与Agent(七)

一、前言 随着Qwen3的开源与技术升级,其在企业中的落地场景正加速拓展至多个垂直领域。依托Agent智能体能力 和MCP协议的工具调用接口 ,Qwen3可深度融入企业业务流程,为企业提供从需求解析到自动化开发的全链路支持。 本篇将介绍如何实现Qwen3-8B模型集成MCP实现智能体交互。…

【Git】GitHub 连接失败解决方案:Failed to connect to github.com port 443 after 21090 ms: Couldn’t connect to se

文章目录 一、使用 VPN 环境下的解决方案1. 检查当前代理设置2. 配置 Git 使用代理3. 验证代理设置是否生效4. 刷新 DNS 缓存5. 重新尝试 Git 操作 二、未使用 VPN 环境下的解决方案1. 取消 Git 配置的代理2. 验证代理设置已成功移除3. 重试 Git 操作 三、总结使用 VPN 的解决方…

Java 大视界 -- Java 大数据机器学习模型在元宇宙虚拟场景智能交互中的关键技术(239)

💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…

Digital Reengineering and Localized Implementation of the Five-Dimensional Management Cycle System

A Paradigm Shift in Intelligent Hospital Governance(Preliminary draft of the first-line cooperation project) Abstract This study pioneers a transformative approach to healthcare management through the “Technology-Management-Value” (TMV) triad model, r…

Qwen3:重磅开源,重夺开源第一!(包含详细使用教程)

1.简介 Qwen3,这是 Qwen 系列大型语言模型的最新成员。我们的旗舰模型 Qwen3-235B-A22B 在代码、数学、通用能力等基准测试中,与 DeepSeek-R1、o1、o3-mini、Grok-3 和 Gemini-2.5-Pro 等顶级模型相比,表现出极具竞争力的结果。此外&#xf…

基于 Alpine 定制单功能用途(kiosk)电脑

前言 故事回到 7 年前, 在网上冲浪的时候发现了一篇介绍使用 Ubuntu 打造 kiosk 单功能用途电脑的文章, 挺好玩的, 就翻译了一下并比葫芦画瓢先后用了 CentOS 7, ArchLinux 进行了实现. 历史文章: 翻译 - 使用Ubutnu14.04和Chrome打造单功能用途电脑(大屏展示电脑) 使用CentOS…

《汇编语言》第13章 int指令——实验13 编写、应用中断例程

(1)编写并安装 int 7ch 中断例程,功能为显示一个用0结束的字符串,中断例程安装在0:200处。 参数:(dh)行号,(dl)列号,(cl&a…

大模型前处理-CPU

前处理包含哪些流程 分词 tokenizationembedding CPU可以做哪些优化 分词 分词在做什么? 什么是词元化? 词元化(Tokenization)是把一段自然语言文本拆分成更小的单元(称为“词元”,即 Token&#xff0…

设备驱动与文件系统:02 键盘

操作系统中键盘驱动的讲解 在这一讲中,我将为大家讲解键盘相关内容。从上一讲开始,我们进入了操作系统第四个部分的学习,也就是操作系统对设备的驱动与管理。 上一讲我们探讨的是显示器,并且提到,一个终端设备是由显示…

工作流引擎-18-开源审批流项目之 plumdo-work 工作流,表单,报表结合的多模块系统

工作流引擎系列 工作流引擎-00-流程引擎概览 工作流引擎-01-Activiti 是领先的轻量级、以 Java 为中心的开源 BPMN 引擎,支持现实世界的流程自动化需求 工作流引擎-02-BPM OA ERP 区别和联系 工作流引擎-03-聊一聊流程引擎 工作流引擎-04-流程引擎 activiti 优…

Windows环境下Scoop包管理工具的全面指南

🧩 一、Scoop核心特性与设计理念 定位与优势 专注于开源命令行工具和便携式(Portable)应用,无需管理员权限即可安装,减少系统污染。自动管理环境变量(通过shims目录),安装后即时可用…

谷粒商城-分布式微服务项目-高级篇[三]

十五、商城业务-支付 15.1 支付宝支付 15.1.1 进入“蚂蚁金服开放平台” 支付宝开放 平台地址: 支付宝开放平台 15.1.2 下载支付宝官方 demo,进行配置和测试 开发者文档:支付宝开放平台文档中心 电脑网站支付文档:小程序文…

EchoMimicV2:迈向引人注目、简化的半身人类动画

今天介绍EchoMimicV2,EchoMimicV2是阿里蚂蚁集团推出的半身人体AI数字人项目,输入参考图片、音频、和手部姿势序列生成动画视频(对图片的规范要求比较高,图片规范的话效果还可以),感兴趣的还可以去了解一下…

SpringBoot手动实现流式输出方案整理以及SSE规范输出详解

背景: 最近做流式输出时,一直使用python实现的,应需求方的要求,需要通过java应用做一次封装并在java侧完成系统鉴权、模型鉴权等功能后才能真正去调用智能体应用,基于此调研java实现流式输出的几种方式,并…

vuex的使用

❀ ❀ ❀ ❀ ❀ ❀ ❀ vuex的官网 ❀ ❀ ❀ ❀ ❀ ❀ ❀ ❀ 这里用法不纯粹。用户toolbar页面切换时的传参。若后期有更好的方式,会更改。因vuex用于全局,在这个场景下使用有点大材小用了 其中需要注意的点就是更新、获取状态 更新状态。updateProjec…

Calendar和Datepicker

Displaystart Displayend "2024-10-8" selectedDate属性 设定选择的日期 在 C# 中,DateTime? date1 表示 **一个可空的 DateTime 类型变量**。 ?.是不为零 ?是可以为零0️⃣ 多选 selectionmode none不让选 singlerange shift …

赛事获奖|TsingtaoAI荣获“雄才杯”2025创新创业大赛总决赛奖项

5月16-18日,由雄安新区党工委人才工作领导小组办公室主办的“雄才杯”2025创新创业大赛总决赛在雄安新区成功举办。TsingtaoAI凭借“基于DeepSeek的具身智能实训”项目荣获优胜奖,本项目为参赛项目中唯一的教育科技服务类获奖项目。 大赛背景 本次总决…

初识vue3(vue简介,环境配置,setup语法糖)

一,前言 今天学习vue3 二,vue简介及如何创建vue工程 Vue 3 简介 Vue.js(读音 /vjuː/,类似 “view”)是一款流行的渐进式 JavaScript 框架,用于构建用户界面。Vue 3 是其第三代主要版本,于 …