说一下 git fetch

误解

当在 Google 上搜索 git fetch 作用的时候,获取到的内容都是类似:

git fetch:从远程获取最新版本到本地,但不会自动merge,用于从远程跟踪分支下载和查看其他人完成的最新提交,但不将这些提交合并到本地存储库中。 它从远程存储库中获取更改并将其存储在本地存储库中。
git pull:从远程获取最新版本并merge 到本地,它会自动将提交合并到您的本地存储库中,而无需查看提交。

人的思维是很容易被操控的。往往非常正确的话,却能把人往歧路上带,路走着走着就窄了。

网上充斥的对 git fetch 的介绍,都是和 git pull 比较,仿佛 git fetch 的作用就是为了合并代码而更新,只是做了 git pull 一半的工作。

而实际上,git fetchmerge 完全没有关系!!

本质

当我们把代码库从远程 clone 下来后,在本地磁盘上至少有几个分支?会有一个本地分支,比如叫 master,没有了吗?其实至少还有一个远程分支,比如叫 origin/master 的,也在本地

当我们运行 git branch -r 查看远程分支情况的时候,这个命令并不会去远程仓库检索,而只是在你 clone 下来的本地的仓库进行检索。远程仓库的一些更新,无论是和代码的提交,还是分支的创建,还是加了 tag相关,你在本地是无法感知到的。

比如某人推送了一个新的分支 release/v1.1 到远程仓库,你在本地反复的运行 git branch -r 都是看不到的。

想要知道以上这些,就需要运行 git fetch 来从远程仓库获取。从远程仓库更新下来的信息,存放在本地仓库的远程分支中,比如 origin/*

所以,git fetch 仅仅只是从远程仓库更新信息,仅此而以。至于后面是要合并新的提交还是要切换到新的分支,那是之后的选择。

man中的信息

man git fetch:

Fetch branches and/or tags (collectively, “refs”) from one or more other repositories, along with the objects necessary to complete their histories.