这个问题是在学习Pro git “远程分支”时产生的疑问。
问题:
git fetch 在抓取远程跟踪分支的时候,到底会不会生成本地副本?
先看原文的讲解,
如果要同步你的工作,运行 git fetch origin 命令。 这个命令查找 “origin” 是哪一个服务器(在本例中,它是 git.ourcompany.com),从中抓取本地没有的数据,并且更新本地数据库,移动 origin/master 指针指向新的、更新后的位置。
从图中来看,因为master分支是本地,从 clone 了远程仓库开始(f4265提交点)之后,本地做了两次提交,生成了新的提交链条。而同时,服务器上有其他人推送了提交到服务器的master分支(31b8e,190a3),因此,当使用 git fetch origin 时,我的理解是:
本地master分支不会受到影响,从分叉点即fetch前的origin/master开始,在本地生成了新的一条分支,这条分支确实在本地生成了副本,同时把 origin/master指针指向了本地副本的末端。
但读到下面,又来了这么一段:
要特别注意的一点是当抓取到新的远程跟踪分支时,本地不会自动生成一份可编辑的副本(拷贝)。 换一句话说,这种情况下,不会有一个新的 serverfix 分支 - 只有一个不可以修改的 origin/serverfix 指针。
我就不明白了,难道我前面的理解是错误的?那 Figure 32 的图示也是错的?根本就不会再本地得到 (31b8e,190a3)这两个提交点,只会在数据库中得到一个新的 origin/master指针?主要原文说的“从中抓取本地没有的数据,并且更新本地数据库”这句话很模糊,这些数据是什么数据也没说。
没毛病。
划重点,这个分支是 master。
所以,需要使用
git checkout -b serverfix origin/serverfix
创建可编辑的本地副本。只有 master 分支会创建可编辑的本地副本。其它的分支都是在
origin/*
下面,需要手动的git checkout -b
。