顯示廣告
隱藏 ✕
看板 tails
作者 tails (QQ)
標題 [教學] Git使用教學 Part 3 -- 多人作業
時間 2012年03月12日 Mon. AM 02:07:48


到目前為止都是以單機為主的操作
現在開始來談談多人作業是長怎樣

-------------------- 多人作業的概觀 --------------------

多人作業可以有兩種模式
一種作業環境是有像中央式系統一樣的server
另一種是沒有server的

解釋之前先review一下Part 1
中央式系統是一台server做所有版本控制
Git是分散式系統
個別的Client端都會有屬於自己的檔案庫可以做版本控制

代表說每個Client同時也會是Server

沒有Server的圖解:

Client A <-> Client C
   ^            ^
   |            |
   v            |
Client B <------+

有Server的圖解:

Client A <->  Server
   ^            ^
   |            |
   v            |
Client B <------+

每條線都可以代表是pull或是push的動作
從這兩張圖可以發現
其實概觀上兩種差異性是不大 (其實是板主懶得改XD)

但是實際操作上就有點不一樣了
沒有Server的話代表每個Client必需架設Server讓其他Client取用
有Server的話不一定每個Client都要架設Server

首先先來講解有Server的作業環境建置


-------------------- 環境建置 --------------------


假設想選擇有中央Server的話
必需先考慮中央Server要使用什麼系統或模式
最簡單的方式我想應該就是使用Dropbox做共享了
所以以下將以這個方法做說明
雖然網路上說明一堆都是教說要使用Github開帳號練習
只是Github有缺點就是免費帳號只能開公開的repository
如果是兩三隻小貓要協同合作的話,自己架Git server又太麻煩 (參考資料有架設教學)
所以要簡單好用的又不失隱密性的話
相信使用Dropbox會是個好選擇
缺點大概就是每隻小貓都要有Dropbox帳號,還有容量稍小(2G)


Windows 7

上官網下載Windows系統使用的安裝程式安裝
安裝好應該會需要指定資料夾為Dropbox的共用資料夾 (板主又在耍懶了)
未來就把這個資料夾當作是Server端的repository來處理即可

Debian/Ubuntu

安裝指令:

$ sudo apt-get install dropbox

設定好後也會有個目錄是Dropbox的共用資料夾
一樣也是把這個資料夾當作是repository

這一個Part執行的環境裡,~/Dropbox為我的共用資料夾
Dropbox安裝好後
再來就是建立資料夾
並對其他夥伴發出共用要求就可以一起協同工作了
需要注意的是
在server端要執行init時會跟在client執行init不一樣
要加入 --bare 的選項
用意是把原本要放project.git/.git/裡面的東西變成放project.git/裡
也就是這個目錄不直接存放專案的檔案
而是只存放專案的變化過程
但只要有完整的變化過程就有辦法把專案的檔案建立出來
就像有一張建築藍圖,就能建立一個房子
藍圖多一個門,就能建立多一個門的房子 (比喻不大好Orz....)
現在實作看看:

$ cd ~/Dropbox/project.git
$ git --bare init
Initialized empty Git repository in ~/Dropbox/project.git/

它跟你說建立一個空的Git repository
然後我們現在可以把Part 1&2所作的部份當作是local端
~/Dropbox/project.git當作是remote端
再來下一個動作就是到local端建立一個remote

$ cd ~/project.git
$ git remote add origin ~/Dropbox/project.git

它會在Git repository裡新增一個remote位於~/Dropbox/project.git
remote的別名叫origin
通常本地repository預設會叫master
remote預設叫origin
意指origin也能取別的名字

再來我們要把part 1&2做好的東西放上去讓其他夥伴下載
在放上去前我們先查看一下我們目前的master狀態

$ git checkout master
A
	
test4
Switched to branch 'master'
$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#
	
new file:   test4
#

目前有一個檔案還處於stage狀態,先不要管它
檔案要放上去要下git push指令

$ git push origin master
Counting objects: 10, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (10/10), 775 bytes, done.
Total 10 (delta 1), reused 0 (delta 0)
Unpacking objects: 100% (10/10), done.
To ~/Dropbox/project.git
 * [new branch]      master -> master

上傳後會顯示一些訊息
再來我們要做的是把檔案下載下來
下載使用git pull指令

$ cd ~
$ mkdir test
$ cd test/
$ git init
Initialized empty Git repository in ~/test/.git/
$ git remote add origin ~/Dropbox/project.git
$ git pull origin master
remote: Counting objects: 10, done.
remote: Compressing objects: 100% (6/6), done.
remote: Total 10 (delta 1), reused 0 (delta 0)
Unpacking objects: 100% (10/10), done.
From ~/Dropbox/project
 * branch            master     -> FETCH_HEAD
$ git status
# On branch master
nothing to commit (working directory clean)
$ ls
test  test2  test3

可以看到其實test4並沒有被pull下來
因為之前是有提到commit是一個節點
而其實每個branch或tag都是指向這個commit
剛剛在push的時候其實只有push上一個完成的commit而已 (未加test4的commit)

另外補充解釋一下
從remote要下載檔案的時候
可以用fetch、pull、clone三種方法
但是三種方法當然是不一樣的

fetch:會下載remote的最新版,然後放在本地的一個branch裡(以上例來說會放在origin/master的branch裡)
pull:會下載remote的某個branch最新版,並與目前的branch做合併 (等同fetch + merge)
clone:會把remote最新版整包下載,並建立新目錄放在裡面(所以不用git init,也不用branch名)

因為這三個都長的很像
所以我就統一解說了 (分明是懶)
實際簡單的語法如下:

$ git fetch <RemoteName>  #這樣會把remote有的branch都下載
$ git pull <RemoteName> <RemoteBranch>
$ git clone <RepositoryDirectory>  #如 git clone ~/Dropbox/project.git



以上為簡單的Git使用教學
差不多應該是入門吧 (板主也剛入門....)
事實上Git還有更多指令應用
不過目前就先這樣吧

--
下一篇來打補充資料
--
參考資料
Dropbox
Github
Tsung - Linux 架設使用 SSH 共享存取的 Git Server
使用Git與Github管理軟體開發專案
Git教學:Git的遠端操作及利用Dropbox建立Server進行協同開發
Git Study

--
※ 作者: tails 時間: 2012-03-12 02:07:48
※ 編輯: tails 時間: 2012-03-16 18:24:10
※ 看板: tails 文章推薦值: 3 目前人氣: 0 累積人氣: 8314 
分享網址: 複製 已複製
( ̄︶ ̄)b Knuckles, d2wu550, pig 說讚!
r)回覆 e)編輯 d)刪除 M)收藏 ^x)轉錄 同主題: =)首篇 [)上篇 ])下篇