《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所示。
圖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)。
圖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
圖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