likes
comments
collection
share

Git:图解 merge 和 rebase 的区别

作者站长头像
站长
· 阅读数 34

 在 Git 的交汇处,每一次选择都是代码旅程的新起点。

在 Git 中,Merge 和 Rebase 是两种常用的分支整合方式,但是一些初学的小伙伴可能不知道它们之间有什么区别,以及二者该怎么选择。

本文将深入探讨 Merge 和 Rebase 的区别,帮助你更好地理解和运用它们,以提高代码管理的效率和质量。

场景 | 举个栗子

为了彻底地搞懂它们之间的区别,不妨先举个例子,假设现在有一个 main 分支和一个 feature 分支,如图(图中数字为提交的先后次序,即最早的提交是1,然后是2,其次是3):

Git:图解 merge 和 rebase 的区别

而你正在开发 feature 分支,目前最新的提交是4,但是你的同事突然向 main 分支推送了一个提交5  而且恰巧提交5中的某些代码你正好需要用到,此时你的想法肯定是将 main 分支中的代码合并到你的 feature 分支中来。

Merge | 分支交汇的交叉路口

Merge的原理很简单,就是将要合并分支的最新提交组合成一个新的提交,并且插入到目标分支中。

现在你想要把 main 分支 merge 到你的 feature 分支上去,那么 git 会把两个分支的最新提交4和5合并成一个提交,并且合入目标分支 feature,也就是:

git checkout feature
git merge main  

最终会得到:

Git:图解 merge 和 rebase 的区别

现在,你同事的代码已经合并到你的 feature 分支中来了,你也可以愉快地开始编写代码了!  

不过有一个比较难受的地方就是,假设在你开发 feature 分支的时候你的同事频繁地往 main 分支推送你需要的代码,merge 的方式会造成很多分叉,导致分支结构十分复杂和紊乱,污染你的提交历史。

但是 merge 会保留所有历史提交,不会破坏历史提交的结构,这一点在多人协作的时候很重要!

Rebase | 提交历史的线性编织

rebase 的使用方式与 merge 类似:

git checkout feature
git rebase main  

与 merge 不同的是,rebase 并不会保留原有的提交,而是会创建当前分支比目标分支更新的所有提交的副本, 在上述例子中(将 feature 变基到 main)就是 2' 和 4',然后将 2' 和 4' 按次序插入目标分支末尾:  

Git:图解 merge 和 rebase 的区别

这样就完成了一个 rebase 的过程(注意,这条分支是 feature 分支而不是 main 分支,原先的提交2和提交4已经被抛弃了),feature 分支实际的样子是:

Git:图解 merge 和 rebase 的区别

你可以理解为,把 feature 分支 rebase(变基)到 main 分支的意思是:让你现在的 feature 分支基于最新的 main 分支重新开发(创建副本并且移动到末尾)

是不是很简单?  

不,一点都不简单。

rebase 有一个非常大的坑,那就是它会改变提交历史。

想象一下你和你同事都在开发 main 分支,然后在你开发的时候,你的同事突然把 main 变基了,假设你们之前是这样的:

Git:图解 merge 和 rebase 的区别

结果现在变成了这样子:

Git:图解 merge 和 rebase 的区别

原来的提交5直接消失了,你的分支已经跟 main 分支匹配不上了,那现在你还能正常把你的分支合入到 main 分支中吗?显然不可以。

所以,main 分支是万万不能使用 rebase 的!!!

在你打算 rebase 的时候,一定要想想是否还有别人也在开发这个分支。

适用场景

从上面的例子中不难发现,merge 和 rebase 最大的区别在于是否会保留原有的提交(或者说破坏原有的提交结构)。

merge 会对提交历史进行保留,很显然更适合多人协作开发的场景,因为如果出现问题也可以追溯到历史的每一次提交。

而 rebase 则是会让提交历史更加简洁易读,保持提交历史的线性结构,所以更适合个人开发和整理分支的情况。

如果我想要把某个特性分支 feature_xxx 合并到 main 分支中的时候,最好的方式就是 merge,而当我一个人需要开发某个 feature_xxx 分支的时候,最好的方式就是 rebase。

一句话概括就是,merge 适合团队协作,而 rebase 适合一个人开发的分支。

转载自:https://juejin.cn/post/7342697812364558376
评论
请登录