当前位置: 首页 > news >正文

git merge和git rebase的区别

git mergegit rebase 是 Git 中两种整合不同分支代码的核心命令,它们的最终目的都是将一个分支的修改合并到另一个分支,但实现方式和对提交历史的影响有本质区别。

核心区别:历史记录的处理方式

  • git merge:通过创建一个新的合并提交(merge commit) 来整合两个分支的修改,保留分支的原始提交历史,形成非线性历史(允许分支分叉)。
  • git rebase:通过将一个分支的所有提交“移植”到另一个分支的最新提交上,形成线性历史(消除分支分叉),不会创建新的合并提交,而是改写提交历史。

工作流程对比

假设存在两个分支:master(主分支)和 feature(功能分支),且 feature 基于 master 的某个提交创建,之后两者都有新的提交:

master:  A -> B -> C  \  
feature:        D -> E  
1. git merge 流程

执行 git checkout master && git merge feature 后:

  • Git 会对比 master 的最新提交(C)和 feature 的最新提交(E),以及它们的共同祖先(B)。
  • 计算差异后,创建一个新的合并提交 F,其父提交同时指向 CE,表示“将 feature 合并到 master”。

最终历史:

master:  A -> B -> C -> F  \       /  
feature:        D -> E  

特点

  • 保留 feature 分支的完整提交历史(DE)和 master 的历史(C)。
  • 新增一个合并提交 F,明确记录“合并”这一操作。
2. git rebase 流程

执行 git checkout feature && git rebase master 后:

  • Git 会将 feature 分支中基于 B 的所有提交(DE)“剥离”,并重新应用到 master 的最新提交(C)之后。
  • 原来的 DE 会被替换为新的提交 D'E'(内容相同,但提交哈希不同,因为基础提交变了)。

最终历史:

master:  A -> B -> C  \  
feature:            D' -> E'  

此时若再将 feature 合并到 mastergit checkout master && git merge feature),由于历史已线性化,Git 会执行“快进合并”(fast-forward),直接将 master 指针移动到 E',无需创建新的合并提交:

master:  A -> B -> C -> D' -> E'  
feature:                    ↑  

特点

  • 消除了分支分叉,历史记录呈线性(类似“一条直线”)。
  • feature 分支的提交(DE)被“改写”为 D'E',提交历史更简洁。

优缺点对比

维度git mergegit rebase
历史记录保留完整分支历史(包括分叉和合并),更真实反映开发过程。历史线性化,无分叉,更简洁易读,但改写了原始提交历史。
合并提交会创建新的合并提交(增加历史节点)。不创建新提交,直接复用/改写原有提交。
冲突处理合并时仅需处理一次冲突(所有差异集中解决)。可能需要多次处理冲突(每个被移植的提交都可能冲突)。
协作安全性安全,不修改已有提交,适合公共分支(如 master)。危险,改写提交历史,若分支已推送到远程,需强制推送(-f),可能覆盖他人修改,适合个人本地分支或未公开分支。
适用场景合并公共分支(如 masterdevelop)、保留协作痕迹。同步上游分支更新(如 feature 同步 master 最新代码)、整理个人分支提交(使历史清晰)。

关键使用原则

  1. 公共分支(如 masterdevelop:优先用 git merge,避免 rebase 改写历史,防止影响其他开发者。
  2. 个人开发分支(如 featurebugfix:可用 git rebase 同步上游分支(如 master)的最新代码,保持本地历史整洁。
  3. 已推送到远程的分支:禁止用 rebase(除非确定无人基于该分支开发),否则需强制推送(git push -f),可能导致协作冲突。
  4. 冲突处理:若冲突少,rebase 可保持历史整洁;若冲突多,merge 一次解决更高效。

总结

  • git merge 是“合并并记录过程”,适合保留历史原貌,强调协作痕迹。
  • git rebase 是“改写并整合历史”,适合追求简洁线性历史,强调代码演进逻辑。

选择哪个命令取决于团队协作规范和对历史记录的需求,核心原则是:不轻易在公共分支上使用 rebase

http://www.lryc.cn/news/615983.html

相关文章:

  • MIRO中文本如何传入FI凭证的
  • 基于Spring SSE构建实时监控系统
  • SpringCloud详细笔记
  • es-drager-blog
  • Java 日常开发笔记(小程序页面交互传参-id)
  • 震动马达实现库函数版(STC8)
  • 升级 JDK 17 碰到的请求 https 问题
  • 如何在Python中使用flask框架搭建web服务?
  • org.apache.hadoop.hbase.TableNotFoundException: ApplicationIndex
  • C/C++类型转换(C++四大强制类型转换)
  • 6.3 完成 RAG
  • TSF应用开发与运维部署
  • 下载UOS桌面专业版系统镜像
  • 强制类型转换
  • [TryHackMe]OverPass2(流量包分析+sha256+suid提权)
  • 【Vue✨】Vue3 中英文切换功能实现
  • 计算机网络:如何理解目的网络不再是一个完整的分类网络
  • RAG技术与应用
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘optuna’问题
  • Linux环境下实现简单TCP通信(c)
  • TypeScript 中的as const是什么?
  • Shell脚本-变量的分类
  • 从零到精通:嵌入式BLE开发实战指南
  • Spring Boot 全局异常处理与日志监控实战
  • go加速配置(下载第三方库)
  • 元数据管理与数据治理平台:Apache Atlas 通知和业务元数据 Notifications And Business Metadata
  • 《Go小技巧易错点100例》第三十七篇
  • 元数据管理与数据治理平台:Apache Atlas 分类传播 Classification Propagation
  • SQL(结构化查询语言)的四大核心分类
  • 【机器学习深度学习】Embedding 模型详解:从基础原理到实际应用场景