git rebase 详解

文章目录

  • 一、重建提交历史
    • [1. 功能原理](#1. 功能原理)
    • [2. 使用方法](#2. 使用方法)
    • [3. 使用场景:](#3. 使用场景:)
    • [4. rebase VS merge](#4. rebase VS merge)
      • [4.1 异同点](#4.1 异同点)
      • [4.2 使用rebase进行合并的好处](#4.2 使用rebase进行合并的好处)
      • [4.3 小结](#4.3 小结)

git rebase,顾名思义即变基,不过这是一条多功能命令,既可以重建提交历史,还可以整合不同分支间的变更。

本文将对相关功能进行介绍。

文中的截图为使用git 练习平台创建的,不熟悉git的可以使用这个练习一下。

一、重建提交历史

该功能也即rebase的本意:变基。

1. 功能原理

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

2. 使用方法

git 复制代码
git rebase [基节点] 
git rebase [基节点] [待变基节点]

这里可以看到rebase后面的参数可以是两个也可以是一个,当rebase为一个参数的时候其实是省略了第二个参数,第二个参数为HEAD指针当前指向的那个节点。

3. 使用场景:

在一个新项目中,你们的代码经过多次开发终于上线了,为了便于说明,我们先假设所有的代码提交都是在主分支 main 上进行的(别问主分支为什么不叫master,GitHub改版之后的默认分支名改成main了,这里与时俱进一下),并且已经有了C0,C1,C2三个节点的提交(这里的节点名C0用以代指相关commit操作完成后得到的那个HASH值,下同)。

此时你的leader想到了一个好的功能点,并专门指派你去将这个功能开发出来。与此同时,main 分支上仍有其它小伙伴进行更新提交。

于是,过了一段时间,你们的git分支大概被整成了这样:你在你的分支上一次提交了三次:C3,C4,C5。你们的主分支在此期间更新了C6,C7,C8三个节点

现在要进行功能合并:将你开发新功能的feature分支合并到主分支上。

此时你可能会脱口而出:"merge一下不就好了吗?"

的确。如果你之前几乎没用过这个命令的话,这是最自然而然的一种做法。

但是今天我们要聊的是rebase,接下来先看一下使用rebase是怎么解决的:

(1)首先切换到feature分支:

git 复制代码
git checkout feature

(2)然后执行变基操作:

git 复制代码
git rebase main
#此处我们使用了带有一个参数的命令
#如果使用带有两个参数的命令则是:git rebase main feature

操作后的结果是这样的:

(其实我觉得这个图画的有点问题,合并后的分支仍然是feature,但是原来的main分支是没有变的,想要合并还需在main分支上执行git merge操作)

根据前文所描述的操作原理:

  1. 首先,它会找出当前所在分支和变基分支的共同Parent,即C2;
  2. 然后,将当前分支中C2之后节点的快照暂存,即:C3,C4,C5;
  3. 最后,将刚刚提取的修改应用到基分支main的最新提交的后面,便得到了上图。

如果采用merge呢?

git 复制代码
git checkout main
git merge feature

操作结果如下:

可以看到:在主分支main后面生成了一个新的节点C9(生成新节点也同时意味着这里会有一条日志:Merge XXX from XXX)。

底层的操作原理为:先将主分支的最新节点C8的快照,feature分支最新节点C5的快照与两个分支共同Parent节点C2的快照执行三路合并生成新的快照,并基于此快照生成一个连接主分支与feature分支的节点C9,最后调整main的指向。

4. rebase VS merge

4.1 异同点

首先二者都具备整合分支间变更的能力,但二者的实现手段却大不相同:git merge总是在推进提交历史,并不会影响提交的原始状态,而git rebase整合变更的方式则是对提交历史进行重写,但从结果上看,最后git rebase形成的节点C5`与git merge形成的节点C9完全相同。

4.2 使用rebase进行合并的好处

rebase不产生新节点,当然也不会产生新的commit日志,但是merge过程中会产生一条几乎"无用"的Merge日志。

rebase产生冲突并合并冲突发生在你操作git rebase时,而合并冲突这个操作是你自己进行的;但是你提交合并申请的时候一般情况下会有评审,由评审者解决冲突,开发者人多的情况下工作量可想而知。

4.3 小结

在日常的小规模项目开发中,这种差异几乎可以忽略。但是在复杂的多人协作开发场景下,随着项目迭代的不断推进和工程复杂度的不断提高,rebase往往能助力生成相对清爽的提交历史,进而方便追溯工程的演进历史和缺陷排查。

(如果使用rebase进行合并,就会呈现出比较清爽的提交日志,也不会有那么多线,而是一条直线)

接下来的明天再写,狗命要紧,先睡觉。。。

相关推荐
敲上瘾3 小时前
企业开发工具git的使用:从入门到高效团队协作
linux·git·gitee·github·开发工具
hillstream36 小时前
配置git从公网能访问-基于frp
git·gitlab
仍然探索未知中21 小时前
Git分支管理
git
小妖6661 天前
windows11 安装好后右键没有 git bash 命令
git
只做开心事1 天前
Git 多人协作
git
freejackman1 天前
Git从入门到精通
git·gitee·gitlab·github
兔子坨坨1 天前
pycharm连接github(详细步骤)
windows·git·学习·pycharm·github
大大小小聪明1 天前
Git合并多个提交方法详解
git·github
Baoing_2 天前
Git 项目切换到新的远程仓库地址
git
暴躁哥2 天前
Git 版本控制系统入门指南
git