说一下 git fetch
误解
当在 Google 上搜索 git fetch
作用的时候,获取到的内容都是类似:
git fetch:从远程获取最新版本到本地,但不会自动merge,用于从远程跟踪分支下载和查看其他人完成的最新提交,但不将这些提交合并到本地存储库中。 它从远程存储库中获取更改并将其存储在本地存储库中。
git pull:从远程获取最新版本并merge 到本地,它会自动将提交合并到您的本地存储库中,而无需查看提交。
人的思维是很容易被操控的。往往非常正确的话,却能把人往歧路上带,路走着走着就窄了。
网上充斥的对 git fetch
的介绍,都是和 git pull
比较,仿佛 git fetch
的作用就是为了合并代码而更新,只是做了 git pull
一半的工作。
而实际上,git fetch
和 merge
完全没有关系!!
本质
当我们把代码库从远程 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.