git中的merge和rebase的区别

在 Git 中,git merge 和 git rebase 都是用于整合分支变更的核心命令,但它们的实现方式和结果有本质区别。以下是两者的详细对比:
一、核心区别
| 特性 | git merge | git rebase |
|---|---|---|
| 历史记录 | 保留分支拓扑,生成新的合并提交 | 线性化历史,复制提交到目标分支的末端 |
| 提交树结构 | 创建分叉(Merge Commit) | 保持线性(无分叉) |
| 适用场景 | 公共分支(如 main、develop) | 本地开发分支(未共享的分支) |
| 冲突处理 | 冲突解决后生成合并提交 | 冲突在变基过程中逐提交解决 |
| 历史可追溯性 | 保留分支合并的上下文 | 隐藏分支开发细节,简化历史 |
| 对协作的影响 | 安全(不修改公共提交历史) | 危险(重写历史,破坏他人分支) |
二、工作流程对比
1. git merge 的流程
-
目标:将分支
feature合并到main。 -
操作:
git checkout main git merge feature -
结果:
* 合并提交 (main) |\ | * 提交 C (feature) | * 提交 B |/ * 提交 A (初始提交)
2. git rebase 的流程
-
目标:将
feature的提交变基到main的最新提交。 -
操作:
git checkout feature git rebase main git checkout main git merge feature # 快进合并(Fast-forward) -
结果:
* 提交 C' (feature → main) * 提交 B' * 提交 A (main 的最新提交)
三、适用场景
1. 何时使用 git merge?
-
公共分支整合(如合并
feature到main)。 -
保留分支历史(需要明确看到合并时间点)。
-
团队协作(避免因重写历史导致冲突)。
2. 何时使用 git rebase?
-
本地分支整理(清理中间提交,合并
fixup)。 -
保持线性历史(避免不必要的合并提交)。
-
同步上游分支(如将
main的更新整合到开发分支)。
四、命令详解
1. git merge
-
合并策略:
-
快进合并(Fast-forward):如果目标分支是源分支的直接祖先,直接移动指针。
-
三方合并(Three-way Merge):创建新的合并提交(非快进时)。
-
-
常用选项:
git merge --no-ff # 强制生成合并提交(即使可快进) git merge --abort # 终止合并(冲突时)
2. git rebase
-
操作步骤:
-
找到当前分支和目标分支的最近公共祖先。
-
提取当前分支的差异提交。
-
将这些提交按顺序应用到目标分支的最新提交后。
-
移动分支指针到新提交链的末端。
-
-
常用选项:
git rebase -i HEAD~3 # 交互式变基(合并/修改提交) git rebase --continue # 解决冲突后继续变基 git rebase --abort # 终止变基
五、优缺点对比
| 特性 | git merge 优点 | git merge 缺点 |
|---|---|---|
| 历史清晰度 | 明确保留分支合并关系 | 历史可能复杂(多分叉) |
| 协作友好性 | 不修改公共历史,适合团队协作 | 合并提交可能冗余 |
| 冲突处理 | 一次性解决所有冲突 | 合并提交可能包含不相关修改 |
| 历史清晰度 | 提交历史线性化,易于阅读 | 隐藏分支开发细节 |
| 协作友好性 | 适合本地分支整理 | 重写历史可能破坏他人分支 |
| 冲突处理 | 逐提交解决冲突(更精细) | 可能需要多次解决相同冲突 |
六、最佳实践
-
公共分支用
merge,私有分支用rebase:-
main/develop分支使用merge保留合并记录。 -
本地
feature分支在合并前用rebase整理提交。
-
-
禁止对已推送的分支执行
rebase:-
重写公共历史会导致协作混乱。
-
-
交互式变基(
rebase -i)优化提交:-
合并冗余提交(
squash)、修改提交消息(reword)。
-
-
同步上游分支时优先
rebase:git pull --rebase # 等同于 fetch + rebase(而非 merge)
七、总结
| 核心选择 | git merge | git rebase |
|---|---|---|
| 历史风格 | 非线性的真实历史 | 线性化的整洁历史 |
| 协作影响 | 安全 | 需谨慎使用 |
| 适用阶段 | 分支合并到公共主干 | 本地分支整理 |
黄金法则:
已推送的分支用 merge,未推送的分支用 rebase。
通过合理选择合并策略,可以兼顾历史可读性和协作安全性。
相关文章:
git中的merge和rebase的区别
在 Git 中,git merge 和 git rebase 都是用于整合分支变更的核心命令,但它们的实现方式和结果有本质区别。以下是两者的详细对比: 一、核心区别 特性git mergegit rebase历史记录保留分支拓扑,生成新的合并提交线性化历史&#x…...
【目标检测】目标检测中的数据增强终极指南:从原理到实战,用Python解锁模型性能提升密码(附YOLOv5实战代码)
🧑 博主简介:曾任某智慧城市类企业算法总监,目前在美国市场的物流公司从事高级算法工程师一职,深耕人工智能领域,精通python数据挖掘、可视化、机器学习等,发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…...
uniapp在app下使用mqtt协议!!!支持vue3
什么?打包空白?分享一下我的解决方法! 第一步 找大师算过了,装4.1版本运气好! 所以根目录执行命令… npm install mqtt4.1.0第二步 自己封装一个mqtt文件方便后期开坛做法! // utils/mqtt.js import mqt…...
VMware虚拟机17.5.2版本下载与安装(详细图文教程包含安装包)
文章目录 前言一、vmware虚拟机下载二、vmware虚拟机安装教程三、vmware虚拟机许可证 前言 VMware Workstation Pro 17 功能强大,广受青睐。本教程将带你一步步完成它的安装,简单易上手,助你快速搭建使用环境。 一、vmware虚拟机下载 VMwar…...
如何加固织梦CMS安全,防webshell、防篡改、防劫持,提升DedeCMS漏洞防护能力
织梦系统(DedeCMS)是一款非常知名的CMS系统,因其功能强大、结构科学合理,深受广大用户喜欢。 虽然织梦CMS(DedeCMS)非常优秀,但是为了保障网站安全,我们还是需要做一些必要的防护措…...
STM32的HAL库开发---ADC采集内部温度传感器
一、STM32内部温度传感器简介 二、温度计算方法 F1系列: 从数据手册中可以找到V25和Avg_Slope F4、F7、H7系列只是标准值不同,自行查阅手册 三、实验简要 1、功能描述 通过ADC1通道16采集芯片内部温度传感器的电压,将电压值换算成温度后&…...
Linux 命令大全完整版(12)
Linux 命令大全 5. 文件管理命令 ln(link) 功能说明:连接文件或目录。语 法:ln [-bdfinsv][-S <字尾备份字符串>][-V <备份方式>][--help][--version][源文件或目录][目标文件或目录] 或 ln [-bdfinsv][-S <字尾备份字符串>][-V…...
Python - 代码片段分享 - Excel 数据实时写入方法
文章目录 前言注意事项工具 pandas1. 简介2. 安装方式3. 简单介绍几个api 实战片段 - 实时写入Excel文件结束语 要么出众,要么出局 前言 我们在爬虫采集过程中,总是将数据解析抓取后统一写入Excel表格文件,如果在解析数据出现问题容易出现数据…...
(七)趣学设计模式 之 适配器模式!
目录 一、 啥是适配器模式?二、 为什么要用适配器模式?三、 适配器模式的实现方式1. 类适配器模式(继承插座 👨👩👧👦)2. 对象适配器模式(插座转换器 🔌…...
DeepSeek 细节之 MoE
DeepSeek 细节之 MoE DeepSeek 团队通过引入 MoE(Mixture of Experts,混合专家) 机制,以“分而治之”的思想,在模型容量与推理成本之间找到了精妙的平衡点,其中的技术实现和细节值得剖思 Transformer 演变…...
【Linux-网络】从逻辑寻址到物理传输:解构IP协议与ARP协议的跨层协作
🎬 个人主页:谁在夜里看海. 📖 个人专栏:《C系列》《Linux系列》《算法系列》 ⛰️ 道阻且长,行则将至 目录 📚前言 📖 IP地址的组成 🔖IPv4 🔖IPv6 📚…...
毕业离校管理系统的开发与需求分析
在当今信息化的时代背景下,高校的毕业生离校管理工作也逐渐向数字化转型。为了提高工作效率,减少人为错误,增强信息透明度,毕业离校管理系统应运而生。该系统旨在为学校提供一个高效、准确的毕业生离校管理平台,从而提…...
【NLP 24、实践 ⑤ 计算Bert模型中的参数数量】
以前不甘心,总想争个对错,现在不会了 人心各有所愿,没有道理可讲 —— 25.1.18 计算Bert模型结构中的参数数量 BertModel.from_pretrained():用于从预训练模型目录或 Hugging Face 模型库加载 BERT 模型的权重及配置。 参数名称…...
一、Spring框架系统化学习路径
系统化的Spring框架学习路径 第1阶段:基础知识准备 Java基础 核心概念:面向对象、异常处理、集合框架、多线程等。JVM基础:内存模型、垃圾回收机制。 Maven或Gradle Maven:创建项目、依赖管理、生命周期。Gradle:基本…...
Midscene.js - AI驱动,轻松实现UI自动化
UI自动化测试一直是软件测试中的一项重要任务,而随着AI技术的快速发展,自动化测试的能力也在不断提升。如何让UI自动化更智能、精准、灵活?Midscene.js作为一款AI驱动的UI自动化测试工具,正逐步改变着传统自动化测试的面貌。你是不…...
(九)Mapbox GL JS 中 Marker 图层的使用详解
什么是 Marker? 在 Mapbox GL JS 中,Marker(标记) 是一个可视化元素,用于在地图上标记特定的地理位置。它可以是一个默认的图标、自定义的图像,或者任何 HTML 元素。Marker 不仅能显示位置,还能…...
2k1000LA 使能 nand.
背景 : 默认的 发货的镜像 确实 是识别不了 nand 的。 ------------------------------------------------------------------------------------------ 但是 我之前 已经写好了文档,因此 拷贝到线上。 1 首先我要使能这几个。 在menuconfig 中使能一下。...
Junit+Mock
base project <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.11</version><relativePath/></parent><dependencies><!--添加mysql依…...
maven编译出错,javac: ��Ч��Ŀ�귢�а�: 17
1、异常信息 javac: ��Ч��Ŀ�귢�а�: 17 ��: javac <options> <source files> -help �����г&a…...
Vue使用Three.js加载glb (gltf) 文件模型及实现简单的选中高亮、测距、测面积
安装: # three.jsnpm install --save three 附中文网: 5. gltf不同文件形式(.glb) | Three.js中文网 附官网: 安装 – three.js docs 完整代码(简易demo): <template><div class"siteInspe…...
苹果微软双修党福音:Navicat如何优化跨系统传输性能延迟
Navicat跨系统传输卡顿本质是连接层与传输层双重延迟,主因包括SSL/TLS握手、DNS解析、非原生架构运行、逐行INSERT、小批次建连频繁及系统时间不同步。Navicat跨系统传输卡顿,本质是连接层传输层双重延迟不是mac或windows客户端“慢”,而是na…...
QtDataVisualization实战:用三维图表打造一个酷炫的数据仪表盘(附完整源码)
QtDataVisualization三维数据仪表盘开发实战 三维数据可视化在现代数据分析中扮演着越来越重要的角色。QtDataVisualization模块为开发者提供了强大的工具,能够将复杂数据转化为直观的三维图表。本文将带你从零开始,构建一个功能完善、视觉效果出色的数据…...
TPA626芯片资料(1)
一、芯片介绍1. 概述TPA626是3PEAK(思瑞浦)生产的一款双向电流和功率监测器芯片,用于精确测量电流、电压和功耗,广泛应用于电源管理、服务器和电信设备等领域。TPA626是一款电流与功率监测器,具备I2C或SMBUS兼容接口。…...
终极SI4735 Arduino收音机开发实战:从零构建你的数字广播接收系统
终极SI4735 Arduino收音机开发实战:从零构建你的数字广播接收系统 【免费下载链接】SI4735 SI473X Library for Arduino 项目地址: https://gitcode.com/gh_mirrors/si/SI4735 在物联网和智能硬件快速发展的今天,如何快速搭建一个功能全面的广播接…...
龙虾配置文件OpenClaw Workspace MD 文件源码分析总览
OpenClaw Workspace MD 文件源码分析总览 / Summary 分析日期: 2026-04-18 分析基准: OpenClaw 源码 C:\github\openclaw 文件数: 7 核心发现一览 文件 角色 排序 子Agent可见 压缩后保留 特殊代码处理 AGENTS.md 员工手册 10 (最高) ✅ ✅ Session Startup + Red Lines 提取章…...
8年后端程序员,我为何放弃幻想,转战AI大模型应用开发?(附6条血泪建议)
作者分享自身从8年后端开发转型AI大模型应用开发的经历与感悟。文章指出,AI发展带来职业焦虑,但后端并未“死亡”,而是迎来了全新的AI应用开发领域。转型者无需精通机器学习算法,应掌握Python基础、AI框架应用及实际项目经验。建议…...
AGI变现≠卖API:SITS2026圆桌闭门共识(被11国监管机构引用的“价值锚定四象限”模型首次中文详解)
第一章:AGI变现≠卖API:SITS2026圆桌闭门共识 2026奇点智能技术大会(https://ml-summit.org) 共识的诞生背景 在SITS2026大会期间,来自DeepMind、Anthropic、智谱AI及三家头部产业AI公司的CTO与产品负责人,在“AGI商业化路径”闭…...
Godot-MCP:重构游戏开发效率的AI智能协作框架
Godot-MCP:重构游戏开发效率的AI智能协作框架 【免费下载链接】Godot-MCP An MCP for Godot that lets you create and edit games in the Godot game engine with tools like Claude 项目地址: https://gitcode.com/gh_mirrors/god/Godot-MCP 在游戏开发领域…...
4.9、从CVE-2007-2447到永恒之蓝:Samba漏洞利用与RCE攻防演进
1. Samba服务与SMB协议基础 Samba这个开源软件在Linux和UNIX系统上实现了SMB协议,让不同操作系统之间能够像在Windows网络中那样共享文件和打印机。我第一次接触Samba是在2008年为一个企业部署跨平台文件共享服务时,当时就被它的兼容性所折服。 SMB协议&…...
PHP = 分配文件描述符 (FD)?
PHP 是“申请者”,操作系统内核才是“分配者”。** PHP 无法直接创建或分配文件描述符 (FD)。它只能通过调用标准库函数(如 fopen, curl_init, socket_create),向操作系统发起系统调用 (System Call),请求内核分配一个…...
