百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

全网最通俗易懂的讲解: git rebase和git merge原理和区别 [ 建议收藏]

bigegpt 2024-08-16 14:18 2 浏览


前言

我们在上篇文章你想知道的所有Git分支命令都在这中提到了git merge命令,可以将其中一个分支的代码合并到另一个分支中,其实还有另一种方法,通过 git rebase命令也可以实现,但是两者的实现方式还是有很大差异的,网上有很多文章都对其差异有讲解,但大多数说的都很模糊不够清晰,看的也是一知半解,如果一篇文章对读者而言做不到通熟易懂那就是对读者的不负责,本篇文章将使用最通熟易懂的语言让你彻底搞懂两者的差异。

先说结论:

  • merge 是一个合并操作,会将两个分支的修改合并在一起,默认操作的情况下会提交合并中修改的内容
  • merge 的提交历史记录了实际发生过什么,关注点在真实的提交历史上面
  • rebase 并没有进行合并操作,只是提取了当前分支的修改,将其复制在了目标分支的最新提交后面
  • rebase 操作会丢弃当前分支已提交的 commit,故不要在已经 push 到远程,和其他人正在协作开发的分支上执行 rebase 操作
  • merge 与 rebase 都是很好的分支合并命令,没有好坏之分,使用哪一个应由团队的实际开发需求及场景决定

先来说说 git merge的实现方式

如上图所示,我们有两个分支,master分支和test分支,test分支是基于master分支在B处的提交节点创建的,在创建后master分支又经过迭代提交了两次,从C到D节点,test分支也基于B往前继续更新了两次,到了F节点。两者从B开始就走向了分叉。

这时如果我们想将test分支合并到master分支,通过merge是如何工作的呢?

//将分支切换到master分支
git checkout master

//把test分支合并到master分支
git merge test
复制代码

从图中可以看到,这里生成了一个新的提交G,是怎么生成的呢? merge 命令 它会把两个分支的最新快照(F、E 和 D、E)以及二者最近的共同祖先(B)进行三方合并,合并的结果是生成一个新的快照G(并提交)。

git rebase实现方式

//将分支切换到master分支
git checkout master

//把test分支合并到master分支
git rebase test
复制代码

从图就可以看出和merge命令不同

这里有个名词定义我们先简单说明一下

  • test:基分支、目标分支
  • master:待变基分支,当前分支

官方解释: 当执行rebase操作时,git会从两个分支的共同祖先开始提取待变基分支上的修改,然后将待变基分支指向基分支的最新提交,最后将刚才提取的修改应用到基分支的最新提交的后面。

这句话听起来可能绕绕的,不用怕,听小蛋给你好好翻译翻译:

我们结合具体例子来说明,当我们在master (待变基分支)上执行git rebase test(基分支)时,git就会从两者的共同祖先B开始,提取master分支上的修改,也就是C,D两个commit,提取到之后git会先保存起来,然后将master分支指向test分支最新提交的节点,也就是F节点,然后把提取到的C,D接到F后面,在这个过程当中,会删除原来的C,Dcommit记录,生成新的C‘,D',虽然C',D'和原来的C,Dcoommit的内容是一样的,但是commit id是不同的。

rebase操作如果用一句话进行解释就是改变基底。master分支原来的基底是A,现在变成了以test分支最新的提交F做为新的基底了。

总结

git和rebase这两者哪种操作更好,这是取决于不同的场景的。

当我们拉取公共分支最新代码的时候建议使用rebase,也就是git pull -r或git pull --rebase,但有个缺点就是rebase以后我就不知道我的当前分支最早是从哪个分支拉出来的了,因为基底变了嘛。(如果使用merge,多出无意义的一条提交记录)。

往公共分支上合代码的时候,使用merge。(如果使用rebase,那么其他开发人员想看主分支的历史,就不是原来的历史了,历史已经被你篡改了),例如主分支是master分支,小蛋我有一个egg分支,我在egg分支上写了很多垃圾代码,然后这时候我把egg分支通过rebase命令 合并到master分支,那对于master分支来说,它之前到提交历史就没了,别的同事突然想看master分支以前的提交历史,其实就看不到了,发现只能看到我egg的提交历史,估计同事会把我的egg捏碎的,这种傻事可不要干哟。

