对git rebase 和git merge的理解

2023-11-12

一、是什么

在使用 git 进行版本管理的项目中,当完成一个特性的开发并将其合并到 master 分支时,会有两种方式:

  • git merge
  • git rebase

git rebase 与 git merge都有相同的作用,都是将一个分支的提交合并到另一分支上,但是在原理上却不相同

用法上两者也十分的简单:

git merge

将当前分支合并到指定分支,命令用法如下:

git merge xxx 

git rebase

将当前分支移植到指定分支或指定commit之上,用法如下:

git rebase -i <commit> 

常见的参数有--continue,用于解决冲突之后,继续执行rebase

git rebase --continue 

二、分析

git merge

通过git merge将当前分支与xxx分支合并,产生的新的commit对象有两个父节点

如果“指定分支”本身是当前分支的一个直接子节点,则会产生快照合并

举个例子,bugfix分支是从master分支分叉出来的,如下所示:

合并bugfix分支到master分支时,如果master分支的状态没有被更改过,即 bugfix分支的历史记录包含master分支所有的历史记录

所以通过把master分支的位置移动到bugfix的最新分支上,就完成合并

如果master分支的历史记录在创建bugfix分支后又有新的提交,如下情况:

这时候使用git merge的时候,会生成一个新的提交,并且master分支的HEAD会移动到新的分支上,如下:

从上面可以看到,会把两个分支的最新快照以及二者最近的共同祖先进行三方合并,合并的结果是生成一个新的快照

git rebase

同样,master分支的历史记录在创建bugfix分支后又有新的提交,如下情况:

通过git rebase,会变成如下情况:

在移交过程中,如果发生冲突,需要修改各自的冲突,如下:

rebase之后,master的HEAD位置不变。因此,要合并master分支和bugfix分支

从上面可以看到,rebase会找到不同的分支的最近共同祖先,如上图的B

然后对比当前分支相对于该祖先的历次提交,提取相应的修改并存为临时文件(老的提交X和Y也没有被销毁,只是简单地不能再被访问或者使用)

然后将当前分支指向目标最新位置D, 然后将之前另存为临时文件的修改依序应用

三、区别

从上面可以看到,merge和rebasea都是合并历史记录,但是各自特性不同:

merge

通过merge合并分支会新增一个merge commit,然后将两个分支的历史联系起来

其实是一种非破坏性的操作,对现有分支不会以任何方式被更改,但是会导致历史记录相对复杂

rebase

rebase会将整个分支移动到另一个分支上,有效地整合了所有分支上的提交

