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)
$

image-20220316161113161

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

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

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

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要合并本地 repo,可以按照以下步骤进行操作: 首先,确保你在本地已经安装了 Git 工具,并在命令行中进入到你想要合并的本地 repo 的目录。 1. 使用 `git branch` 命令查看当前 repo 的分支情况。确保你在合并之前是在要合并的目标分支上。 2. 如果目标分支是主分支,可以使用 `git pull` 命令从远程 repo 拉取最新的变更内容。 如果目标分支不是主分支,可以使用以下命令拉取最新的变更内容: ``` git checkout 目标分支 git pull origin 目标分支 ``` 3. 确保你在目标分支上,使用 `git merge` 命令进行合并。例如,如果要将特性分支(feature branch)合并到主分支,可以使用以下命令: ``` git merge 特性分支 ``` Git 会尝试将两个分支更改内容合并,并在合并过程中尽可能保留两个分支更改。 4. 如果合并过程中出现冲突,Git 会提示你手动解决冲突。打开冲突文件,在文件中标记冲突的地方进行修改,保留你希望保留的更改。解决冲突后保存文件,并使用 `git add` 命令将修改后的文件添加到暂存区。 5. 当所有冲突都解决并且所有更改都已添加到暂存区后,使用 `git commit` 命令提交合并结果。你可以为合并结果添加一个简短的描述,以便其他人理解这次合并的内容。 6. 完成合并后,你可以将修改推送到远程 repo,以使其他人能够获得合并后的最新代码。使用 `git push` 命令将合并后的修改推送到远程 repo。 这样,你就成功地合并了本地 repo。请注意,在合并过程中要仔细检查和解决冲突,并确保合并结果符合预期。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值