## git fetch 从远端仓库下载新分支与数据 git pull 从远端仓库提取数据并尝试合并到当前分支
Git 有两个命令用来从某一远端仓库更新。 `git fetch` 会使你与另一仓库同步,提取你本地所没有的数据,为你在同步时的该远端的每一分支提供书签。 这些分支被叫做“远端分支”,除了 Git 不允许你检出(切换到该分支)之外,跟本地分支没区别 —— 你可以将它们合并到当前分支,与其他分支作比较差异,查看那些分支的历史日志,等等。同步之后你就可以在本地操作这些。
第二个会从远端服务器提取新数据的命令是 `git pull`。 基本上,该命令就是在 `git fetch` 之后紧接着 `git merge` 远端分支到你所在的任意分支。 我个人不太喜欢这命令 —— 我更喜欢`fetch` 和 `merge` 分开来做。少点魔法,少点问题。 不过,如果你喜欢这主意,你可以看一下 `git pull` 的 [官方文档](http://git-scm.com/docs/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]` 来将你的仓库与远端仓库同步,提取所有它独有的数据到本地分支以合并或者怎样。