详解git pull和git fetch的区别

git pull和git fetch的区别, 网上人云亦云胡说八道的实在是太多了,误导我很久。
今天看到一个说得好的,记录一下。


前言

在我们使用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没有变化,但是与远程仓关联的那个版本号被更新了,我们接下来就是在本地合并这两个版本号的代码。

  1. git pull
    是用git pull更新代码的话就比较简单暴力了,看下图。

使用git pull的会将本地的代码更新至远程仓库里面最新的代码版本

  1. 总结
    由此可见,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客户端的时候,它会提示你选择如何设置git pull的含义,如下图:

安装git的时候配置命令的含义

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/284717.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

统计3个点在3维空间的分布

在4*4*4的立方体中,随机取3个点,有64*63*62/641664个结构, 21440 % 20224 % 1 1728 0.0415 17 1728 0.041475 2 1728 0.0415 18 1728 0.041475 3 576 0.0138 19 384 0.009217 4 576 0.0138 20 3456 0.082949 5 …

简述SD-WAN组网的五大技术优势

在信息时代,企业对网络的需求不再局限于简单的连接,而是追求更加高效、灵活和可靠的网络架构。SD-WAN(软件定义广域网)作为一项先进的组网技术,以其独特的优势成为企业网络升级的热门选择。本文将深入探讨SD-WAN的技术…

Ubuntu 虚拟机环境,编译AOSP源码

环境 : VMware虚拟机 Ubuntu 20.04.3 LTS 搭建配置开发环境 sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev gcc-multilib g-multilib libc6-dev-i386 libncurses5 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl…

2023年全球运维大会(GOPS深圳站)-核心PPT资料下载

一、峰会简介 1、大会背景与概述 全球运维大会(GOPS)是运维领域最具影响力的国际盛会,每年都会汇聚世界各地的运维专家、企业领袖、技术爱好者,共同探讨运维技术的最新发展、最佳实践以及面临的挑战。2023年GOPS深圳站作为该系列…

JDK21+HADOOP3.2.2+Windows安装步骤

哈哈哈 最近转战大数据这块了,分享一下hadoop3.2.2的安装步骤 借鉴了不少大佬的文章,如有雷同,都是大佬们的 1.JDK安装 我选择的是JDK21 以下是下载网址和截图,这个没有太多的,一般下载最新的就可以 JDK: Java Down…

Excel 如何把一句话里的特定字标记颜色

方案: 借助Work功能 诉求:把如下Excel内容里所有的天标记为红色 第一步:复制到World里 第二步: CtrlH 然后如图执行替换 第3步:World 复制会 Excel

HTML---CSS美化网页元素

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 一.div 标签&#xff1a; <div>是HTML中的一个常用标签&#xff0c;用于定义HTML文档中的一个区块&#xff08;或一个容器&#xff09;。它可以包含其他HTML元素&#xff0c;如文本、图像…

引领半导体划片机行业,实现钛酸锶基片切割的卓越效能

在当今快速发展的半导体行业中&#xff0c;博捷芯以其卓越的技术实力和精准的行业应用&#xff0c;脱颖而出&#xff0c;再次引领行业潮流。这次&#xff0c;他们将先进的BJX3356划片机技术应用于钛酸锶基片的切割&#xff0c;为半导体制造行业的进一步发展提供了强大的技术支持…

olap/clickhouse-编译器优化与向量化

本文主要结合15721和clickhouse源码来聊聊向量化&#xff0c;正好我最近也在用Eigen做算子加速&#xff0c;了解下还是有好处的。 提示编译器 提示编译器而不是复杂化简单的代码 什么时候使用汇编&#xff0c;什么时候使用SIMD&#xff1f;下面有几个基本原则&#xff1a; …

饥荒Mod 开发(十六):五格装备栏

饥荒Mod 开发(十五)&#xff1a;小地图显示物品 源码 饥荒中的装备栏只有3个实在太少了&#xff0c;手&#xff0c;头&#xff0c;身体。 身体上装备的物品会有冲突&#xff0c;很多不能一起装备&#xff0c;比如 衣服&#xff0c;项链&#xff0c;背包等。 而这三种物品又有自…

OpenHarmony应用开发环境搭建指南

OpenHarmony的应用开发主要是基于Deveco Studio&#xff08;目前只支持Windows及Mac平台&#xff09;搭配相应的SDK进行&#xff0c;现对开发环境的搭建进行说明。 1:Deveco下载安装 下载对应平台的安装包即可。接下来以Windows平台为例&#xff0c;进行开发环境的搭建。 下载…

解决:Invalid bound statement (not found): com.XXXXX.UserMapper.countUser

问题&#xff1a;Invalid bound statement (not found): com.XXXXX.UserMapper.countUser 原因&#xff1a;mapper.java和mapper.xml映射不上 解决方法&#xff1a; 1、在application.properties全局配置文件中没有加上映射mapper文件的配置,mapper为resources下的文件&…