Git rebase 给老爸买个能打电话的手机

Merge(融合)大家都很熟悉了,这个命令在svn上也有;而Rebase(重演),是git上新引进的一个命令。它们两的作用都是,将一个分支合并到另一个分支(一般是主分支)上来。那么有了merge,为什么要引进rebase命令呢?要回答这个问题,我们可以举个例子。例如存在如下图所示的两个分支,我们现在需要将experiment(实验分支)合并到master(主分支)上。

 

我们可以先尝试使用merge命令进行合并。命令执行如下:

$ git checkout master
//切换到主分支
$ git merge experment
//experment融合到当前分支(即主分支)
   融合之后的分支状态如下图所示:

	gitc3c4后面新生成了一个c5,并将master指针指向了这个新生成的commit。这是融合顺利的情况。融合是可能存在冲突的,如果发生冲突c5也就生成不了,需要人工干预去解决冲突。这里需要指出,人工干预的话,就存在什么人去干预更合适了的问题。显而易见的答案就是,编写代码的相关方去干预最合适。但是对于合并代码人员来说,协调代码相关方对问题进行定位,本身就是一件痛苦的事。
          这里再举个例子:老爸给你电话说,上次你老哥买的手机摔坏了。你给买个手机呗,轮也轮到你了。你听了以后,麻利的在网上买了个T1给寄了回去。顺丰也很给力,没两天就送到了。谁知老爸还是用座机给你打电话说,那手机坏的,用不了,装了sim卡后还是用不了。怎么可能用不了,我可是老罗的脑残粉啊。你苦思冥想,猜测是不是sim卡的模式问题啊。问老爸问了半天也没问出来。他一怒之下,抛出一句,“这卡是你哥买给我的,你问他去。”打电话给老哥,老哥想了半天,憋出来个应该是电信的。果然手机和sim卡模式不兼容,买的手机是联通的WCDMA格式的。给老爸回电话,让他重新买张新卡。老爸很是不爽说:“又得换号码啊,我上面存了好些人的。折腾人啊。应该叫老大买的。”
          在这里我们不难指出,例子中老爸对应的角色是合并代码人员。给他买一个能打电话的手机,是master分支;我给他买个能打电话的手机,是experiment分支;我给买了个WCDMA模式的T1,是C3。而老爸现在手里的sim卡,就是C4。如果他的卡是联通的,那在我们打算生成C5(能打电话的手机)的时候,就不会冲突。但是偏偏他的卡是电信的,这时候就生成不了C5了,也就发生了冲突。有冲突并不可怕,可怕的是,因此而浪费的时间。你不仅花费了自己的时间,还花费了老爸和老哥的时间。
          其实这种大量浪费时间的问题,是可以解决的。就是你收到老爸要你买手机的电话后,就应该让老爸把sim卡寄给你。就算是一开始忘了,你还有机会避免问题的出现。就是你在买了WCDMA模式的T1之后,寄回去之前,也应该让他把sim卡寄给你。这时候,你会发现模式不匹配。而你所要做的就是,买一张新的sim卡,再把老的sim卡的通讯录转移到新的sim卡上。再把装了新sim卡的T1寄回去给老爸。这样,或许你老爸会很开心有你这么一个儿子。
         上述的解决方案的思路,其实就是gitrebase(重演)的思路。我们可以看看如果我们使用rebase命令的话,合并是怎么个状态。命令如下:
$ git checkout experiment
//切换到experiment分支
$ git rebase master
//在当前分支上,重演主分支
 
    重演后分支状态如下图所示。对应experiment分支来说,c3会消失,c4会被纳入到分支中,并生成新的提交c3’。生成c3’的过程,可能会发生冲突,程序员需要花时间去解决冲突。但是对于master分支和代码合并人员,这些都是透明的,不会占用他的时间的。

   生成c3',我们合并的目的还没有达到。因为master指针还指向c4呢。它应该指向的是c3’才是。我们需要继续执行下述命令:
$ git checkout master
//切换到主分支
$ git merge experment
//experment融合到当前分支(即主分支)
   融合之后的分支状态如下图所示。由于冲突已经由程序员解决了,主分支根本不存在冲突的可能,可以进行快速的合并。

     了解到这我们不难得出开头提出的,关于“为什么要引进rebase”这个问题的答案了。因为它提供了解决了之前merge存在的问题,即代码冲突发生的话,代码合并人员,需要花费大量的时间去协调各方解决冲突。使用rebase的话,它让对新增代码最了解的程序员来解决冲突,从而缩短了时间的花费。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值