详解git pull和git fetch的区别(原理)
感谢原文作者:马恩光
原文链接:https://blog.csdn.net/weixin_41975655/article/details/82887273
前言
在我们使用git的时候用的更新代码是git fetch
,git pull
这两条指令。但是有没有小伙伴去思考过这两者的区别呢?有经验的人总是说最好用git fetch
+git merge
,不建议用git pull
。也有人说git pull
=git fetch
+git merge
,真的是这样吗?为什么呢?
既然如此为什么git还要提供这两种方式呢?
1. 相同点
首先在作用上他们的功能是大致相同的,都是起到了更新代码的作用。
2. 不同点
先补充一些git里面相关的一些知识:
- 首先我们要说简单说git的运行机制。git分为本地仓库和远程仓库,我们一般情况都是写完代码,
commit
到本地仓库(生成本地仓的commit ID
,代表当前提交代码的版本号),然后push
到远程仓库(记录这个版本号),这个流程大家都熟悉。 - 我们本地的
git
文件夹里面对应也存储了git
本地仓库master
分支的commit ID
和
跟踪的远程分支orign/master
的commit ID
(可以有多个远程仓库)。那什么是跟踪的远程分支呢,打开git文件夹可以看到如下文件:
- .git/refs/head/[本地分支]
- .git/refs/remotes/[正在跟踪的分支]
- 其中
head
就是本地分支,remotes
是跟踪的远程分支,这个类型的分支在某种类型上是十分相似的,他们都是表示提交的SHA1
校验和(就是commitID
)。 - 但是,不管他们是如何的相似,他们还是有一个重大的区别:
- 更改远端跟踪分支只能用
git fetch
,或者是git push
后作为副产品(side-effect)来改变。我们无法直接对远程跟踪分支操作,我们必须先切回本地分支然后创建一个新的commit
提交。
首先假设我们本地仓库的 master
分支上 commit ID =1 ,orign/mastter
中的commit ID =1 ;这时候远程仓库有人更新了github ogirn
库中master分支上的代码,新的代码版本号commit ID =2 ,那么在github上 orign/master
的commitID=2,然后我们要更新代码。
1. git fetch
使用
git fetch
更新代码,本地的库中master
的commitID
不变,还是等于1。但是与git上面关联的那个orign/master
的commit ID
变成了2。这时候我们本地相当于存储了两个代码的版本号,我们还要通过merge
去合并这两个不同的代码版本,如果这两个版本都修改了同一处的代码,这时候merge
就会出现冲突,然后我们解决冲突之后就生成了一个新的代码版本。这时候本地的代码版本可能就变成了commit ID=3,即生成了一个新的代码版本。
相当于
fetch
的时候本地的master
没有变化,但是与远程仓关联的那个版本号被更新了,我们接下来就是在本地合并这两个版本号的代码。
2. git pull
- 是用
git pull
更新代码的话就比较简单暴力了,看下图。
使用git pull
的会将本地的代码更新至远程仓库里面最新的代码版本
3. 总结
- 由此可见,git pull看起来像
git fetch
+get merge
,但是根据commit ID来看的话,他们实际的实现原理是不一样的。 - 这里借用之前文献看到的一句话:
不要用
git pull
,用git fetch
和git merge
代替它。git pull
的问题是它把过程的细节都隐藏了起来,以至于你不用去了解git中各种类型分支的区别和使用方法。当然,多数时候这是没问题的,但一旦代码有问题,你很难找到出错的地方。看起来git pull
的用法会使你吃惊,简单看一下git的使用文档应该就能说服你。
将下载(fetch)和合并(merge)放到一个命令里的另外一个弊端是,你的本地工作目录在未经确认的情况下就会被远程分支更新。当然,除非你关闭所有的安全选项,否则git pull
在你本地工作目录还不至于造成不可挽回的损失,但很多时候我们宁愿做的慢一些,也不愿意返工重来。
详解git pull和git fetch的区别(原理)的更多相关文章
- git fetch 、git pull 与 git pull --rebase
1. git fetch 与 git pull 都是从远程拉取代码到本地,git fetch只是拉取到本地,git pull不仅拉取到本地还merge到本地分支中.所以git pull是git fet ...
- git pull和git fetch命令
git pull和git fetch命令 git pull git pull命令的作用是取回远程主机某个分支的更新,在与本地指定分支合并,格式如下: $ git pull <远程主机名>& ...
- 差异:git clone , git fetch, git pull和git rebase
随笔 - 96 文章 - 1 评论 - 6 Git Pull据我所知,当你使用git pull时,它将会获取远程服务器(你请求的,无论什么分支)上的代码,并且立即合并到你的本地厂库,Pull是 ...
- git pull ,git fetch ,git merge
git pull 是git fetch与git merge的组合. 有时候拆开使用,会更加的安全. 比如想比较,本地分支,与线上分支的差别,就可以先 git fetch 这样就可以,git diff ...
- Git应用详解第二讲:Git删除、修改、撤销操作
前言 前情提要:Git应用详解第一讲:Git分区,配置与日志 在第一讲中我们对Git进行了简单的入门介绍,相信聪明的你已经了解Git的基本使用了. 这一讲我们来进一步深入学习Git应用,着重介绍Git ...
- git pull、git fetch、git merge、git rebase的区别
一.git pull与git fetch区别 1.两者的区别 两者都是更新远程仓库代码到本地. git fetch相当于是从远程获取最新版本到本地,不会自动merge. 只是将远程仓库最新 ...
- Difference between git pull and git pull --rebase
个人博客地址: http://www.iwangzheng.com/ 推荐一本非常好的书 :<Pro Git> http://iissnan.com/progit/ 构造干净的 Git ...
- 对比git pull和git pull --rebase
1.使用下面的关系区别这两个操作:git pull = git fetch + git mergegit pull --rebase = git fetch + git rebase 2 一.基本 g ...
- 简单对比git pull和git pull --rebase的使用
使用下面的关系区别这两个操作:git pull = git fetch + git mergegit pull --rebase = git fetch + git rebase 现在来看看git m ...
- 【Git】git pull和git pull --rebase的使用
git pull = git fetch + git mergegit pull --rebase = git fetch + git rebase 现在来看看git merge和git rebase ...
随机推荐
- Git从远程仓库克隆
首先,登陆GitHub,创建一个新的仓库,名字叫gitskills 勾选Initialize this repository with a README,这样GitHub会自动为我们创建一个READM ...
- Limitations of the Lipschitz constant as a defense against adversarial examples
目录 概 主要内容 Huster T., Chiang C. J. and Chadha R. Limitations of the lipschitz constant as a defense a ...
- Augmentation For GAN
目录 概 主要内容 Differentiable Augmentation Adaptive Augmentation 代码 Zhao S., Liu Z., Lin J., Zhu J. and H ...
- BBN: Bilateral-Branch Network with Cumulative Learning for Long-Tailed Visual Recognition
BBN: Bilateral-Branch Network with Cumulative Learning for Long-Tailed Visual Recognition 目录 BBN: Bi ...
- ZooKeeper基础知识总结
数据模型 ZooKeeper数据模型是一个树状的数据结构,类似于文件系统:和文件系统的区别在于树中的每一个节点(叶子节点与非叶子节点)都可以保存数据,且每个节点的访问都必须从根节点开始,以斜线作为分隔 ...
- 完全替代RTD2166方案设计|CS5202直接替代RTD2166|DP转VGA 方案
CS5202可以直接PIN TO PIN替代RTD2166 整体方案设计只需改动一个电阻和一个电容,在性能和参数设定方面与RTD2166可以达成一致,且成本比RTD2166要低,性价比更高.CS520 ...
- 使用.NET 6开发TodoList应用(14)——实现查询过滤
系列导航及源代码 使用.NET 6开发TodoList应用文章索引 需求 在查询请求中,还有一类常见的场景是过滤查询,也就是有限制条件的查询,落在数据库层面就是常用的Where查询子句.实现起来也很简 ...
- Vue.js高效前端开发 • 【Ant Design of Vue框架基础】
全部章节 >>>> 文章目录 一.Ant Design of Vue框架 1.Ant Design介绍 2.Ant Design of Vue安装 3.Ant Design o ...
- Java程序设计基础笔记 • 【第6章 循环结构进阶】
全部章节 >>>> 本章目录 6.1 for循环 6.1.1 for循环的简介 6.1.2 for循环的使用 6.1.3 for循环的表达式 6.1.4 实践练习 6.2 ...
- Hadoop用户配置免密登陆
Hadoop用户配置免密登陆, 参考其他免密配置方法自己总结的更简洁的步骤. 要实现A免密登陆B,需要把A生成的公钥放到B的对应目录下, 要实现ABC之间免密登陆,把3者的公钥汇总到一个文件中, 然后 ...