Merge和Rebase是合并两个分支的操作。都是checkout到某个分支上,然后将别的分支合并(变基)到本分支上。
注意:本分支(head指向的分支,或者经过checkout后的分支)会变化,而别的分支不会变化
Merge:
checkout master (head 指向master分支)
merge future(将future分支融入master中,future不变,这里有两个情况,之后会介绍)
Rebase:
checkout future (head 指向future分支)
rebase master(将master分支插入到future底部,master不变,future的基座变了,但是指向future的指针不变)
切记:不能rebase任何分支到主分支上,否则主分支的基座改变,就会篡改历史无法修复
我们通过四个案例来区分Merge和Rebase
我们假设本地仓库中存在两个分支,一个主分支master,一个开发分支futuer
案例一:主分支没有分叉,在master上merge future后,master会快速指向future的位置(fast-forword),如下图
案例二:主分支有分叉时,在master上merge future后,会在master后添加一个提交(–no-ff),future不变,如下图
案例三:checkout future 后,经过rebase master(在future上rebase master),会将master重新作为future的基座,如下图
切记:不要在公共分支(master)上进行rebase
案例四:在future上merge master,和案例二情况一样,只是在future上进行(改变future),如下图
都是把别的分支合并到自己身上,别的分支不变
merge:对于自身有分叉的merge(案例二),是将分叉的多次commit合并为一个提交点,然后合并到自身上,自己的提交在前面,别人的合并在后边。
rebase:是将别的分支作为本分支的基座,自己的提交在后边,方便回退,而且不会多出来一个提交。
merge:主要用于将自己的功能分支添加到master分支上
rebase:主要是同步master分支到功能分支,实现与上游的同步,当然也可以选择在功能分支上去merge master分支(无所谓顺序),但是要切记不要在master分支上rebase其他任何分支
当本地和远端对应同一条分支时,优先使用Rebase而不是Merge
比如我们在git中只用pull(默认git fetch + git merge)或在pycharm中使用update project时,会提示使用Merge还是Rebase(注意这里意思在本地master上rebase远端master,可以特例修改master),我们一般选择Rebase,这样的话远端的master会作为本地master的基座,而本地master会被顶到顶部,也方便回退。