看了网上很多讲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的2次hot_fix的提交,现在却在日志显示中排在了master的提交的前面
官方解释:当执行rebase操作时,git会从两个分支的共同祖先开始提取待变基分支上的修改,然后将待变基分支指向基分支的最新提交,最后将刚才提取的修改应用到基分支的最新提交的后面。
结合示例,那么这里基分支:master
待変基分支:hot_fix
上面的例子可抽象为如下实际工作场景:如果使用rebase,那么其他开发人员想看主分支的历史,就不是原来的历史了,历史已经被你篡改了。
比如:
张三和李四从共同的节点拉出来开发,张三先在本地开发完,做了两次提交,并推送到了自己的远程分支,但开发的功能比较复杂,还在测试,还没来得及合到master上。
李四后来也在本地开发完了,也推送到了自己的远程分支,并在本地主分支使用merge合并代码后,push到master上去了。
后续测试完,张三先在本地主分支使用rebase変基,然后再push到master(注意张三需要切换到本地主分支,然后执行git rebase,然后再git push到远端),则李四的新提交变成了张三的新提交的新基底,本来李四的提交是最新的,结果最新的提交显示反而是张三的,就乱套了
git merge是将master上所做的修改合并到hot_fix2上,那么日志图上原本先于master的2次hot_fix的提交,是正常显示在“master第一次提交202203161323”后面的
如果是master先提交的修改,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 <[email protected]>
Date: Wed Mar 16 15:56:20 2022 +0800
第四次提交,添加d.txt
commit e59d1070889b77c90785d526cd18f21d45206500
Author: lolan <[email protected]>
Date: Wed Mar 16 15:55:16 2022 +0800
第三次提交,添加c.txt
commit 7fa9d8eda582874b0fb0e59740922d5d09bc5547
Author: lolan <[email protected]>
Date: Wed Mar 16 15:53:21 2022 +0800
第二次提交,添加b.txt
commit d733635f913d232d753401e48914fa94883ae54a
Author: lolan <[email protected]>
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 <[email protected]>
Date: Wed Mar 16 15:53:21 2022 +0800
SF 第二次提交,添加b.txt
SF 第三次提交,添加c.txt
SF 第四次提交,添加d.txt
commit d733635f913d232d753401e48914fa94883ae54a
Author: lolan <[email protected]>
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