閱讀578 返回首頁    go 阿裏雲 go 技術社區[雲棲]


《Git學習指南》——2.3 Git的協作功能

本節書摘來自異步社區《Git學習指南》一書中的第2章,第2.3節,作者: 【德】René Preißel(普萊貝爾) , Bjørn Stachmann(斯拉赫曼)著,更多章節內容可以訪問雲棲社區“異步社區”公眾號查看

2.3 Git的協作功能

現在,我們已經有了一個存放項目文件的工作區,以及一個存放項目曆史的版本庫。在一個像CVS和Subversion這樣傳統的集中式版本係統中,盡管每個開發者也都有屬於他/她自己的工作區,但所有人都共享了一個通用的版本庫。而在Git中,每個開發者擁有的是一個屬於他/她自己的、自帶獨立版本庫的工作區,因此這已經是一個不依賴於中央服務器的、完整的版本控製係統了。開發者們可以通過交換各自版本庫中的提交來實現項目合作。下麵我們就來做個試驗,先創建一個新的工作區,以便我們模擬第二位開發者的活動。

2.3.1 克隆版本庫
我們的這位新開發者首先要有一個屬於他/她自己的版本庫副本(也稱為克隆體)。該副本中包含了所有的原始信息與整個項目的曆史信息。下麵。我們用clone命令來創建一個克隆體。

> git clone /projects/first-steps /projects/first-steps-clone
Cloning into first-steps-clone... 
done.

現在,該項目結構如圖2.4所示。

screenshot

圖2.4 樣例項目與它的克隆體

2.3.2 從另一版本庫中獲取修改
下麵,我們來修改一下first-steps/foo.txt文件,並執行以下操作來創建一次新提交。

> cd /projects/first-steps 
> git add foo.txt 
> git commit --message "A change in the original."

現在,新的提交已經被存入了我們原來的first-steps版本庫中,但其克隆版本庫(first-stepsclone)中依然缺失這次提交。為了讓你更好地理解這一情況,我們來看一下first-steps的日誌。

> git log --oneline 
a662055 A change in the original. 
7ac0f38 Some changes. 
2f43cd0 Sample project imported.

在接下來的步驟中,我們再來修改克隆版本庫中的first-steps-clone/bar.html文件,並執行以下操作。

> cd /projects/first-steps-clone 
> git add bar.html 
> git commit --message "A change in the clone." 
> git log --oneline 
1fcc06a A change in the clone. 
7ac0f38 Some changes. 
2f43cd0 Sample project imported.

現在,我們在兩個版本庫中各做了一次新的提交。接下來,我們要用pull命令將原版本庫中的新提交傳遞給它的克隆體。由於之前我們在創建克隆版本庫時,原版本庫的路徑就已經被存儲在了它的克隆體中,因此pull命令知道該從哪裏去取回新的提交。

> cd /projects/first-steps-clone 

> git pull 

remote: Counting objects: 5, done. 
remote: Compressing objects: 100% (2/2), done. 
remote: Total 3 (delta 0), reused 0 (delta 0) 
Unpacking objects: 100% (3/3), done. 
From /projects/first-steps
   7ac0f38..a662055 master -> origin/master 
Merge made by recursive.  
foo.txt |      2 +-
1 files changed, 1 insertions(+), 1 deletions(-)

如上所示,pull命令從原版本庫中取回了新的修改,將它們與克隆體中的本地修改進行了對比,並在工作區中合並了兩邊的修改,創建了一次新的提交。這個過程就是所謂的合並(merge)。

請注意!合並過程在某些情況下可能會帶來衝突。一旦遇到了這種情況,Git中就不能進行自動化的版本合並了。在這種情況下,我們就必須要手動清理一些文件,然後再確認要提交哪些修改。

在拉回(pull)、合並(merge)的過程完成之後,我們可以用一個新的log命令來查看結果。這次是日誌的圖形化版本。

> git log --graph 
9e7d7b9 Merge branch ’master’ of /projects/first-steps 
* 
|\ 
| * a662055 A change in the original. 
* | 1fcc06a A change in the clone. 
|/ 
* 7ac0f38 Some changes. 
* 2f43cd0 Sample project imported.

