遠程分支(remote branch)是對遠程倉庫中的分支的索引。它們是一些沒法移動的本地分支;只有在 Git 進行網絡交互時纔會更新。遠程分支就像是書籤,提醒着你上次鏈接遠程倉庫時上面各分支的位置。git
咱們用 (遠程倉庫名)/(分支名)
這樣的形式表示遠程分支。好比咱們想看看上次同 origin
倉庫通信時master
分支的樣子,就應該查看 origin/master
分支。若是你和同伴一塊兒修復某個問題,但他們先推送了一個 iss53
分支到遠程倉庫,雖然你可能也有一個本地的 iss53
分支,但指向服務器上最新更新的卻應該是 origin/iss53
分支。github
可能有點亂,咱們不妨舉例說明。假設大家團隊有個地址爲 git.ourcompany.com
的 Git 服務器。若是你從這裏克隆,Git 會自動爲你將此遠程倉庫命名爲 origin
,並下載其中全部的數據,創建一個指向它的master
分支的指針,在本地命名爲 origin/master
,但你沒法在本地更改其數據。接着,Git 創建一個屬於你本身的本地 master
分支,始於 origin
上 master
分支相同的位置,你能夠就此開始工做(見圖 3-22):數據庫
圖 3-22. 一次 Git 克隆會創建你本身的本地分支 master 和遠程分支 origin/master,而且將它們都指向origin
上的 master
分支。服務器
若是你在本地 master
分支作了些改動,與此同時,其餘人向 git.ourcompany.com
推送了他們的更新,那麼服務器上的 master
分支就會向前推動,而於此同時,你在本地的提交歷史正朝向不一樣方向發展。不過只要你不和服務器通信,你的 origin/master
指針仍然保持原位不會移動(見圖 3-23)。網絡
圖 3-23. 在本地工做的同時有人向遠程倉庫推送內容會讓提交歷史開始分流。fetch
能夠運行 git fetch origin
來同步遠程服務器上的數據到本地。該命令首先找到 origin
是哪一個服務器(本例爲 git.ourcompany.com
),從上面獲取你還沒有擁有的數據,更新你本地的數據庫,而後把origin/master
的指針移到它最新的位置上(見圖 3-24)。spa
圖 3-24. git fetch 命令會更新 remote 索引。指針
爲了演示擁有多個遠程分支(在不一樣的遠程服務器上)的項目是如何工做的,咱們假設你還有另外一個僅供你的敏捷開發小組使用的內部服務器 git.team1.ourcompany.com
。能夠用第二章中提到的 git remote add
命令把它加爲當前項目的遠程分支之一。咱們把它命名爲 teamone
,以便代替完整的 Git URL 以方便使用(見圖 3-25)。code
圖 3-25. 把另外一個服務器加爲遠程倉庫server
如今你能夠用 git fetch teamone
來獲取小組服務器上你尚未的數據了。因爲當前該服務器上的內容是你 origin
服務器上的子集,Git 不會下載任何數據,而只是簡單地建立一個名爲 teamone/master
的遠程分支,指向 teamone
服務器上 master
分支所在的提交對象 31b8e
(見圖 3-26)。
圖 3-26. 你在本地有了一個指向 teamone 服務器上 master 分支的索引。
要想和其餘人分享某個本地分支,你須要把它推送到一個你擁有寫權限的遠程倉庫。你建立的本地分支不會由於你的寫入操做而被自動同步到你引入的遠程服務器上,你須要明確地執行推送分支的操做。換句話說,對於無心分享的分支,你儘管保留爲私人分支好了,而只推送那些協同工做要用到的特性分支。
若是你有個叫 serverfix
的分支須要和他人一塊兒開發,能夠運行 git push (遠程倉庫名) (分支名)
:
$ git push origin serverfix Counting objects: 20, done. Compressing objects: 100% (14/14), done. Writing objects: 100% (15/15), 1.74 KiB, done. Total 15 (delta 5), reused 0 (delta 0) To git@github.com:schacon/simplegit.git * [new branch] serverfix -> serverfix
這裏其實走了一點捷徑。Git 自動把 serverfix
分支名擴展爲refs/heads/serverfix:refs/heads/serverfix
,意爲「取出我在本地的 serverfix 分支,推送到遠程倉庫的 serverfix 分支中去」。咱們將在第九章進一步介紹 refs/heads/
部分的細節,不過通常使用的時候均可以省略它。也能夠運行 git push origin serverfix:serverfix
來實現相同的效果,它的意思是「上傳我本地的 serverfix 分支到遠程倉庫中去,仍舊稱它爲 serverfix 分支」。經過此語法,你能夠把本地分支推送到某個命名不一樣的遠程分支:若想把遠程分支叫做 awesomebranch
,能夠用 git push origin serverfix:awesomebranch
來推送數據。
接下來,當你的協做者再次從服務器上獲取數據時,他們將獲得一個新的遠程分支 origin/serverfix
,並指向服務器上 serverfix
所指向的版本:
$ git fetch origin remote: Counting objects: 20, done. remote: Compressing objects: 100% (14/14), done. remote: Total 15 (delta 5), reused 0 (delta 0) Unpacking objects: 100% (15/15), done. From git@github.com:schacon/simplegit * [new branch] serverfix -> origin/serverfix
值得注意的是,在 fetch
操做下載好新的遠程分支以後,你仍然沒法在本地編輯該遠程倉庫中的分支。換句話說,在本例中,你不會有一個新的 serverfix
分支,有的只是一個你沒法移動的origin/serverfix
指針。
若是要把該遠程分支的內容合併到當前分支,能夠運行 git merge origin/serverfix
。若是想要一份本身的 serverfix
來開發,能夠在遠程分支的基礎上分化出一個新的分支來:
$ git checkout -b serverfix origin/serverfix Branch serverfix set up to track remote branch serverfix from origin. Switched to a new branch 'serverfix'
這會切換到新建的 serverfix
本地分支,其內容同遠程分支 origin/serverfix
一致,這樣你就能夠在裏面繼續開發了。
從遠程分支 checkout
出來的本地分支,稱爲 跟蹤分支 (tracking branch)。跟蹤分支是一種和某個遠程分支有直接聯繫的本地分支。在跟蹤分支裏輸入 git push
,Git 會自行推斷應該向哪一個服務器的哪一個分支推送數據。一樣,在這些分支裏運行 git pull
會獲取全部遠程索引,並把它們的數據都合併到本地分支中來。
在克隆倉庫時,Git 一般會自動建立一個名爲 master
的分支來跟蹤 origin/master
。這正是 git push
和 git pull
一開始就能正常工做的緣由。固然,你能夠爲所欲爲地設定爲其它跟蹤分支,好比 origin
上除了 master
以外的其它分支。剛纔咱們已經看到了這樣的一個例子:git checkout -b [分支名] [遠程名]/[分支名]
。若是你有 1.6.2 以上版本的 Git,還能夠用 --track
選項簡化:
$ git checkout --track origin/serverfix Branch serverfix set up to track remote branch serverfix from origin. Switched to a new branch 'serverfix'
要爲本地分支設定不一樣於遠程分支的名字,只需在第一個版本的命令裏換個名字:
$ git checkout -b sf origin/serverfix Branch sf set up to track remote branch serverfix from origin. Switched to a new branch 'sf'
如今你的本地分支 sf
會自動將推送和抓取數據的位置定位到 origin/serverfix
了。
若是再也不須要某個遠程分支了,好比搞定了某個特性並把它合併進了遠程的 master
分支(或任何其餘存放穩定代碼的分支),能夠用這個很是無厘頭的語法來刪除它:git push [遠程名] :[分支名]
。若是想在服務器上刪除 serverfix
分支,運行下面的命令:
$ git push origin :serverfix To git@github.com:schacon/simplegit.git - [deleted] serverfix
咚!服務器上的分支沒了。你最好特別留心這一頁,由於你必定會用到那個命令,並且你極可能會忘掉它的語法。有種方便記憶這條命令的方法:記住咱們不久前見過的 git push [遠程名] [本地分支]:[遠程分支]
語法,若是省略 [本地分支]
,那就等因而在說「在這裏提取空白而後把它變成[遠程分支]
」。