git合并之rebase

1、在git中整合来自不同分支的修该主要有两种方法:merge 和 rebase。
1)平时用的比较多的可能是merge命令,它会把两个分支的最新快照以及二者最近的共同祖先进行三方合并,合并的结果是生成一个新的快照(并提交)。
2)还有一种方法叫做 变基,你可以使用 rebase命令将提交到某一分支上的所有修改都移至另一分支上。
无论是通过变基,还是通过三方合并,整合的最终结果所指向的快照始终是一样的,只不过提交历史不同罢了。变基是将一系列提交按照原有次序依次应用到另一个分支上,而合并是把最终结果合在一起。

2、两种合并方法的提交历史对比
假设,需要将dev分支合并到master分支
1)使用merge方法合并

2)使用rebase方法合并

3、变基合并的原理是:

  • 首先找到这两个分支的最近共同祖先,
  • 然后对比当前分支相对于该祖先的历次提交,提取相应的修改并存为临时文件,
  • 然后将当前分支指向目标分支,
  • 最后以此将之前另存为临时文件的修改依序应用。

4、变基合并的用法及过程:
假设,还是需要将dev分支合并到master分支
1)首先待在dev分支,并在dev分支上进行rebase master(原理是先指向master,然后以此应用dev分支的修改,这个过程中应该是会生成新的commit,执行完的结果是dev指向最后一个生成的commit)

$ git checkout dev
$ git rebase master

 

2)切回master分支,然后merge dev分支,此时的merge会使用fast-forward合并,因为提交历史已经成一条直线了,可以直接将master快进到最新的commit上。

$ git checkout master
$ git merge dev

5、变基合并的好处:
两种合并方法(merge 和 rebase)的最终结果没有任何区别,但变基使得提交历史更加整洁。你在查看一个经过变基的分支的历史记录时会发现,尽快实际的开发工作是并行的,但它们看上去就像串行一样,提交历史是一条直线没有分叉。一般这样做的目的是为了确保在向远程分支推送时能保持提交历史的整洁。

6、变基合并可能带来的问题:
变基也并非完美无缺,要用它得遵守一条准则:
如果提交存在于你的仓库之外,而别人可能基于这些提交进行开发,那么就不要执行变基。
变基操作的实质是丢弃一些现有的提交,然后相应地新建一些内容一样但实际上不同的提交。 如果你已经将提交推送至某个仓库,而其他人也已经从该仓库拉取提交并进行了后续工作,此时,如果你用 git rebase 命令重新整理了提交并再次推送,你的同伴因此将不得不再次将他们手头的工作与你的提交进行整合,如果接下来你还要拉取并整合他们修改过的提交,事情就会变得一团糟。

7、真实案例
假设,当前有三个用户在维护一个代码仓库,分别是远端的 gerrit,本地的 同事A,本地的,这三个用户所使用的分支分别是:branch1、branch2、branch3,在初始时,都指向同一提交C1。

1)在时刻1的状态:

2)在时刻2,同事A 分别在本地产生了两个提交:C2、C3:

3)在时刻3,同事Agerrit 提交了最新的commit C2,于是 gerrit 合并了该提交,此过程是fast-forward合并:

4)在时刻4,gerrit 提交了最新的commit C3,于是 gerrit 合并了该提交,此过程是基于rebase的fast-forward合并:

5)在时刻5, 合并了 gerrit 上的最新提交,此过程是三方合并:

 

可以发现,最后在 的本地出现了一些看着别扭的事情:
1)提交历史中存在两个相同的提交:C3 和 C3',而且这个C3提交是 gerrit 想要丢弃的,如果 接着再push,那么对于 gerrit 来说,C3又回来了,之前的变基操作是不是白做了?因为其实只需要保留C3'即可。
2)三方合并所生成的commit C4 感觉也是多余的,因为真正有意义的提交只有C1、C2、C3',提交历史只要保留C1← C2← C3' 即可。

8、解决方法
上述问题的解决方法是,当 在本地合并 gerrit 上的最新提交时,应该使用 git pull --rebase,而不是 git pull 或者 git fetch & git merge。
具体来说,
1)如果 的branch3和 gerrit 的branch1是同一分支(即branch3跟踪的远程分支是branch1),则使用

$ git pull --rebase

2)如果 的branch3和 gerrit 的branch1不是同一分支(即branch3跟踪的远程分支不是branch1),则使用

$ git fetch
$ git rebase origin/branch1

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值