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

git rebase和git merge的区别

目录

1.git rebase作用

2.git rebase和git merge的区别

①工作方式

②对提交历史的影响

③适用场景


1.git rebase作用

git rebase 用于将一个分支上的变更重新应用到另一个分支上。这个命令在需要合并分支,但希望保持一个清晰、线性的提交历史时特别有用。它可以将一系列的提交“重新应用”到新的基准点(base point)上,使得提交历史看起来像是从该基准点直接派生出来的。

假设你有两个分支:feature 和 main。feature 分支上有一系列的提交,你希望将这些提交应用到 main 分支上,但又不希望创建一个合并提交(merge commit)。这时,你可以使用 git rebase。

(1)首先切换到要重新基准的分支:你需要切换到你想重新基准的分支,这里是 feature 分支。

git checkout feature

(2)然后执行 rebase 操作:执行 git rebase 命令,并指定你想要重新基准的基准点所在的分支,这里是 main 分支。

git rebase main

这个命令会尝试将 feature 分支上的每一个提交,在 main 分支的当前状态上重新应用。如果在这个过程中发生冲突,Git 会暂停 rebase 过程,并让你解决冲突。解决冲突后,使用 git add 来标记冲突已解决,然后使用 git rebase --continue 来继续 rebase 过程

(3)完成 rebase:如果 rebase 过程顺利完成,没有冲突或所有冲突都已解决,那么 feature 分支上的提交就会被重新应用到 main 分支的最新状态上,且提交历史会是线性的。

如果你在 rebase 过程中想要取消并回到 rebase 开始前的状态,可以使用 git rebase --abort。如果 rebase 已经完成,但你想要撤销这些更改,可能需要使用 git reset。

2.git rebase和git merge的区别

git rebase和git merge都是Git中用于合并分支的常用命令。

区别简述:merge 会创建一个新的合并提交来记录两个分支的合并点,而 rebase 则会改变历史,使得分支看起来像是直接在目标分支上工作的一样。选择哪种方式取决于你的项目需求和个人偏好。

区别详述:

①工作方式

  • git rebase:
    • 将当前分支的提交(或一系列提交)逐个重新应用到目标分支的最新提交上。
    • 这样做会创建一个新的提交历史,使得当前分支的提交看起来像是直接在目标分支上进行的。
    • 它会改变当前分支的提交历史,因为每个提交都会被重新创建并应用在新的基础上。
  • git merge:
    • 将两个或多个分支的更改合并到一个新的提交中。
    • 这个新提交有两个或多个父提交,分别指向合并之前的各个分支。
    • 它保留了原始分支的提交历史,并在合并点创建一个新的提交来记录合并操作。

②对提交历史的影响

  • git rebase:
    • 修改了提交历史,使得提交历史更加线性和清晰。
    • 由于提交被重新创建,它们的SHA-1哈希值会发生变化。
    • 如果已经将更改推送到远程仓库,使用git rebase后可能需要使用git push --force来强制推送更改,这可能会覆盖远程仓库中的历史。
  • git merge:
    • 保留了原始分支的提交历史,并在合并点添加了一个新的提交。
    • 提交历史中保留了分支之间的关系和合并点,有助于理解分支的演变过程。
    • 不会改变已有提交的SHA-1哈希值。

③适用场景

  • git rebase:
    • 适用于保持提交历史的整洁和线性,特别是在个人或小型团队项目中。
    • 常用于将feature分支的更改合并到主分支之前,以清理提交历史。
    • 注意不要在公共分支上使用git rebase,因为它会改变历史,可能导致其他开发者的困惑和冲突。
  • git merge:
    • 适用于需要保留分支历史和合并信息的场景。
    • 常用于合并长期维护的分支(如feature分支或develop分支)到主分支(如master或main)或其他稳定分支。
    • 在多人协作的项目中,使用git merge可以保留完整的分支历史,有助于团队成员理解项目的演变过程。


end

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • EazyDraw for Mac 矢量图绘制设计软件
  • MySQL 学习笔记之事务操作
  • yd云手机登录算法分析
  • EXCEL 分段排序--Excel难题#86
  • 趣味算法------尾部零的个数(C语言,python双重解法)
  • 【微信小程序】使用 npm 包 - API Promise化-- miniprogram-api-promise
  • 出现Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplate‘ are requiredProperty报错
  • C语言函数介绍(上)
  • [Qt][QSS][下]详细讲解
  • Makefile简单使用
  • [论文笔记]Improving Retrieval Augmented Language Model with Self-Reasoning
  • 基于神经塑性的地球观测多模态基础模型 (慕尼黑工业大学, TUM)
  • zookeeper集群安装
  • 标配M4芯片!苹果三款Mac新品蓄势待发
  • lucene搜索关键词错误
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • css选择器
  • CSS中外联样式表代表的含义
  • HTTP那些事
  • JDK 6和JDK 7中的substring()方法
  • Protobuf3语言指南
  • webpack4 一点通
  • Webpack入门之遇到的那些坑,系列示例Demo
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 学习笔记TF060:图像语音结合,看图说话
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • 原生 js 实现移动端 Touch 滑动反弹
  • Hibernate主键生成策略及选择
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • # centos7下FFmpeg环境部署记录
  • $ git push -u origin master 推送到远程库出错
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (1)SpringCloud 整合Python
  • (1)svelte 教程:hello world
  • (2)nginx 安装、启停
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (solr系列:一)使用tomcat部署solr服务
  • (附源码)ssm旅游企业财务管理系统 毕业设计 102100
  • (佳作)两轮平衡小车(原理图、PCB、程序源码、BOM等)
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (每日一问)设计模式:设计模式的原则与分类——如何提升代码质量?
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (顺序)容器的好伴侣 --- 容器适配器
  • (四)鸿鹄云架构一服务注册中心
  • (四)进入MySQL 【事务】
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .Family_物联网
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .NET Micro Framework初体验(二)
  • .NET 快速重构概要1