Git中的变基(Rebase)

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):

merge

而使用变基的提交历史则为(图片来源于progit.pdf):

rebase

可以看出,使用变基可以使提交历史为线性提交。这样做的好处下文会介绍。

变基的场景

从上文我们可以得出结论,变基最大的特点是可以使提交历史称为线性,那么这么做的好处或者适用于什么场景呢?在给出结论之前,我们先要明确,或者牢记一点:

变基要在自己本地仓库中拉出来的分支使用,不要对本地仓库外有副本的分支执行变基

也就是说变基本质上是一个完全在本地仓库进行的操作(这是DCSV特有的),我们往往是在本地执行完成变基操作后,再向远程仓库push。这样做,避免了其他合作者的处理冲突,其他合作者只需要利用git merge自身的fast-forward即可完成Merge的工作。

综上,变基适用于多人线上合作开发的场景,避免其他合作者处理冲突,例如github上开源项目的维护。公司内部因为地理上、组织上的便利性,可以酌情使用变基。

参考资料

  1. http://blog.codingplayboy.com/2017/04/14/git_rebase/
  2. https://git-scm.com/book/zh/v2/Git-%E5%88%86%E6%94%AF-%E5%8F%98%E5%9F%BA

猜你喜欢

转载自blog.csdn.net/woshismyawei/article/details/80515624