git rebase和git merge使用方法详解

看了网上很多讲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的效果

git rebase

git rebase和git merge使用方法详解_第1张图片

git rebase和git merge使用方法详解_第2张图片

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

git rebase和git merge使用方法详解_第3张图片

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

git rebase和git merge使用方法详解_第4张图片

git merge是将master上所做的修改合并到hot_fix2上,那么日志图上原本先于master的2次hot_fix的提交,是正常显示在“master第一次提交202203161323”后面的

示例二

如果是master先提交的修改,hot_fix3后提交的修改,那么不管是rebase还是merge之后项目都差不多,只不过merge后会生成一条“Merge branch ‘master’ into hot_fix3”的提交记录

git rebase和git merge使用方法详解_第5张图片

IDEA更新项目

git rebase和git merge使用方法详解_第6张图片

同理,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 <[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和git merge使用方法详解_第7张图片

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

git rebase 7fa9d8e^ b72cb59 --onto master
git checkout master
git reset --hard 0c72e64

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

你可能感兴趣的:(git,github)