赞
踩
看了网上很多讲git rebase和git merge的文章,这里做下总结,其中主要参考了这两位大佬的博客,后面附上链接
https://blog.csdn.net/weixin_42310154/article/details/119004977
首先在日常开发中,新手应当多使用git merge,而如果没有自己的理解的话,尽量少使用git rebase。使用得当会极大提高自己的工作效率;相反,如果乱用,会给团队中其他人带来麻烦。下面举两个例子来分别感受一下这两个命令的效果
在master基础上新建hot_fix分支,然后在hot_fix分支上做2次提交,再到master分支上做1次提交,此时hot_fix分支所基于的master已经有了1次更新。然后分别体会git rebase和git merge的效果
在hot_fix分支上执行git rebase操作后,会将master分支最新一次提交作为hot_fix的基底,然后在这个基础上,再加上hot_fix自己的提交,此时master分支不会有任何影响
hot_fix変基后会导致,原本master的提交应该是最新的,但是目前日志上显示最新的提交确是hot_fix上的2次提交。
官方解释:当执行rebase操作时,git会从两个分支的共同祖先开始提取待变基分支上的修改,然后将待变基分支指向基分支的最新提交,最后将刚才提取的修改应用到基分支的最新提交的后面。
结合示例,那么这里基分支:master
待変基分支:hot_fix
上面的例子可抽象为如下实际工作场景:如果使用rebase,那么其他开发人员想看master主分支上的历史,就不是原来的历史了,历史已经被你篡改了。
比如:
张三和李四从共同的节点拉出来开发,张三先在本地开发完,做了两次提交,并推送到了自己的远程分支,但开发的功能比较复杂,还在测试,还没来得及合到master上。按照提交时间的先后顺序,即张三先提交。
李四后来也在本地开发完了,也推送到了自己的远程分支,并在本地master主分支使用merge合并代码后,push到远端master上去了。按照提交时间的先后顺序,即李四后提交。
后续测试完,张三先在本地master主分支使用rebase変基,然后再push到远端master(注意张三需要切换到本地master主分支,然后执行git rebase,然后再git push到远端master),则李四是后提交的确变成了张三先提交的新基底。本来按照提交时间的先后顺序,张三是先提交的,结果从提交日志上看,张三的提交反而显示在李四的提交的前面(提交日志中越靠前说明提交的越晚,但实际张三却是最先提交的),就乱套了。
git merge是将master上所做的修改合并到hot_fix2上,那么日志图上原本先于master的2次hot_fix的提交,是正常显示在“master第一次提交202203161323”后面的
如果是master先提交的修改,hot_fix3后提交的修改,那么在hot_fix3分支上不管是rebase还是merge之后项目都差不多,只不过merge后会生成一条“Merge branch ‘master’ into hot_fix3”的提交记录
同理,IDEA更新是从远程分支更新到本地分支,可以把远程分支理解为上面两个示例中master分支,本地分支理解为hot_fix分支
IDEA会先执行git fetch再执行git merge,IDEA会将远程分支上的提交合并到当前本地分支
IDEA会先执行git fetch再执行git rebase,IDEA会将远程分支上的提交変基为当前本地分支的基底,换句话说就是当前本地分支所做的提交git会将它变成是在远程分支提交的基础上所做的提交,即在本地分支的日志中展现为是在远程分支提交的修改的基础上,再做的修改。
总结:由此可以看出在日常开发中,我们应当多用第一个选项来从远程分支更新本地分支代码
合理使用rebase命令可以使我们的提交历史干净、简洁!
lolan@LAPTOP-RMM4NHE1 MINGW64 /repository (master) $ git log commit b72cb59bfde36bde73037b1c940b4a6fdafcc11c (HEAD -> master) Author: lolan <sifan.wang@coolcollege.cn> Date: Wed Mar 16 15:56:20 2022 +0800 第四次提交,添加d.txt commit e59d1070889b77c90785d526cd18f21d45206500 Author: lolan <sifan.wang@coolcollege.cn> Date: Wed Mar 16 15:55:16 2022 +0800 第三次提交,添加c.txt commit 7fa9d8eda582874b0fb0e59740922d5d09bc5547 Author: lolan <sifan.wang@coolcollege.cn> Date: Wed Mar 16 15:53:21 2022 +0800 第二次提交,添加b.txt commit d733635f913d232d753401e48914fa94883ae54a Author: lolan <sifan.wang@coolcollege.cn> Date: Wed Mar 16 15:51:21 2022 +0800 第一次提交,添加a.txt lolan@LAPTOP-RMM4NHE1 MINGW64 /repository (master) $ git rebase -i d733635 [detached HEAD 64721f1] SF 第二次提交,添加b.txt Date: Wed Mar 16 15:53:21 2022 +0800 3 files changed, 3 insertions(+) create mode 100644 b.txt create mode 100644 c.txt create mode 100644 d.txt Successfully rebased and updated refs/heads/master. lolan@LAPTOP-RMM4NHE1 MINGW64 /repository (master) $ git log commit 64721f18fe98f0101bc5ad70d7f3b5db2bcea366 (HEAD -> master) Author: lolan <sifan.wang@coolcollege.cn> Date: Wed Mar 16 15:53:21 2022 +0800 SF 第二次提交,添加b.txt SF 第三次提交,添加c.txt SF 第四次提交,添加d.txt commit d733635f913d232d753401e48914fa94883ae54a Author: lolan <sifan.wang@coolcollege.cn> Date: Wed Mar 16 15:51:21 2022 +0800 第一次提交,添加a.txt lolan@LAPTOP-RMM4NHE1 MINGW64 /repository (master) $
git rebase 7fa9d8e^ b72cb59 --onto master
git checkout master
git reset --hard 0c72e64
https://www.jianshu.com/p/4a8f4af4e803
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。