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进行合并,就会呈现出比较清爽的提交日志,也不会有那么多线,而是一条直线)

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

相关推荐
和你一起去月球4 小时前
TypeScript - 函数(下)
javascript·git·typescript
我不是程序猿儿4 小时前
【GIT】TortoiseGit的变基(Rebase)操作
git
yyycqupt11 小时前
git使用(一)
git
Kkooe15 小时前
GitLab|数据迁移
运维·服务器·git
Beekeeper&&P...16 小时前
git bash是什么,git是什么,git中的暂存区是什么,git中的本地仓库是什么,git中工作目录指的是什么
开发语言·git·bash
惜.己18 小时前
Jmeter中的断言(二)
测试工具·jmeter·1024程序员节
Stara051120 小时前
Git推送+拉去+uwsgi+Nginx服务器部署项目
git·python·mysql·nginx·gitee·github·uwsgi
lsswear20 小时前
GIT 操作
git
勋勋勋勋小勋勋21 小时前
git分支合并某一次提交
git