git rebase 什么是变基

git里面的rebase老是让人以为很难理解
特别是它的中文翻译:变基
图片来自廖雪峰
变基哈哈哈 图片来自廖雪峰
首先不认识rebase,先查查词典好吧意思是:重定基准
因此这个翻译仍是很是准确的。
若是仍是以为很差理解,注意,前方高能
按照下面的步骤,咱们换一个容易理解的词:java

  1. java里面的基类咱们也能够说是父类因此 表达式(基==父)为true
  2. 变换变换 。变字和换字应该差很少。 咱们就认为表达式 (变==换)为true 。
  3. 等价代换一下 (变基==换父) 也为 true。
  4. 换父? 不就是: 换爹 !!!!!!

好了通过上面的步骤,咱们成功的将git

咱们的标题从git rebase 什么是变基 变为 git rebase 什么是换爹翻译

咱们知道git中的commit也是有父子关系的。3d

因此到这里相信你已经明白了:变基变基,就是某个commit-B不想要commit-A这个爹了。要换个别的commit-C作本身的爹。指针

说到这里换爹都知道是干啥的,那么咱们为何要换爹呢?何时要用到换爹呢?code

下面介绍一下须要换爹的场景:blog

合并多个commit

  1. 一个分支上依次有A - F ,一共6个commit。这个分支 每个commit 都是独苗,也很顽强的这么多代都没有断了香火。从commit_B到commit_E这么多代人就干了一件事儿就是盖了个房子。史书上(log)以为不用分红这么多commit,想要合并一下。合并连续commit
  2. commit_A在房子的门口种了一棵树,到了commit_F的时候又在门口种了棵树。史书以为都是种树,干脆把commit_A和commit_F合并了吧。合并不是连续的commit

修改commit message(好久以前的commit message)

这个过程没有换爹,使用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就会给你的同事带来麻烦。

相关文章
相关标签/搜索