首页 > 其他分享 > git rebase详解(图解+最简单示例,一次就懂)

git rebase详解(图解+最简单示例,一次就懂)

时间:2022-09-02 17:24:08浏览次数:82  
标签:git 示例 rebase feature master 提交 分支

引言

网上有太多讲rebase和merge的文章,但大多都是复制粘贴没有自己的理解,而且很多博客的例子写的过于复杂,让人没兴趣看下去。本文举最简洁的例子,大白话几句就让你快速掌握rebase的核心原理和用法。

本博客将持续修订更新,看完如果还是有疑问,可以评论区留言,我解释到你彻底搞懂为止!


一、提交节点图解

首先通过简单的提交节点图解感受一下rebase在干什么

两个分支master和feature,其中feature是在提交点B处从master上拉出的分支

master上有一个新提交M,feature上有两个新提交C和D
在这里插入图片描述
此时切换到feature分支上,执行如下命令,相当于是想要把master分支合并到feature分支(这一步的场景就可以类比为我们在自己的分支feature上开发了一段时间了,准备从主干master上拉一下最新改动)

git checkout feature
git rebase master

//这两条命令等价于git rebase master feature
 
  • 1
  • 2
  • 3
  • 4

下图为变基后的提交节点图,解释一下其工作原理:
在这里插入图片描述

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

官方解释(如果觉得看不懂可以直接看下一段):当执行rebase操作时,git会从两个分支的共同祖先开始提取待变基分支上的修改,然后将待变基分支指向基分支的最新提交,最后将刚才提取的修改应用到基分支的最新提交的后面。

结合例子解释:当在feature分支上执行git rebase master时,git会从master和featuer的共同祖先B开始提取feature分支上的修改,也就是C和D两个提交,先提取到。然后将feature分支指向master分支的最新提交上,也就是M。最后把提取的C和D接到M后面,但这个过程是删除原来的C和D,生成新的C’和D’,他们的提交内容一样,但commit id不同。feature自然最后也是指向D’。

通俗解释(重要!!):rebase,变基,可以直接理解为改变基底。feature分支是基于master分支的B拉出来的分支,feature的基底是B。而master在B之后有新的提交,就相当于此时要用master上新的提交来作为feature分支的新基底。实际操作为把B之后feature的提交存下来,然后删掉原来这些提交,再找到master的最新提交位置,把存下来的提交再接上去(新节点新commit id),如此feature分支的基底就相当于变成了M而不是原来的B了。(注意,如果master上在B以后没有新提交,那么就还是用原来的B作为基,rebase操作相当于无效,此时和git merge就基本没区别了,差异只在于git merge会多一条记录Merge操作的提交记录)

上面的例子可抽象为如下实际工作场景:张三从B拉了代码进行开发,目前提交了两次,开发到D了;李四也从B拉出来开发了并且开发完毕,他提交到了M,然后合到主干上了。此时张三想拉下最新代码,于是他在feature分支上执行了git rebase master,即把master分支给rebase过来,由于李四更早开发完并合了主干,如此就相当于张三是基于李四的最新提交M进行的开发了。


二、实际git提交示例

按照上面的图解构造了提交记录,如下图所示:(ABM是master分支线,ABCD是feature分支线。这里画成了master变色分叉出来,这不影响理解,知道是表示两个分支两条线即可!)
在这里插入图片描述
此时,在feature分支上执行git rebase master

变基完成以后,ABCD是原来的feature分支线,ABMC’D’是新的feature分支线,ABM是master分支线(没有变化)
在这里插入图片描述


三、推荐使用场景

