git fetch
底层运行原理解析
*重要的概念 FETCH_HEAD
*
FETCH_HEAD指的是: 某个 branch
在服务器上的最新状态, 每一个执行过 fetch
操作的项目都会存在一个 FETCH_HEAD
列表, 这个列表保存在 .git/FETCH_HEAD
文件中,其中每一行对应于远程服务器的一个分支。当前分支指向的 FETCH_HEAD
,就是这个文件第一行对应的那个分支。
一般来说, 存在两种情况:
如果没有显式的指定远程分支, 则远程分支的master将作为默认的FETCH_HEAD.
如果指定了远程分支, 就将这个远程分支作为FETCH_HEAD.
功能说明
从远程获取最新版本到本地,不会自动merge
使用说明
常见的git fetch 使用方式包含以下三种:
1.* git fetch
无参 和 git fetch origin
*
这一步其实是执行了两个关键操作:
创建并更新所有远程分支的本地远程分支.
设定当前分支的FETCH_HEAD为远程服务器的master分支 (上面说的第一种情况)
需要注意的是: 和push不同, fetch会自动获取远程`新加入'的分支.
2.* git fetch origin branch1
*
设定当前分支的 FETCH_HEAD
为远程服务器的 branch1
分支.
注意: 在这种情况下, 不会在本地创建本地远程分支, 这是因为: 这个操作是 git pull origin branch1
的第一步, 而对应的pull操作,并不会在本地创建新的branch.
一个附加效果是:
这个命令可以用来测试远程主机的远程分支branch1是否存在, 如果存在, 返回0, 如果不存在, 返回128, 抛出一个异常.
3.* git fetch origin branch1:branch2
和 git fetch origin :branch2
*
首先执行上面的fetch操作
使用远程branch1分支在本地创建branch2(但不会切换到该分支), 如果本地不存在branch2分支, 则会自动创建一个新的branch2分支, 如果本地存在branch2分支, 并且是
fast forward
,则自动合并两个分支, 否则, 会阻止以上操作。
git fetch origin :branch2
等价于 git fetch origin master:branch2