Git Step by Step (6):Git遠端倉庫

發表於2015-03-05

前面文章中出現的所有Git操作都是基於本地倉庫的,但是日常工作中需要多人合作,不可能一直都在自己的程式碼倉庫工作。所以,這裡我們就開始介紹Git遠端倉庫。

在Git系統中,使用者可以通過push/pull命令來推送/獲取別的開發人員的更新,當時對於一個工作組來說,這種方式會效率比較低。所以,在一個Git系統中,都會有一箇中心伺服器,大家都通過中心伺服器來推送/獲取更新。

為了方便本篇例子的進行,我就使用多個目錄來模擬多個使用者以及中心伺服器,這樣就不用搭建Git伺服器了。

  • 中心伺服器:C:\VM\CentralRepo
  • 使用者wilber:C:\VM\wilberWorkSpace
  • 使用者will:C:\VM\willWorkSpace

 

Git遠端倉庫命令

建立中心伺服器

通過前面的文章我們知道可以通過”git init”來建立一個Git倉庫,這裡,我們使用”git init –bare”來建立中心倉庫,注意”–bare”引數,後面進行介紹。

到這裡,一個空的中心伺服器就建好了。

Clone一個倉庫

在Git中,我們有兩種方式建立Git倉庫:一個是通過”git init”建立一個新的倉庫,另一個是通過”git clone”命令clone一個已有的Git倉庫。

既然中心伺服器,使用者will就可以通過clone命令來複制一個Git倉庫。

從上面的clone操作可以看到,在clone命令中需要給出目標倉庫的地址,Git支援http、ssh以及git原生協議來進行clone。這裡為了演示,我們就使用本地目錄。

這時,使用者will就從中心伺服器clone了一個空的倉庫,接下來will就可以在這個本地倉庫工作了。

更新的push和pull

現在will在本地倉庫中新增了一個”calc.py”的檔案,並且提交到了本地倉庫。

為了是其他使用者可以得到這個更新,will需要把這個更新push到中心伺服器上。

現在使用者wilber通過clone方式獲得了中心伺服器上的倉庫副本,通過”git log”will的更新已經自動被clone了下來。

現在,wilber提交了一個新的更新,那麼will就可以通過pull的方式從中心伺服器得到這個更新。

–bare

現在我們看看建立中心伺服器時候用到的”–bare”選項。

“git init –bare”方法建立的是一個裸倉庫,之所以叫裸倉庫是因為這個倉庫只儲存Git歷史提交的版本資訊,而不允許使用者在上面進行各種git操作。

之所以有裸倉庫,是因為用”git init”初始化的版本庫,使用者也可以在該目錄下執行所有git方面的操作。但別的使用者在將更新push上來的時候容易出現衝突。在這種情況下,最好就是使用”–bare”選項建立一個裸倉庫。

上游倉庫(upstream repository)

在Git系統中,通常用”origin” 來表示上有倉庫。我們可以通過 “git branch -r”命令檢視上游倉庫裡所有的分支,再用 origin/name-of-upstream-branch 的名字來抓取(fetch)遠端追蹤分支裡的內容。

從上面可以看出,對於wilber的倉庫,master分支的上游分支是中心伺服器的master分支。

通過上一篇文章的內容,我們可以在中心伺服器上建立兩個新的”release-1.0″和”release-1.1″分支,通過pull命令,使用者wilber就看到了這些上游分支。

–set-upstream-to

當我們相當然的按照前一篇文章在本地倉庫建立一個branch的時候,我們的pull操作會遇到以下問題,提示我們這個branch沒有任何的跟蹤資訊。仔細想想也是,我們應該把本地倉庫中的分支與上游分支關聯起來。這時,我們就可以根據Git的提示,使用”–set-upstream-to”命令進行關聯了。

當然,在Git中我們可以直接通過”git checkout -b localBranchName origin/remoteBranchName”來建立關聯分支。建議一般把”localBranchName”名稱跟”remoteBranchName”名稱設定成一樣。

 

牛叉的patch

在Git中patch絕對是一個很有用的東西。假設在一個沒有網路的環境中,wilber和will還要繼續工作,這時wilber有一個更新,will需要基於這個更新進行下一步的工作。如果是集中式的程式碼版本工具,這種情況就沒有辦法工作了,但是在Git中,我們就可以通過patch的方式,把wilber的更新拷貝給will。

在Git中有兩種patch的方式:一是通過”git diff”生成一個標準的patch,另一個是通過”git format-patch”生成一個Git專用的patch。

基於”git diff”的patch

假設現在wilber更新”calc.py”檔案並且通過”git diff”生成了一個patch。

下面,我們把wilberPatch這個檔案拷貝到will的工作目錄中,然後通過”git apply”應用這個patch,從而得到wilber的更新。

基於”git format-patch”的patch

同樣使用上面的例子,這次我們使用”git format-patch”來生成patch。

注意”git format-patch”命令的引數”origin/master”,這個引數的含義是,找出當前master跟origin/master之間的差別,然後生成一個patch。

把patch檔案拷貝到will的工作目錄,則此我們通過”git am”命令來應用這個patch。

兩種patch方式的比較

下面簡單看看兩種patch方式的比較。

  • patch相容性:”git diff”生成的patch相容性強。也就是說,如果別人的程式碼版本庫不是Git,那麼必須使用git diff生成的patch才能被別的版本控制系統接受。
  • patch合併提示:對於”git diff”生成的patch,你可以用git apply –check 檢視patch是否能夠乾淨順利地應用到當前分支中;如果”git format-patch” 生成的patch不能打到當前分支,git am會給出提示,幫你解決衝突,兩者都有較好的提示功能。
  • patch資訊管理:通過”git format-patch”生成的patch中有很多資訊,比如開發者的名字,因此在應用patch時,這個名字會被記錄進版本庫,這樣做是比較合理的。

 

總結

通過這篇文章,我們瞭解了遠端倉庫的命令以及操作。其實,這才是Git中最常見的工作方式,大家都通過中心伺服器來交換跟新。

同時,我們見識到了Git的patch工具,patch也是一種很常用的交換更新的方式。

相關文章