相关推荐

了解Linux目录,那你就了解了一半的Linux系统

大到公司或者社群再小到个人要利用Linux来开发产品的人实在是多如牛毛,每个人都用自己的标准来配置文件或者设置目录,那么未来的Linux则就是一团乱麻,也对管理造成许多麻烦。后来,就有所谓的FHS(F...

Linux命令,这些操作要注意!(linux命令?)

刚玩Linux的人总觉得自己在演黑客电影,直到手滑输错命令把公司服务器删库,这才发现命令行根本不是随便乱用的,而是“生死簿”。今天直接上干货,告诉你哪些命令用好了封神!喜欢的一键三连,谢谢观众老爷!!...

Linux 命令速查手册:这 30 个高频指令,拯救 90% 的运维小白!

在Linux系统的世界里,命令行是强大的武器。对于运维小白而言,掌握一些高频使用的Linux命令,能极大提升工作效率,轻松应对各种系统管理任务。今天,就为大家奉上精心整理的30个Linu...

linux必学的60个命令(linux必学的20个命令)

以下是Linux必学的20个基础命令:1.cd:切换目录2.ls:列出文件和目录3.mkdir:创建目录4.rm:删除文件或目录5.cp:复制文件或目录6.mv:移动/重命名文件或目录7....

提高工作效率的--Linux常用命令,能够决解95%以上的问题

点击上方关注,第一时间接受干货转发,点赞,收藏,不如一次关注评论区第一条注意查看回复:Linux命令获取linux常用命令大全pdf+Linux命令行大全pdf为什么要学习Linux命令?1、因为Li...

15 个实用 Linux 命令(linux命令用法及举例)

Linux命令行是系统管理员、开发者和技术爱好者的强大工具。掌握实用命令不仅能提高效率,还能解锁Linux系统的无限潜力,本文将深入介绍15个实用Linux命令。ls-列出目录内容l...

Linux 常用命令集合(linux常用命令全集)

系统信息arch显示机器的处理器架构(1)uname-m显示机器的处理器架构(2)uname-r显示正在使用的内核版本dmidecode-q显示硬件系统部件-(SMBIOS/DM...

Linux的常用命令就是记不住,怎么办?

1.帮助命令1.1help命令#语法格式:命令--help#作用:查看某个命令的帮助信息#示例:#ls--help查看ls命令的帮助信息#netst...

Linux常用文件操作命令(linux常用文件操作命令有哪些)

ls命令在Linux维护工作中,经常使用ls这个命令,这是最基本的命令,来写几条常用的ls命令。先来查看一下使用的ls版本#ls--versionls(GNUcoreutils)8.4...

Linux 常用命令(linux常用命令)

日志排查类操作命令查看日志cat/var/log/messages、tail-fxxx.log搜索关键词grep"error"xxx.log多条件过滤`grep-E&#...

简单粗暴收藏版:Linux常用命令大汇总

号主:老杨丨11年资深网络工程师,更多网工提升干货,请关注公众号:网络工程师俱乐部下午好,我的网工朋友在Linux系统中,命令行界面(CLI)是管理员和开发人员最常用的工具之一。通过命令行,用户可...

「Linux」linux常用基本命令(linux常用基本命令和用法)

Linux中许多常用命令是必须掌握的,这里将我学linux入门时学的一些常用的基本命令分享给大家一下,希望可以帮助你们。总结送免费学习资料(包含视频、技术学习路线图谱、文档等)1、显示日期的指令:d...

Linux的常用命令就是记不住,怎么办?于是推出了这套教程

1.帮助命令1.1help命令#语法格式:命令--help#作用:查看某个命令的帮助信息#示例:#ls--help查看ls命令的帮助信息#netst...

Linux的30个常用命令汇总,运维大神必掌握技能!

以下是Linux系统中最常用的30个命令,精简版覆盖日常操作核心需求,适合快速掌握:一、文件/目录操作1.`ls`-列出目录内容`ls-l`(详细信息)|`ls-a`(显示隐藏文件)...

Linux/Unix 系统中非常常用的命令

Linux/Unix系统中非常常用的命令,它们是进行文件操作、文本处理、权限管理等任务的基础。下面是对这些命令的简要说明:**文件操作类:*****`ls`(list):**列出目录内容,显...