git pull原理

1. git fetch

如果远程仓库新建分支,或者有新的commit,使用git fetch 会把本地对应的远程分支信息进行更新

在远程仓库新建一个dev 分支,并在远程dev分支上进行一次commit然后本地执行git fetch
在这里插入图片描述
可以发现本地仓库会有如下变化:

①是 objects文件夹下会多出3个目录,3个文件夹(对应远程dev分支的一次commit)
一个是blob对象, 一个是tree对象, 一个是commit对象
在这里插入图片描述
②同时本地会在refs/remotes下多出dev文件
③在logs下也会有dev文件
在这里插入图片描述
④关键地方是会生成FETCH_HEAD文件
在这里插入图片描述
FETCH_HEAD文件中存储的是远程仓库分支的最新信息
此时我们是在master分支上进行的git fetch,
那么FETCH_HEAD文件中第一行就是显示master分支的最新信息
在这里插入图片描述
如果此时我们切换到dev分支,那么那么FETCH_HEAD文件中第一行就是显示dev分支的最新信息
在这里插入图片描述
在这里插入图片描述

2. git pull = git fetch + git merge

我们在远程仓库的dev分支进行一次commit
到本地执行一次tree .git/ 查看git文件夹状态 ,此时是有19个文件夹,22个文件
在这里插入图片描述
为了更好演示git pull,我们本地切换到dev 分支进行git pull -v
(加上 -v 参数,可以查看更多信息)

git pull时 首先会执行git fetch, 先把本地的远程分支信息压缩到git-upload-pack文件然后post到远程仓库
这样git 把本地的远程分支与 远程仓库分支进行比较,才知道需要更新哪些信息
在这里插入图片描述
可以发现,这里git fetch 更新了本地的dev远程分支(因为我们在github上对dev分支进行了一次commit)
git fetch后, 执行了一次git merge(这里是fast - forward模式)
因此我们本地的dev 分支此时是落后于远程dev分支一个commit,所以这里是fast-forward模式

执行git pull后,本地的git文件夹数量也发送了变化,由之前的19个目录,22个文件变成了22个目录,26个文件
在这里插入图片描述
这里新增的目录和文件主要是执行了一次git fetch
本地会增加这一次commit对应的3个目录,3个文件;
同时还多了一个ORIGIN_HEAD文件
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

可以发现ORIGIN_HEAD文件中存储的是一个commit对象的hash值,而这个hash值正好是本地的dev分支合并之前所指的commit对象

这个ORIGIN_HEAD文件有什么用处呢??
可以用来回滚
比如,我们想撤销这一次git pull,想回到pull之前的状态,那我们可以执行
在这里插入图片描述
执行git branch -vv进行查看 ( 可以查看到本地分支与远程分支的同步关系)
在这里插入图片描述
可以发现本地dev分支已经回退,此时落后于远程dev分支一次commit
在这里插入图片描述

此时如果我们又想回到回到dev分支最新状态,可以在dev分支上于origin/dev进行merge
在这里插入图片描述
发现本地dev分支和远程dev分支保持同步!!
在这里插入图片描述

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值