当前位置:   article > 正文

git rebase和git merge使用方法详解_在传入更改上变基当前分支

在传入更改上变基当前分支

看了网上很多讲git rebase和git merge的文章,这里做下总结,其中主要参考了这两位大佬的博客,后面附上链接

https://blog.csdn.net/weixin_42310154/article/details/119004977

首先在日常开发中,新手应当多使用git merge,而如果没有自己的理解的话,尽量少使用git rebase。使用得当会极大提高自己的工作效率;相反,如果乱用,会给团队中其他人带来麻烦。下面举两个例子来分别感受一下这两个命令的效果

一、git rebase和git merge的区别?

在master基础上新建hot_fix分支,然后在hot_fix分支上做2次提交,再到master分支上做1次提交,此时hot_fix分支所基于的master已经有了1次更新。然后分别体会git rebase和git merge的效果

git rebase

12b959efcc454da5a15b9fdec493d61b

image-20220316113206191

在hot_fix分支上执行git rebase操作后,会将master分支最新一次提交作为hot_fix的基底,然后在这个基础上,再加上hot_fix自己的提交,此时master分支不会有任何影响

image-20220316114413261

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

image-20220316132542712

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”的提交记录

image-20220316143052664

三、IDEA更新项目两个选项的区别?

image-20220316133738095

同理,IDEA更新是从远程分支更新到本地分支,可以把远程分支理解为上面两个示例中master分支,本地分支理解为hot_fix分支

将传入变更合并到当前分支

IDEA会先执行git fetch再执行git merge,IDEA会将远程分支上的提交合并到当前本地分支

在传入变更上変基当前分支

IDEA会先执行git fetch再执行git rebase,IDEA会将远程分支上的提交変基为当前本地分支的基底,换句话说就是当前本地分支所做的提交git会将它变成是在远程分支提交的基础上所做的提交,即在本地分支的日志中展现为是在远程分支提交的修改的基础上,再做的修改。

总结:由此可以看出在日常开发中,我们应当多用第一个选项来从远程分支更新本地分支代码

四、git rebase的其他用法

1、合并多个commit为一个完整commit

合理使用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)
$
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56

image-20220316161113161

2、将某一段commit粘贴到另一个分支上

git rebase 7fa9d8e^ b72cb59 --onto master
git checkout master
git reset --hard 0c72e64
  • 1
  • 2
  • 3

https://www.jianshu.com/p/4a8f4af4e803

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小惠珠哦/article/detail/959066
推荐阅读
相关标签
  

闽ICP备14008679号