主要的好处是历史记录更加清晰,是在原有提交的基础上将差异内容反映进去,消除了 git merge所需的不必要的合并提交

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对git rebase 和git merge的理解 的相关文章

  • 为什么在 Eclipse 中对 Egit 管理的项目禁用合并工具?

    根据Egit 用户指南 http wiki eclipse org EGit User Guide Using Merge Tool 要使用合并工具 应右键单击存在合并冲突的资源 然后选择Team gt 合并工具 但是 当我执行此操作时 合
  • 如何使用“gem install”命令从私有 GitHub 存储库安装 gem

    如何在本地安装托管在 GitHub 上的私人存储库中的 gem 特别是 我们通过gem install命令而不是在 Bundler 中使用 因为它是一个命令行工具 我尝试这样做 gem install githubname repo s h
  • 通过链接进入 git-repo,无需冗长的对话框

    In a directory I have symbolic links into a git administered directory all under Linux Every time I want to e dit such a
  • 当出现错误时如何删除远程分支?

    我尝试过以下命令 但失败了 git push origin next remote error denying ref deletion for refs heads next To blah git remote rejected nex
  • Github 操作测试之前是否进行了包含特定单词的提交

    我需要确保使用 github 操作进行测试 如果之前已进行包含该单词的提交build 如果提交不包含单词build那么不应运行 github 操作的测试 你能给我一些建议吗 Test name Testing on push branche
  • 如何查看 github 的 SSH 密钥?

    我最近收到一封来自 Github 的电子邮件 要求我检查我的 SSH 密钥 请检查您的钥匙并确保您 认出他们 如果您有任何疑问 请拒绝钥匙并 上传新密钥 如何在 ubuntu 11 10 上使用 git 检查我的密钥 您可以按照 GitHu
  • Eclipse 与外部 src 和 Web 内容文件夹链接或映射

    首先这不是问题但是我遇到的问题的解决方案浪费了4 5个小时来找到解决方案 请让我知道是否有更好的替代方法来使用 eclipse 项目管理外部 src 文件夹 我正在使用版本控制系统 GIT 来管理我的项目 还使用外部 Git 客户端 Sou
  • git checkout 到分支需要很长时间

    我使用的是 Ubuntu 17 10 并且使用 git 版本 2 14 1 每当我从 master 创建一个分支并尝试签出它 或从它签出到 master 时 都会花费大量时间 大约几分钟 有时接近 10 分钟 确实 我有几 GB 的数据 但
  • TeamCity 将功能分支推送到主分支

    有没有办法将成功构建的功能分支推送到另一个分支 我想要这样的东西 Git 存储库 Gitorious GitHub 等 分支机构 master 当前项目的代码 质量保证 代码等待 QA 的分支 功能分支 许多远程分支 开发人员可以在其中开发
  • 获取最新远程提交的 SHA1 [重复]

    这个问题在这里已经有答案了 可能的重复 git bash 如何检查是否有新的提交可用 https stackoverflow com questions 6006759 git bash how to check if theres a n
  • git Blame:合并后正确的作者

    GIT 合并引入了新的提交 这会导致 git Blame 问题 合并的行似乎是由进行合并的开发人员提交的 我可以理解这种情况冲突的变化 因为他解决了冲突 但是有没有办法让非冲突线路不发生这种情况呢 一些 git Blame 的选择 如果没有
  • 在centos上设置jenkins:ssh密钥和git的问题

    经历了很多问题 但似乎没有什么能解决我的问题 或者更准确地说 我不确定我是否正确地完成了整个事情 所以这里是 已安装centos 6 3操作系统 然后我按照以下指南安装詹金斯 https wiki jenkins ci org displa
  • 如何将 GIT 调用的输出获取到批处理脚本中的变量中?

    我有一个 git 命令来获取当前存储库的最新 SHA 如下所示 git log pretty format H n 1 我有一个 Windows 批处理脚本 我想按如下方式使用它 SET CURRENT SHA 但我不知道如何将从 git
  • Git post-receive - 如何检查推送的分支是否与主分支合并

    在我们的团队中 我们通常将所有任务推送到单独的分支中 然后发布经理审查这些分支并将它们合并到 主 分支中 有时团队成员忘记将他们的分支与主分支合并 在推送之前 所以我想做的是 在用户推送后输出一条消息 请与主分支合并 我想我需要检查一些内容
  • 从自己的 gitlab 服务器安装节点模块

    我想从我们的 gitlab 服务器安装节点模块 这是存储库的链接 http ABCD GITLAB myGroup myNodeModule git http ABCD GITLAB myGroup myNodeModule git 根据n
  • GIT - 推送到 (GitHub) origin master 没有任何作用

    我已经分叉了某人的 GIT 存储库 https github com nippysaurus toodledo objc 将其克隆到我的本地计算机 显示带有以下信息的来源 remote origin Fetch URL https emai
  • 您的分支比“origin/master”领先 3 个提交

    我在运行时收到以下信息git status Your branch is ahead of origin master by 3 commits 我读过其他一些帖子 解决这个问题的方法是运行git pull rebase但是 rebase
  • 如何关闭分支而不将其从 git 的历史记录中删除?

    我想提交并关闭其分支 而不将其从历史中删除 有了水银我会commit close branch then update转到上一个 然后继续工作 有了 git 我很困惑 没有与 Git 中关闭分支完全相同的方法 因为 Git 分支比 Merc
  • 清理远程 Git 分支

    我已经将 SVN 存储库移至 Git 可能由于多次克隆 我现在只剩下一堆看起来像这样的分支 BranchA origin BranchA remotes BranchA remotes origin BranchA remotes orig
  • SSL 适用于浏览器、wget 和curl,但不适用于 git

    我有一个网站 用于托管 redmine 和几个 git 存储库 这非常适合 http 但我无法使用 https 进行克隆 即 git clone http mysite com git test git 工作正常 但是 git clone

