那些年你还迷迷糊糊的git pull与fetch

269 阅读2分钟

哈喽哈喽,这里是小菜不拖延博主,许久未更,因为博主都在摸鱼忙着工作,最近又要开始秋招了,许多知识点得捡起来了。在复习git的时候,又注意到了我都不咋用的fetch,本来想简单看看,没想到这背后牵连着······

image.png

gitpull与fetch---我的启发文章

git pull和git fetch

首先我们直接抛出面试回答(疑惑的同学可以先看完再回来看结论):

两个的本质其实都是想同步远程最新代码,最开始其实我用的都是pull,方便嘛,但是在又一次pull发现会出现vim的编辑界面,后面去尝试了,当我修改了a分支,准备提交,而且a分支也被其他人修改的同时,就会出现vim这个编辑界面。然后查了资料,发现这其中其实还牵扯到一个rebase的问题,提交时使用fetch同步之后进行git rebase操作,再push代码,是不会出现merge信息的。而使用pull就会多出一条merge信息(merge main of 分支),因为在pull默认参数是merge下,其实pull=fetch+merge。当然对于其实习惯用pull操作来说,也可以设置rebase,就可以实现rebase,他默认是merge。

什么是rebase

变基rebase

rebase称为变基,字面就是改变基底的意思,比如当我从master的commit3时切出分支a,同时有其他同学提交了代码,更新到了commit5,使用rebase就能让a分支从基于commit3到基于最新的commit5

image.png

vim出现场景

当git config --global pull.rebase为空--默认merge时:我当前拉取的远端版本为 B,此时修改了代码,并在本地仓库commit一次,但并未 push 到远端仓库。 另一位开发者在 B 的基础上,同样 commit 了一次并 push 到远端仓库。那么这个时候,我再 push 自己的代码就会发生错误。此时pull就会出现vim

image.png

image.png

git config --global pull.rebase true设置为默认变基之后:提示变基成功,且不会出现多余merge image.png

使用:git fetch,git rebase origin/main:(这个效果是和git pull的rebase效果一致的) image.png 再提交: image.png

注意

如果你发现自己跑出来的结果和我不一致,注意查看你当前git的rebase情况,当前git可能和global全局不一样 image.png

结论

想要不出现vim编辑,出现多余的merge信息可以采用:

  • 使用git fetch git rebase origin/主分支,再正常的add提交代码
  • 使用git config pull.rebase true开启rebase,再git pull,再正常的add提交代码