变基(rebase)与合并(merge)
变基(rebase)与合并(merge)
项目背景
一直都很想讲变基与合并,但是平常都是一个人在研发一个项目,最近接到的需求是多人研发,这种情况下,git提交的规范,以及变基的好处就体现出来了
因此就想着聊一聊变基与合并,对日后的项目开发也会有帮助
合并
何为合并?花了一个图,讲了合并的过程
如图中,dev为开发分支,dev基于master的c3提交拉出,此时在dev中提交了c4,c5后,研发任务结束,我们便向master发起了一个合并请求。该合并请求通过后,形成了一个合并提交叫做m5,提交记录不出意外,应当统一是 merge pull request 'xxx分支' from xxx分支 into master
合并后代码中的记录同样变成了merge记录,这对于我们寻找问题(锅)的时候是很不方便的,因为git还提供了另外一套流程应对这种问题
变基
变基,即rebase
如图
在c3的基础,拉了一个dev,在这之后,在dev提交了两个历史记录c4和c5,而其他人往master推送了一个c6。注意此时,dev的c4和c5是未提交的,未提交的存储在你的本地,而c6是别人一提交的
这时候若是使用合并,则会变成如下的提交历史
对该流程简单解释下:在提交c4和c5之后,我们要合并到master,此时master有了更新,即c6,所以我们应该拉取mastrer代码,对dev进行更新。此时形成了m1,是一个merge提交,更新后确保dev有c6,我们再往master做合并请求,master就拥有了新的merge提交m2。
我们改用变基,看看变基后的dev与master
若此时我们使用的是变基,前提是我们为将c4和c5推送远程dev,此时别人的c6会作为我们dev的提交记录中的某一步插入,整个dev与master都是一条线。且c6甚至会根据c4与c6的时间进行判断,比c4早则插入在c4之前,晚则插入c4之后。也就是,将别人的记录插入到你的提交记录中。
变基对于多人合作是很有帮助的,因为它会将别人的提交在合适的位置插入到你的本地,此时你将代码推送远程,这样子就不会形成merge的提交,找问题(锅)也就方便的多
二者区别
变基其实也可以理解成是另一种合并,只不过他的合并会让提交历史更为干净清晰。
何时使用合并,合适使用变基?
总的原则是,只对尚未推送或分享给别人的本地修改执行变基操作清理历史, 从不对已推送至别处的提交执行变基操作,这样,你才能享受到两种方式带来的便利。
如果是多人合作同个分支,未提交的代码就使用变基吧,已提交的话就使用合并吧
如何使用
第一:多人开发统一特性分支是,基于该分支进行变基
步骤如下:
第一步:git fetch,理解成是更新,告诉 Git 去获取它有你没有的数据
第二步:git rebase,理解出一种拉取方式,拉取下远端的当前特性分支,rebase与pull的区别,就是别人的代码你pull的话,提交记录就是你的,但是你rebase的话,提交记录依旧是别人的,这样子方便定位代码问题
第三步:有冲突解决冲突,无冲突进入下一步
第四步:git push -f,强制推送本地代码至远程
第二:当前特性分支是,基于dev分支(其他分支)进行变基
步骤如下:
第一步:git fetch,理解成是更新,告诉 Git 去获取它有你没有的数据
第二步:git rebase origin/dev,变基dev分支
第三步:有冲突解决冲突,无冲突进入下一步
第四步: git push -f,强制推送本地代码至远程
冲突解决过程如下
变基 master 的分支
Git rebase origin/master
如果变基的时候发生了冲突,那么解决冲突。
冲突解决完后
Git add.
Git rebase --continue
git rebase --continue表示继续下一个冲突, git rebase --skip表示跳过当前冲突, git rebase --abort表示退出rebase模式,
最后执行提交的功能
强制提交到远程仓库
Git push -f