Git Step by Step – (6) Git遠程倉庫

前面文章中出現的全部Git操做都是基於本地倉庫的,可是平常工做中須要多人合做,不可能一直都在本身的代碼倉庫工做。因此,這裏咱們就開始介紹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"參數,後面進行介紹。app

到這裏,一個空的中心服務器就建好了。ssh

Clone一個倉庫

在Git中,咱們有兩種方式創建Git倉庫:一個是經過"git init"創建一個新的倉庫,另外一個是經過"git clone"命令clone一個已有的Git倉庫。工具

既然中心服務器,用戶will就能夠經過clone命令來複制一個Git倉庫。fetch

從上面的clone操做能夠看到,在clone命令中須要給出目標倉庫的地址,Git支持http、ssh以及git原生協議來進行clone。這裏爲了演示,咱們就使用本地目錄。3d

這時,用戶will就從中心服務器clone了一個空的倉庫,接下來will就能夠在這個本地倉庫工做了。版本控制

更新的push和pull

如今will在本地倉庫中添加了一個"calc.py"的文件,而且提交到了本地倉庫。orm

爲了是其餘用戶能夠獲得這個更新,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也是一種很經常使用的交換更新的方式。

相關文章
相關標籤/搜索