搞来搞去那么多,这其实是最重要的。不同公司,不同情况有不同使用场景,不过大部分情况推荐如下:

  1. 自己单机的时候,拉公共分支最新代码的时候使用rebase,也就是git pull -r或git pull --rebase。这样的好处很明显,提交记录会比较简洁。但有个缺点就是rebase以后我就不知道我的当前分支最早是从哪个分支拉出来的了,因为基底变了嘛,所以看个人需求了。
  2. 往公共分支上合代码的时候,使用merge。如果使用rebase,那么其他开发人员想看主分支的历史,就不是原来的历史了,历史已经被你篡改了。举个例子解释下,比如张三和李四从共同的节点拉出来开发,张三先开发完提交了两次然后merge上去了,李四后来开发完如果rebase上去(注意李四需要切换到自己本地的主分支,假设先pull了张三的最新改动下来,然后执行<git rebase 李四的开发分支>,然后再git push到远端),则李四的新提交变成了张三的新提交的新基底,本来李四的提交是最新的,结果最新的提交显示反而是张三的,就乱套了。
  3. 正因如此,大部分公司其实会禁用rebase,不管是拉代码还是push代码统一都使用merge,虽然会多出无意义的一条提交记录“Merge … to …”,但至少能清楚地知道主线上谁合了的代码以及他们合代码的时间先后顺序

四、总结

无论是个人开发,还是公司协作开发,只要没有特殊需求,用merge准没错!!

参考文章:图解 Git 基本命令 merge 和 rebase

标签:git,示例,rebase,feature,master,提交,分支
From: https://www.cnblogs.com/tiancai/p/16650616.html

相关文章

  • Git忽略规则和.gitignore规则不生效的解决办法
    Git忽略规则:在git中如果想忽略掉某个文件,不让这个文件提交到版本库中,可以使用修改根目录中.gitignore文件的方法(如果没有这个文件,则需自己手工建立此文件)。这个文件每一......
  • GIT解决 ssh-add ~/.ssh/id_rsa:Could not open a connection to your authentication
    如需配置本地同时使用多个git账号,请参考配置本地GIT同时使用多个账号输入ssh-add~/.ssh/id_rsa_me  解决办法:1、输入eval`ssh-agent-s` 2、再次输入ssh-......
  • 日常开发记录- git 添加多个远程仓库
    应用场景:同步不同服务器下的项目开发进度查看远程仓库:gitremote-v添加远程仓库:temp是新的远程仓库名,不能与master重名,这样就做好本地与远程的关联了gitremote......
  • Docker 部署GitLabs 版本升级 13.9.x -> 15.3.x
    Gitlabs版本升级大版本不能直接跳级升级,可以参考官方的升级路径。本人是从13.9.x需要升级到最新的15.3.x。参考官方路径结合自己的实际情况成功升级。13.9.0->13.12.......
  • Github基于令牌身份验证配置及使用
    目录1、前言2、配置3、使用1、前言从2021年8月31日起,Github不再支持通过密码进行身份验证,将要求使用基于令牌(token)的身份验证。2、配置第一步:进入GIthub首页,点击头像......
  • Electron 打包vue 桌面应用 :eosforce github代码 编译遇到很多问题
    eosforce/wallet-desktop:eosforce桌面钱包https://github.com/eosforce/wallet-desktop要会的知识永久使用淘宝镜像代理npmconfigsetregistryhttps://registr......
  • GitLab备份
    目录GitLab备份配置备份信息gitlab的备份gitlab备份恢复GitLab备份配置备份信息gitlab配置文件/etc/gitlab/gitlab.rb:gitlab_rails['manage_backup_path']=truegit......
  • GitHub Universe 2022 All In One
    GitHubUniverse2022AllInOneGitHub年度全球开发者大会Let'sbuildfromhereJoinusforGitHub'sglobaldevelopereventforcloud,security,community,......
  • cmake是什么,为什么现在都用cmake,cmake编译原理和跨平台示例
    一cmake是什么? CMake是一个开源、跨平台的工具系列,是用来构建、测试和打包软件。CMake使用平台无关的配置文件来控制软件编译过程,并生成可在您选择的编译器环境中使用......
  • Git使用经验总结
    问题一:获取服务器上不存在对象报错内容:  分析过程:1、一开始以为是文件过大的问题,然后就去下载了GitLargeFileStorage,弄了之后发现还是不行2、使用gitlfsfetch......