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

git merge和git rebase

git merge和git rebase

在Git中merge和rebase都是git在管理整合分支的两种主要工具,但是他们的工作方式、提交历史影响和使用场景不同。

git merge

在这里插入图片描述

  • 定义

    • 将两个分支的提交历史合并,创建一个新的合并提交(merge commit),保留两个分支的完整历史。但是在快进合并(fast-foward)情况下直接移动指针,保持线性历史
    • 通常是将特性分支(feature branch)合并到主分支(如main分支)
  • 工作原理

    • Git首先会找到两个分支的共同祖先节点,计算差异,然后合并代码
    • 如果没有冲突,自动合并
    • 如果有冲突,需要手动解决该冲突后生成合并提交
    • 快进模式:若目标分支无新提交,直接将指针移动到源分支,历史线性。
    • 非快进模式:生成合并提交,历史非线性,保留分支拓扑
  • 示例

    • # 将feature分支合并到main分支上
      git checkout main
      git merge feature
      
  • 快进合并(若main无新提交)

    • main指针移动到feature最新提交,历史线性
  • 非快进合并(默认或指定–no-ff)

    • 创建合并提交,历史非线性
  • 提交历史图

    • 快进合并(线性历史,修正后在一条直线上)

      • # 初始:main和feature指向A;feature新增B、C。
        # 合并后:main快进到C,历史为单条直线。
        A---B---C  (main, feature)
        
    • 非快进合并(非线性历史)

      • # 合并后:M为合并提交,指向B和D
        A---B  (main)\C---D  (feature)\M  (main, 合并提交)
        
  • 优点

    • 快进合并:生成线性历史,干净简单,适合简单整合。

    • 非快进合并:保留分支历史,反映开发过程,便于追溯。

    • 团队协作:合并提交记录分支整合,适合多人项目。

    • 简单冲突处理:冲突集中解决,生成单一提交。

    • 非破坏性:不改写历史,安全用于共享分支。

  • 缺点:

    • 非快进历史复杂:频繁非快进合并导致历史杂乱,合并提交多。
    • 非快进非线性:分支分叉增加历史图复杂度。
    • 快进需条件:仅当目标分支无新提交时快进,否则需手动指定–ff。
  • 适用场景

    • 团队开发,保留清晰的历史提交记录

git rebase

在这里插入图片描述

在这里插入图片描述

  • 定义

    • 将当前分支的提交"嫁接"到目标分支最新提交上,改写历史,始终生成线性历史
    • 用于清理本地分支或平滑整合提交
  • 工作原理

    • Git将当前分支的提交逐一应用到目标分支最新提交,生成新提交(SHA值变化)
    • 冲突需要逐一提交解决,完成后历史性
  • 示例

    • git checkout feature
      git rebase main
      
  • 结果:feature的提交重放至main最新提交,历史线性。

  • 可快进合并到main

    • git checkout main
      git merge feature
      
  • 提交历史图示(线性历史)

    • A---B---C'---D'  (main, feature)
      
  • 初始:main在A,feature有A—C—D。

  • 重放后:feature变为A—C’—D’,main快进到D’,历史为单条直线。

  • 优点

    • 干净线性历史:历史简洁,易于审查和版本管理。

    • 简化提交:可整理提交(如git rebase -i合并小提交)。

    • 便于快进合并:重放后主分支可直接快进。

    • 适合单人开发:清理本地分支,提升提交质量。

  • 缺点:

    • 历史重写:改写提交SHA值,破坏共享分支,影响协作。
    • 冲突复杂:逐提交解决冲突,工作量可能大。
    • 丢失上下文:线性历史隐藏分支来源,追溯困难。
    • 高风险:误操作可能丢失提交。
  • 适用场景

    • 适合个人开发,可以保留干净的历史提交记录

关键区别

特性git mergegit rebase
历史结构快进合并:线性;非快进合并:非线性始终线性
提交记录快进:无新提交;非快进:合并提交重写提交,无合并提交
冲突处理一次性解决所有冲突逐提交解决冲突
历史清晰度快进:干净;非快进:保留分支上下文干净,但丢失分支上下文
使用场景协作开发,需保留历史或快进合并单人开发,追求干净历史
http://www.xdnf.cn/news/433963.html

相关文章:

  • 科学养生:构建现代健康生活新范式
  • LamaIndex rag(增强检索)入门
  • MySQL:关系模型的基本理论
  • 以价值为导向的精准数据治理实践,赋能业务决策
  • 基于STM32、HAL库的SGTL5000XNLA3R2音频接口芯片驱动程序设计
  • 数据库--处理模型(Processing Model)
  • DCDC输入4.5V-65V耐压 5A电流异步降压芯片SL3075兼容替换TPS54560
  • 【蓝桥杯嵌入式】【复盘】第13届国赛真题
  • 微店根据关键词取商品列表 API 返回值说明
  • 【NextPilot日志移植】params.c解析
  • 大白话解释「量化」是什么
  • (1+x)-1次幂 (1-x)-1次幂 泰勒展开式
  • 论坛系统(中-1)
  • PostgreSQL pg_dump 与 Oracle expdp 对比
  • AI大模型从0到1记录学习 linux day22
  • 项目里程碑未被明确,如何有效控制进度
  • 网页常见水印实现方式
  • Memcached 的特性和使用场景介绍,以及集群搭建
  • sqlserver免费版每天备份数据库
  • 英语学习5.12
  • 进程与线程:08 一个实际的 schedule 函数
  • 【周输入】510周阅读推荐-1
  • 如何使用 Qwen3 实现 Agentic RAG?
  • 采用AI神经网络降噪算法的语言降噪消回音处理芯片NR2049-P
  • C++中的虚表和虚表指针的原理和示例
  • While语句数数字
  • SpringBoot核心注解详解:定义、用法与原理
  • MySQL 学习(八)如何打开binlog日志
  • 球球大作战游戏服务器
  • iOS设备投屏Archlinux