点击下方“IT牧场”,选择“设为星标”
git merge 和 git rebase 目的都是将一个分支的 commit 合并到到另外一个分支中去,但两者有一定区别。
git merge
在gitlab上新建一个项目,push一个test文件上去
![ce1dbae09567f1cc1f5f77ef23e3dc0c.png](https://i-blog.csdnimg.cn/blog_migrate/4259bb0e6150660baa8e9e73369b8cd9.png)
在本地修改test文件做两次commit,每次commit都在文件中加一句修改
![2c76b21f658b9a41dd4799a0d002b472.png](https://i-blog.csdnimg.cn/blog_migrate/bb6efc321105c3c8326499d3cf718f90.png)
在远程仓库中直接修改文件并 commit,模拟其他开发者的 commit。
![6498dd94df351fede806a7e2943f83a2.png](https://i-blog.csdnimg.cn/blog_migrate/7be7f3438742985cf84124811787a007.png)
![c2b98057c4c6c3f8829a214f4121f468.png](https://i-blog.csdnimg.cn/blog_migrate/8c722b1402993c1a03415951b62765b5.png)
如果此时我push本地的提交到远程,就会被拒绝,因为远程和本地已经各自有commit了,我们常规的做法是git pull一下,在本地解决冲突,然后继续push,本质上git pull = git fetch + git merge
。
产生冲突:
![68798babdcf8c145c10b3513496e0bc7.png](https://i-blog.csdnimg.cn/blog_migrate/5290ff6bf4e7625f02382e766c982dc9.png)
处理冲突:
![55c2ee3ebbcde45d28ae60fabfefc855.png](https://i-blog.csdnimg.cn/blog_migrate/2c15d828d9f537ea8bae2d447cf0b821.png)
重新走add commit 然后push,可以看到必须将合并当作一个新的commit:
![f9114686e2884984c4ddfc87f2fb031b.png](https://i-blog.csdnimg.cn/blog_migrate/58b5813e3d14a76ab28873b49b89d342.png)
git rebase
如果我们此时采用git pull --rebase,也就是=git fetch + git rebase
。
一样本地commit2次,远程commit2次
![d2d82980746bfab22050a61b8759f6dd.png](https://i-blog.csdnimg.cn/blog_migrate/96ce4a631efc2b69369cde0fac441292.png)
使用可以看到git pull --rebase,还是会提示我们去处理冲突,但是从git log 上可以看出明显已经发生了rebase,也就是变基,本地分支基于了远程的最新commit,而不是上次的本地commit。
![eeeb6221e6baee5249b593a199614830.png](https://i-blog.csdnimg.cn/blog_migrate/b3ec98d96dc8e3bfb3f0b7a5de2df903.png)
git rebase
处理冲突,每处理完一次本地commit冲突,用git add标记冲突已处理完,用git rebase --continue继续处理下一个本地commit,也可以先用git rebase -i将本地的commit合并为一个commit,这样git pull --rebase就能一次处理所有的冲突。
![a15254a584450807ee25fc0432025d09.png](https://i-blog.csdnimg.cn/blog_migrate/5d0825b265205b152d0b302d0a93d2d8.png)
push到远程之后,在分支图可以明显看到,跟merge的区别在于,rebase不会产生分支,并且也不会产生新的提交。
总结
merge 是一个合并操作,会将两个分支的修改合并在一起,默认操作的情况下会提交合并中修改的内容。
merge 的提交历史记录了实际发生过什么,关注点在真实的提交历史上面。
rebase 并没有进行合并操作,只是提取了当前分支的修改,将其复制在了目标分支的最新提交后面。
rebase 操作会丢弃当前分支已提交的 commit,故不要在已经 push 到远程,和其他人正在协作开发的分支上执行 rebase 操作。
merge 与 rebase 都是很好的分支合并命令,没有好坏之分,使用哪一个应由团队的实际开发需求及场景决定。
如果比较关注commit时间的话,还是用git merge,rebase会打乱时间线是不可避免的。
来源 | https://juejin.cn/post/7001409038307033119
干货分享最近将个人学习笔记整理成册,使用PDF分享。关注我,回复如下代码,即可获得百度盘地址,无套路领取!
•001:《Java并发与高并发解决方案》学习笔记;•002:《深入JVM内核——原理、诊断与优化》学习笔记;•003:《Java面试宝典》•004:《Docker开源书》•005:《Kubernetes开源书》•006:《DDD速成(领域驱动设计速成)》•007:全部•008:加技术群讨论
加个关注不迷路
喜欢就点个"在看"呗^_^