git里面的rebase老是让人以为很难理解
特别是它的中文翻译:变基
图片来自廖雪峰
首先不认识rebase,先查查词典好吧意思是:重定基准
因此这个翻译仍是很是准确的。
若是仍是以为很差理解,注意,前方高能。
按照下面的步骤,咱们换一个容易理解的词:java
好了通过上面的步骤,咱们成功的将git
咱们的标题从git rebase 什么是变基 变为 git rebase 什么是换爹。翻译
咱们知道git中的commit也是有父子关系的。3d
因此到这里相信你已经明白了:变基变基,就是某个commit-B不想要commit-A这个爹了。要换个别的commit-C作本身的爹。指针
说到这里换爹都知道是干啥的,那么咱们为何要换爹呢?何时要用到换爹呢?code
下面介绍一下须要换爹的场景:blog
这个过程没有换爹,使用rebase 命令的目的是能够经过这个操做修改commit message图片
咱们想要把topic分支合并到master。
在topic分支 执行这两个命令任意一个it
git rebase master git rebase master topic
能够达到下图的效果。
ast
这里咱们发现,topic从master分支分出去以后的全部commit:A、B、C,做用在了master的最后一个commit G以后。
每当rebase操做分支的时候 老是有些难以理解。这里咱们说其实rebase命令本质上一直都是换爹。
分支名咱们能够认为是执行相应分支最新commit的指针
分支名topic表明的是topic从master分出去以后的全部的commit
而分支名master表明的master分支上最新的commit。
为了验证以上的说法,能够执行如下命令
git rebase commit_F_id topic
执行后获得如下分支图
咱们能够再验证一次,执行
git rebase commit_G_id commit_C_id
执行后获得如下分支图
咱们注意到该命令与 git rebase master topic 类似。可是注意此时master 和 topic分支的指针的位置。commit G后面的几个commit是不在任何分支上的。属于比较危险的行为。
咱们能够再验证一次,执行
git rebase commit_G_id commit_A_id
执行后获得如下分支图
也是比较危险的行为。
rebase是一个强大的命令。在以上常见的场景中的确是很方便。
其本质就是给某个commit 换一个父 commit
不建议在复杂的场景中使用!rebase有风险。
还有一条必须遵照:rebase 不能用来操做与他人协做的分支 好比topic是你本身的分支,git rebase master topic 没有问题,可是git rebase topic master就会给你的同事带来麻烦。