git合并分支的理解和应用

Git的合并分支包括合并远程分支和合并本地分支,其实本意是一样的。只不过拉远端分支的时候多了一步git fetch,就是把所有分支的代码从云拉到本地缓存,但是不做合并。关键是合并,说到合并的时候就要说到这最纠结的两兄弟了。


git merge

git merge全称其实是git merge --ff, ff 就是fast forward。
在当前分支没有任何提交的情况下,它的指针着被合入分支的提交线一路下去可以走到被合入分支上,就像是指针快进到另一个分支上,它就像是快进一样,它不会产生任何merge commit,没办法查到合入的记录。(下右图所示)
git合并分支的理解和应用_第1张图片

如果在上述情况下,要知道合入的细节,那就要用git merge --no-off。(如上左图所示)
它的作用就是把被合入分支的详细提交情况都显示出来,然后在最后产生一个merge的新commit。我们就可以清楚的看见这次的merge是怎么来的。

总结下,ff是head最终指向被合入分支的最后一次提交,而no-ff是指向他们的合入。这种情况下,多说一句,如果要reset,这两种方式的reset也是不同,ff方式的reset因为没有快进,所以是回到了被合入分支的commit点(并不是本分支的),而–no-ff才是真正回到了当前分支的上一个提交点。

以上这种情况有前提的,前提是当前分支无任何提交。下面这种情况是我们绝大多数的merge情况。
git合并分支的理解和应用_第2张图片
在两个分支的最近公共点都有新的提交,这样git merge会将两个分支的最后节点做合并产生新的节点,并且生成一个merge的commit记录。它是严格按时间线记录了分支的提交记录,方便查找。但是缺点是在提交线上会分叉,很乱,而且不能直观的看到你的分支和目标分支的差距。


git rebase

参考了很多的博客,rebase用变基是比较准确的。但是要遵守rebase黄金法则,no one shall rebase a shared branch.
git合并分支的理解和应用_第3张图片

rebase是先删除当前分支的提交,然后把被合入分支的所有提交都复制到本分支上,再顺着提交线把刚才删除的本分支提交重新生成一下基于这个之上,所以称为“变基”。rebase的本意是让当前的开发分支保持在一个基准上,这样在提交线上可以看到我们和主分支的head在哪个位置,而且可以把我们领先未合入的提交显示在最上面,整个过程不会产生merge的记录,所以自然也不会按时间线显示提交记录。

另外rebase可以压缩commit请求,在提pr时候,可以git rebase head~压缩commit。


对于这两个命令我也难以清楚的分清界限,但凡是存在的肯定是合理的。我认为还是取决于项目的使用和管理,分享下我平时的使用。

  1. 从远端同步到master使用git pull --no-ff,清晰的记录每个人的提交和合入记录。
  2. 在feature分支合并是用git rebase master,让自己的提交线变得简单。但如果是共同分支开发,使用merge。

你可能感兴趣的:(git,git)