前面文章中出現的全部Git操做都是基於本地倉庫的,可是平常工做中須要多人合做,不可能一直都在本身的代碼倉庫工做。因此,這裏咱們就開始介紹Git遠程倉庫。git
在Git系統中,用戶能夠經過push/pull命令來推送/獲取別的開發人員的更新,當時對於一個工做組來講,這種方式會效率比較低。因此,在一個Git系統中,都會有一箇中心服務器,你們都經過中心服務器來推送/獲取更新。服務器
爲了方便本篇例子的進行,我就使用多個目錄來模擬多個用戶以及中心服務器,這樣就不用搭建Git服務器了。網絡
經過前面的文章咱們知道能夠經過"git init"來創建一個Git倉庫,這裏,咱們使用"git init --bare"來創建中心倉庫,注意"--bare"參數,後面進行介紹。app
到這裏,一個空的中心服務器就建好了。ssh
在Git中,咱們有兩種方式創建Git倉庫:一個是經過"git init"創建一個新的倉庫,另外一個是經過"git clone"命令clone一個已有的Git倉庫。工具
既然中心服務器,用戶will就能夠經過clone命令來複制一個Git倉庫。fetch
從上面的clone操做能夠看到,在clone命令中須要給出目標倉庫的地址,Git支持http、ssh以及git原生協議來進行clone。這裏爲了演示,咱們就使用本地目錄。3d
這時,用戶will就從中心服務器clone了一個空的倉庫,接下來will就能夠在這個本地倉庫工做了。版本控制
如今will在本地倉庫中添加了一個"calc.py"的文件,而且提交到了本地倉庫。orm
爲了是其餘用戶能夠獲得這個更新,will須要把這個更新push到中心服務器上。
如今用戶wilber經過clone方式得到了中心服務器上的倉庫副本,經過"git log"will的更新已經自動被clone了下來。
如今,wilber提交了一個新的更新,那麼will就能夠經過pull的方式從中心服務器獲得這個更新。
如今咱們看看創建中心服務器時候用到的"--bare"選項。
"git init --bare"方法建立的是一個裸倉庫,之因此叫裸倉庫是由於這個倉庫只保存Git歷史提交的版本信息,而不容許用戶在上面進行各類git操做。
之因此有裸倉庫,是由於用"git init"初始化的版本庫,用戶也能夠在該目錄下執行全部git方面的操做。但別的用戶在將更新push上來的時候容易出現衝突。在這種狀況下,最好就是使用"--bare"選項創建一個裸倉庫。
在Git系統中,一般用"origin" 來表示上有倉庫。咱們能夠經過 "git branch -r"命令查看上游倉庫裏全部的分支,再用 origin/name-of-upstream-branch 的名字來抓取(fetch)遠程追蹤分支裏的內容。
從上面能夠看出,對於wilber的倉庫,master分支的上游分支是中心服務器的master分支。
經過上一篇文章的內容,咱們能夠在中心服務器上創建兩個新的"release-1.0"和"release-1.1"分支,經過pull命令,用戶wilber就看到了這些上游分支。
當咱們至關然的按照前一篇文章在本地倉庫創建一個branch的時候,咱們的pull操做會遇到如下問題,提示咱們這個branch沒有任何的跟蹤信息。仔細想一想也是,咱們應該把本地倉庫中的分支與上游分支關聯起來。這時,咱們就能夠根據Git的提示,使用"--set-upstream-to"命令進行關聯了。
固然,在Git中咱們能夠直接經過"git checkout -b localBranchName origin/remoteBranchName"來建立關聯分支。建議通常把"localBranchName"名稱跟"remoteBranchName"名稱設置成同樣。
在Git中patch絕對是一個頗有用的東西。假設在一個沒有網絡的環境中,wilber和will還要繼續工做,這時wilber有一個更新,will須要基於這個更新進行下一步的工做。若是是集中式的代碼版本工具,這種狀況就沒有辦法工做了,可是在Git中,咱們就能夠經過patch的方式,把wilber的更新拷貝給will。
在Git中有兩種patch的方式:一是經過"git diff"生成一個標準的patch,另外一個是經過"git format-patch"生成一個Git專用的patch。
假設如今wilber更新"calc.py"文件而且經過"git diff"生成了一個patch。
下面,咱們把wilberPatch這個文件拷貝到will的工做目錄中,而後經過"git apply"應用這個patch,從而獲得wilber的更新。
一樣使用上面的例子,此次咱們使用"git format-patch"來生成patch。
注意"git format-patch"命令的參數"origin/master",這個參數的含義是,找出當前master跟origin/master之間的差異,而後生成一個patch。
把patch文件拷貝到will的工做目錄,則此咱們經過"git am"命令來應用這個patch。
下面簡單看看兩種patch方式的比較。
經過這篇文章,咱們瞭解了遠程倉庫的命令以及操做。其實,這纔是Git中最多見的工做方式,你們都經過中心服務器來交換跟新。
同時,咱們見識到了Git的patch工具,patch也是一種很經常使用的交換更新的方式。