随机推荐

  • STM32内部参考电压+DMA精准采集电池电压

    最近项目又遇到了电池电压采集 锂电池的电压范围是4 2到2 8一般 当锂电池低于3 3V时 单片机供电电压会小于3 3V 那么电池电压参考计算4096就不能对应3 3 所以必须采用内部参考电压 我项目中用到的是RP104N331 LDO 实
  • openwrt上nginx启动报错nginx: [emerg] getpwnam("www") failed

    检查nginx的配置文件 etc nginx nginx conf 里面配置里确实有这一项 user nobody nogroup user www www worker processes 2 系统的用户又没有www这个用户 这就尴尬了
  • 本地缓存技术分享

    本地缓存 缓存分为本地缓存与分布式缓存 本地缓存为了保证线程安全问题 一般使用ConcurrentMap的方式保存在内存之中 而常见的分布式缓存则有Redis MongoDB等 一致性 本地缓存由于数据存储于内存之中 每个实例都有自己的副本
  • 深度学习&强化学习&进化计算 入门资源整理

    深度学习 强化学习 进化计算 入门资源整理 深度学习 在线课程 在线书籍 学习Python 强化学习 在线课程 在线书籍 更多资源 进化计算 后记 深度学习 在线课程 深度学习是机器学习领域的一个分支 想要入门深度学习 最好先对机器学习的一
  • 学会了,不会ps也能更换自己的证件照底色,制作自己的证件照

    证件照经常会由于背景色与要求不符而不能用 再去拍一组浪费时间和金钱 如何省时省力的把照片背景色修改成我们所需要的底色呢 说到修改照片背景色 首先想到大家常用的证件照 根据不同用处会要求 白 蓝 红 底色 在过去大家可能需要去图片社重新照 或
  • [631]一行js代码识别Selenium+Webdriver

    文章目录 一行js代码识别Selenium Webdriver 如何正确移除Selenium中的 window navigator webdriver 最新版 附一些网站检测selenium的示例 driver execute script
  • ESP32 SIM800L:发送带有传感器读数的文本消息(SMS警报)

    在这个项目中 我们将使用T Call ESP32 SIM800L模块创建一个SMS通知系统 当传感器读数高于或低于特定阈值时 该模块会发送SMS 在此示例中 我们将使用DS18B20温度传感器 并在温度高于28 C时发送短信 一旦温度降低到
  • uniapp使用scroll-view实现左右,上下滑动

    uniapp使用scroll view实现左右 上下滑动 阐述 我们在项目中往往都能遇到实现左右滑动跟上下滑动的需求 不需要安装better scroll uniapp 自带的scroll view 就可以实现了 实现左右滑动
  • 开源项目,源码

    GitHub 优秀的 Android 开源项目 转自 http blog csdn net shulianghan article details 18046021 主要介绍那些不错个性化的View 包括ListView ActionBar
  • java基础03:final

    说明 final是java的一个关键字 是最终的意思 final 表示 最后的 最终的 含义 变量一旦赋值后 不能被重新赋值 被 final 修饰的实例变量 就是已经实例化的对象 必须显式指定初始值 final 修饰符通常和 static
  • Flash钓鱼->CS上线(免杀过火绒、360等)

    先看结果 访问钓鱼页面 点击立即升级即把马儿下载下来了 这个马儿是rar压缩的 做成的rar解压自启动 所以是个exe的文件 然后这里为了像一点 把图标给改了 双击运行 查看效果 首先CS是没东西的 解压路径现在也是没东西的 这里我把解压路
  • C#值参数和引用参数

    C 值参数和引用参数 一 值参数 未用ref或out修饰符声明的参数为值参数 使用值参数 通过将实参的值复制到形参的方式 把数据传递到方法 方法被调用时 系统做如下操作 在栈中为形参分配空间 复制实参到形参 值参数的实参不一定是变量 它可以
  • 几年的Unity学习总结

    stream 其中类Stream为抽象类 由此有三个派生类 需要引入命名空间 using System IO MemoryStream 对内存进行读取与写入 BufferedStream 对缓冲器进行读取 写入 FileStream 对文件
  • access统计班级人数_使用ACCESS查询统计分数段人数

    不少人都知道使用电子表格 excel 进行分数段统计 使用access的人也可以用它设计查询进行分数段人数统计 这里假设你有一个access表 也可以是基表的查询 名叫tblScore 当然可以是中文名称 只不过代码内也要作相应修改 表内是
  • 大数据挖掘简介

    大数据挖掘涉及如下的课程 机器学习 统计学 人工智能 数据库等 但是更多的注重如下的特性 1 可扩展性 Scalability 大数据 2 算法和架构 3 自动的处理大数据 我们需要学习挖掘不同类型的数据 1 高维的数据 2 图数据 3 无
  • Vue技术 v-cloak指令(用于在 Vue 实例加载和编译之前隐藏元素)

    1 v cloak 指令的用法 v cloak 指令通常与 CSS 配合使用 用于在 Vue 实例加载和编译之前隐藏元素 通过给元素添加 v cloak 属性 然后在 CSS 中定义对应的样式 可以确保在 Vue 实例加载完成前 该元素的内
  • flex布局——flex-direction属性

    1 flex布局原理 1 flex是flexible Box的缩写 意为 弹性布局 用来为盒状模型提供最大的灵活性 任何一个容器都可以指定为flex布局 当我们为父盒子设为flex布局以后 子元素的float clear 和vertical
  • CentOS 7.9搭建Discuz 3.5论坛(LNMP)

    这里写目录标题 安装规格 安装nginx 安装依赖 编译配置Nginx 安装MySQL 设置MySQL Yum源并安装MySQL 查看MySQL初始密码并修改 安装并配置PHP 下载并解压Discuz 3 5 安装Discuz 安装规格 安
  • MMSegmentation笔记06:推理

    1 单张图像预测 author Seaton Time 2023 8 19 15 38 IDE PyCharm Summary 使用训练好的模型进行单张图像推理 import cv2 import matplotlib pyplot as
  • 对git rebase 和git merge的理解

    一 是什么 在使用 git 进行版本管理的项目中 当完成一个特性的开发并将其合并到 master 分支时 会有两种方式 git merge git rebase git rebase 与 git merge都有相同的作用 都是将一个分支的提