git pull 与 git fetch 的区别

一、区别。

git pull 根据不同的配置,可等于 git fetch + git merge 或 git fetch + git rebase。

git fetch 并没更改本地仓库的代码,只是拉取了远程 commit 数据,将远程仓库的 commit id 更新为latest。

二、git 架构理解。

要理解它们的区别,首先我们需要明白的git的架构,它是分布式的版本管理系统。我画了张图,不仅仅涉及到 git fetch 和 git pull,

对整体理解也会很有帮助。如下:

上图展示了git的整体架构,以及和各部分相关的主要命令。先说明下其中涉及的各部分。

工作区(working directory),简言之就是你工作的区域。对于git而言,就是的本地工作目录。工作区的内容会包含提交到暂存区

和版本库(当前提交点)的内容,同时也包含自己的修改内容。

暂存区(stage area, 又称为索引区index),是git中一个非常重要的概念。是我们把修改提交版本库前的一个过渡阶段。查看GIT

扫描二维码关注公众号,回复: 9436271 查看本文章

自带帮助手册的时候,通常以index来表示暂存区。在工作目录下有一个.git的目录,里面有个index文件,存储着关于暂存区的内

容。git add命令将工作区内容添加到暂存区。

本地仓库(local repository),版本控制系统的仓库,存在于本地。当执行git commit命令后,会将暂存区内容提交到仓库之中。

在工作区下面有.git的目录,这个目录下的内容不属于工作区,里面便是仓库的数据信息,暂存区相关内容也在其中。这里也可

以使用merge或rebase将远程仓库副本合并到本地仓库。图中的只有merge,注意这里也可以使用rebase。

远程版本库(remote repository),与本地仓库概念基本一致,不同之处在于一个存在远程,可用于远程协作,一个却是存在于本

地。通过push/pull可实现本地与远程的交互;

远程仓库副本,可以理解为存在于本地的远程仓库缓存。如需更新,可通过git fetch/pull命令获取远程仓库内容。使用fech获取

时,并未合并到本地仓库,此时可使用git merge实现远程仓库副本与本地仓库的合并。

三、操作分析。

具体的行为,可以尝试看看.git文件夹:./git/refs 里面有三个文件夹:heads、remotes、tags。

heads 和 remotes 分别记录的就是本地和远程不同仓库的最新 commit id。

可以执行下 git fetch origin。通过文件修改日期,发现 remotes 分支里的 commit id 改变了,heads 分支里的 commitid 未改变。同时,本地的 master 分支代码也没有改变。

执行 git pull 命令,发现 heads 和 master 分支里的 commit id 改变了,本地 master 分支代码也改变了。

 

作者:magic_kid_2010,如果觉得笔者的博客对您有所帮助,欢迎【犒赏

发布了82 篇原创文章 · 获赞 13 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/magic_kid_2010/article/details/100980938