前言
git fetch和 git pull 都可以将远程仓库更新到本地,那么它们有什么区别呢?想要弄清楚这个问题,有几个概念不得不提。
fetch_head
是一个版本连接,记录在本地的一个文件中,指向着目前已经从远程仓库取下来的分支的末端版本。
commit-id
在每次本地工作完成后,都会做一个git commit操作提交当前操作到本地仓库,此时会产生一个commit-id,这是唯一一个能标识这个版本的序列号,在使用git push后,这个序列号还会同步到远程仓库。
git fetch
有了以上概念再来说说git fetch
这将更新git remote中所有的远程仓库所包含分支的commit-id,将其记录到.git/fetch_head文件中。
git fetch更新远程仓库的方式如下:
//在本地新建一个temp分支,并将远程origin仓库的master分支代码下载到本地temp分支
git fetch origin master:tmp
//来比较本地代码与刚刚从远程下载下来的代码的区别
git diff tmp
//合并temp分支到本地的master分支
git merge tmp
//如果不想保留temp分支 可以用这步删除
git branch -d temp
git pull
首先基于本地的fetch_head记录,比对本地的fetch_head记录与远程的的版本号,然后git fetch获得当前指向的远程分支的后续版本的数据,然后再利用git merge将其与本地的当前分支合并。所以可以认为: git pull = git fetch + git merge。
git pull的用法如下:
//取回远程主机某个分支的更新,再与本地的指定分支合并。
git pull <远程主机名> <远程分支名>:<本地分支名>
因此,git fetch是从远程获取最新版本到本地,但不会自动merge。
而git pull则是会获取所有远程索引并合并到本地分支中来。效果相同时git pull将更为快捷。