Git中的变基(Rebase)
背景介绍
VCS(版本管理系统)是我们开发中每天都会打交道的基础开发系统,当前使用最为广泛的非SVN和GIT两者莫属,两者分别代表了CVCS(集中式版本管理系统)和DVCS(分布式版本管理系统)。两者具体的区别网上有大量的文档,可以自行google和bing。
作者之前一直使用的是SVN,既CVCS的一种,这种系统的操作较为简单明了(也可能是之前习惯了)。而现在转为使用Git后,由于Git中引入了本地仓库、暂存区,使得开发中的常用操作从两点(远程仓库、工作空间)间的操作扩展为三点(远程仓库、本地仓库、工作空间)间的操作,大大增加了代码管理的空间。
本文中将要介绍的变基就是之前CVCS限于架构无法实现的一种代码分支管理策略(Git的基本操作请自行google、bing)。本文中的介绍来源于已有文档和作者个人的理解,如有不当之处请指出,谢谢!
Rebase 和 Merge
在介绍一个新概念、技术时从一个大家熟知的概念、技术入手更容易使大家理解。变基(既Rebase,后续统一使用变基指代)相似的概念就是Merge,也可以说变基是从Merge演化而来。
众所周知,Merge是用来合并分支的,那么变基呢?变基的结果一般和Merge一样,但是变基实现方式并不是合并,而是重放,既将分支A的提交在分支B上重新提交一遍。变基的一般命令为:
git rebase baseBranch [rebaseBranch]
意为将rebaseBranch分支的提交提取出来,在baseBranch分支上重放(提交内容相同,但是校验和不同)。其中rebaseBranch可以省略,省略后既使用当前分支的提交在baseBranch分支上重放。
变基和Merge**最大的不同是使用git log查看提交历史**,使用Merge的提交历史如下图(图片来源于progit.pdf):
而使用变基的提交历史则为(图片来源于progit.pdf):
可以看出,使用变基可以使提交历史为线性提交。这样做的好处下文会介绍。
变基的场景
从上文我们可以得出结论,变基最大的特点是可以使提交历史称为线性,那么这么做的好处或者适用于什么场景呢?在给出结论之前,我们先要明确,或者牢记一点:
变基要在自己本地仓库中拉出来的分支使用,不要对本地仓库外有副本的分支执行变基
也就是说变基本质上是一个完全在本地仓库进行的操作(这是DCSV特有的),我们往往是在本地执行完成变基操作后,再向远程仓库push。这样做,避免了其他合作者的处理冲突,其他合作者只需要利用git merge自身的fast-forward即可完成Merge的工作。
综上,变基适用于多人线上合作开发的场景,避免其他合作者处理冲突,例如github上开源项目的维护。公司内部因为地理上、组织上的便利性,可以酌情使用变基。