這一次,曆史記錄不再是一條直線了。在上麵的日誌中,我們可以很清晰地看到並行開發的過程(即中間的兩次提交),以及之後用於合並分支的那次合並提交(即頂部的那次提交)。

2.3.3 從任意版本庫中取回修改
在沒有參數的情況下,pull命令隻在克隆版本庫中能發揮作用,因為隻有該克隆體中有默認的原版本庫的連接。當我們執行pull操作時,也可以用參數來指定任意版本庫的路徑,以便從某一特定開發分支中提取相關修改。

現在,讓我們將克隆體中的修改pull到原版本庫中吧。

> cd /projects/first-steps 
> git pull /projects/first-steps-clone master 
remote: Counting objects: 8, done. 
remote: Compressing objects: 100% (4/4), done. 
remote: Total 5 (delta 0), reused 0 (delta 0) 
Unpacking objects: 100% (5/5), done. 
From /projects/first-steps-clone
 * branch           master →  FETCH_HEAD
Updating a662055..9e7d7b9 
Fast-forward  
bar.html |    2 +-  
1 files changed, 1 insertions(+), 1 deletions(-)

2.3.4 創建共享版本庫
除了可以用pull命令從其他版本庫中取回相關提交外,我們也可以用push命令將提交傳送給其他版本庫。隻不過,push命令隻適用於那些沒有開發者在上麵開展具體工作的版本庫。最好的方法就是創建一個不帶工作區的版本庫,我們稱之為裸版本庫(bare repository)。你可以使用clone命令的--bare選項來創建一個裸版本庫。裸版本庫通常可被用來充當開發者們傳遞提交(使用push命令)的匯聚點,以便其他人可以從中拉回他們所做的修改。下麵我們來看一個裸版本庫(見圖2.5)。

screenshot

圖2.5 裸版本庫(一個沒有工作區的版本庫)

> git clone --bare /projects/first-steps 
                       /projects/first-steps-bare.git
Cloning into bare repository first-steps-bare.git... 
done.

2.3.5 用push命令上載修改
為了演示push命令的使用,我們需要再次修改一下firststeps/foo.txt文件,並執行以下操作來創建一次新的提交。

> cd /projects/first-steps 
> git add foo.txt 
> git commit --message "More changes in the original."

接下來,我們就可以用push命令向共享版本庫傳送該提交了(見圖2.6)。該指令的參數要求與pull命令相同,我們需要指定目標版本庫的路徑及其分支。

> git push /projects/first-steps-bare.git master 
Counting objects: 5, done. 
Delta compression using up to 2 threads. 
Compressing objects: 100% (2/2), done. 
Writing objects: 100% (3/3), 293 bytes, done. 
Total 3 (delta 0), reused 0 (delta 0) 
Unpacking objects: 100% (3/3), done. 
To /projects/first-steps-bare.git/ 
    9e7d7b9..7e7e589 master -> master

screenshot

圖2.6 經由共享版本庫來進行版本共享

2.3.6 Pull命令:取回修改
現在,為了讓克隆版本庫也得到相應的修改,我們需要在執行pull命令時配置參數指向共享版本庫的路徑參數。

> cd /projects/first-steps-clone 

> git pull /projects/first-steps-bare.git master 

remote: Counting objects: 5, done. 
remote: Compressing objects: 100% (2/2), done. 
remote: Total 3 (delta 0), reused 0 (delta 0) 
Unpacking objects: 100% (3/3), done. 
From ../first-steps-bare 
 * branch      master      -> FETCH_HEAD 
Updating 9e7d7b9..7e7e589 
Fast-forward 
 foo.txt |    2 +- 
 1 files changed, 1 insertions(+), 1 deletions(-)

請注意!如果另一個開發者在我們之前已經做過一次push操作,此次push命令就會被拒絕傳送提交。這時候,我們必須要先做一次pull操作,將其他人新上載的更新取回,並在本地合並。

最後更新:2017-06-06 07:38:29

  上一篇:go  雲端互聯網化辦公時代
  下一篇:go  《Git學習指南》——2.2 第一個Git項目