写在开篇

对于很多同学来说,对于git工具的使用只是停留在最基础的几条命令或者是几个按钮上,对于普通的开发工作来说可能是够用了,但对于想高效的利用好git这个实战利器来说,显然是需要再精进提升的。

今天我们将从代码合并这个角度,为大家讲解git中merge与rebase的区别,使用场景等。

区别

初始场景

假设目前我们有两个分支,main和feature,同时两个分支的head指针都指向add ClassB这个提交节点上,如下图所示。

git00
git00

无分叉情况下合并

对于第一种情况,main分支新增一个提交,其head指针指向add ClassC提交节点上,而feature分支的仍然停留在add ClassB上。

git01
git01

此时我们希望在feature分支上将main分支上的最新提交合并过来,此时对于两个分支来说,它们是没有分叉的,merge默认会采用的策略是fast-forward,即快速将feature的head指针移动到add ClassC上。

git02
git02

有分叉情况下合并

对于下图,main和feature分支中出现了分叉的情况,如果想要将main中的提交合并到feature中,我们应该怎么做呢?

git03
git03

merge

对于之前没有了解过rebase的我们来说,我们通过merge来将main中提交的ClassC合并到feature来,我们会在ClassE节点后新增一个merge结点,放到自己的最后面,如下图所示。

git04
git04

而这个merge节点,它是main分支上更改的合并,即不管main分支上多少个提交节点,都会合并成一个节点。

rebase

但如果通过rebase合并后,feature分支的提交还是在最后,就好像从节点ClassC中拉出来的一样,此时相对于main分支没有分叉。

git05
git05

优缺点

上述两个例子很清晰的提现了merge和rebase的区别和作用,简单来说:

  • merge保留了作品的完整历史记录,包括按时间顺序排列;对于回滚等操作也更有优势
  • Rebase使提交变得整洁,不会产生嘈杂的提交

使用场景

merge

  1. 对于多个人开发同一个模块,很可能他的某个改动会导致你的功能出问题,如果出了问题,保留记录能便于后期排查问题
  2. main分支需要将开发完的子分支的内容合并进来,使用merge可以留有提交记录,出现问题方便后面排查问题

rebase

个人开发分支同步main最新提交应该使用rebase,该模块的内容更新和你功能无关,合并代码也不会影响你的功能,无需保留该记录

巨人的肩膀:
https://www.bilibili.com/video/BV1cv411u7wd/?spm_id_from=333.788.recommend_more_video.2&vd_source=7c8b86fff4f4354960fa30b9be566d0e