fetch, pull

git fetch 从远端仓库下载新分支与数据    git pull 从远端仓库提取数据并尝试合并到当前分支

Git 有两个命令用来从某一远端仓库更新。 git fetch 会使你与另一仓库同步,提取你本地所没有的数据,为你在同步时的该远端的每一分支提供书签。 这些分支被叫做“远端分支”,除了 Git 不允许你检出(切换到该分支)之外,跟本地分支没区别 —— 你可以将它们合并到当前分支,与其他分支作比较差异,查看那些分支的历史日志,等等。同步之后你就可以在本地操作这些。

第二个会从远端服务器提取新数据的命令是 git pull。 基本上,该命令就是在 git fetch 之后紧接着 git merge 远端分支到你所在的任意分支。 我个人不太喜欢这命令 —— 我更喜欢fetch 和 merge 分开来做。少点魔法,少点问题。 不过,如果你喜欢这主意,你可以看一下 git pull 的 官方文档

假设你配置好了一个远端,并且你想要提取更新,你可以首先执行 git fetch [alias] 告诉 Git 去获取它有你没有的数据,然后你可以执行 git merge [alias]/[branch] 以将服务器上的任何更新(假设有人这时候推送到服务器了)合并到你的当前分支。 那么,如果我是与两三个其他人合作 Hello World 项目,并且想要将我最近连接之后的所有改动拿过来,我可以这么做:

$ git fetch github
remote: Counting objects: 4006, done.
remote: Compressing objects: 100% (1322/1322), done.
remote: Total 2783 (delta 1526), reused 2587 (delta 1387)
Receiving objects: 100% (2783/2783), 1.23 MiB | 10 KiB/s, done.
Resolving deltas: 100% (1526/1526), completed with 387 local objects.
From github.com:schacon/hw
   8e29b09..c7c5a10  master     -> github/master
   0709fdc..d4ccf73  c-langs    -> github/c-langs
   6684f82..ae06d2b  java       -> github/java
 * [new branch]      ada        -> github/ada
 * [new branch]      lisp       -> github/lisp

可以看到自从上一次与远端仓库同步以后,又新赠或更新了五个分支。 “ada”与“lisp”分支是新的,而“master”、“clang”与“java”分支则被更新了。 在此例中,我的团队在合并入主分支之前,将提议的更新推送到远端分支以审核。

你可以看到 Git 做的映射。远端仓库的主分支成为了本地的一个叫做“github/master”的分支。 这样我就可以执行 git merge github/master 将远端的主分支和并入我的本地主分支。 或者,我可以 git log github/master ^master 看看该分支上的新提交。 如果你的远端仓库叫做“origin”,那远端主分支就会叫做 origin/master。几乎所有能在本地分支上执行的命令都可以在远端分支上用。

如果你有多个远端仓库,你可以执行 git fetch [alias] 提取特定的远端仓库, 或者执行 git fetch --all 告诉 Git 同步所有的远端仓库。

简而言之 执行 git fetch [alias] 来将你的仓库与远端仓库同步,提取所有它独有的数据到本地分支以合并或者怎样。

文章导航