## 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]`?來將你的倉庫與遠端倉庫同步,提取所有它獨有的數據到本地分支以合并或者怎樣。