[Git篇]在Dropbox上使用Git版本控制

文章攢寫時間︰2013/03/20 14:37

本篇文章完全取自MRMU STUDIO部落格

一、前言

專案如果是一人開發還好,
要是多人開發,
那要怎麼一起搞下去呢?

如果要跟其他人一起開發專案,
就需要架Git server,
讓多位開發者可以透過存取遠端Server的Repo來進行協同開發,
共同維護同一個專案。
順帶一提,
每位老手大大都建議先去Github.com開一個免費帳號練習一下。

Github提供Git server,
也就是遠端的Repo,
但是免費的限制是你的Repo都是開放的,
如果不想讓他人看到你的程式碼,
就必須付費。

你也許會因為工作的關係,
所以不能公開專案的程式碼,
若是一個人開發那還好,
多人開發的情況下也許又覺得要自架Git server有點麻煩,
有沒有經濟簡單的解決方案呢?
在此提供一個簡單的方式,
就是使用Dropbox作為Git server。

二、本文

什麼是Dropbox?

先在此大致簡介一下:
Dropbox是一個非常棒的雲端檔案儲存服務,
把它安裝好後,
你就可以指定本機端的任一目錄 (預設名叫My Dropbox)成為有雲端儲存功能的目錄,
從此就可以在任何有安裝Dropbox的電腦存取該目錄內的檔案 (當然你要先登入自己的帳密),
所以如果你有一台以上的電腦,
或有iphone、android手機等(皆有dropbox app可下載),
共享檔案就變得非常方便。

除此之外,
你還可以在dropbox的目錄裡開設公開分享的目錄,
邀請其他朋友共同使用該目錄,
如此該目錄也就成為了一個公用槽。

因為dropbox可以開公用目錄,
因此我們可以開一個共用的目錄並邀請開發團隊所有成員一起共用此目錄,
然後把git server放在這個目錄。

在此假設這個共用的目錄叫OurProject。
說是git server,
其實就只是一個共用的Repo存在這裡。
為OurPeoject目錄建立一個repo,
請注意,記得使用加上bare參數:
git init --bare

備註︰
在不加--bare所init完的結果,會是在目前的working目錄下建立.git目錄,並把上述的git相關檔案放在.git目錄裡。
加了--bare的話,則是不建.git目錄,而把裡面的檔案直接放在目前目錄下。
適合在沒有修改檔案或開發的機器上,ex GIT server。
好處是只要maintain git repository,project的資料只存在repository中,不需要再複製一份最新的版本出來,會省點空間。


如此這個目錄就會變成Repo了,
而因為加了bare,
這個目錄不會有.git目錄,
而是把原先.git目錄中的東西都放進來,
而且你日後在這個目錄中不會看到你的程式檔案。

對,不會看到你專案的程式檔案哦,
就是大家把最新進度從遠端Repo拿下來、更新、放回去,
這個目錄裡都看不到專案的程式檔案。
但是其實它已經記錄了最新進度,
只是需要你「拿回家」才看得到。

好,所以現在你的狀況應該是:
專案的程式碼已經先放在一個Repo了(內有程式檔案),
而dropbox也有一個Repo,
但是用bare的方式建立的
(只有git相關檔案,沒有你的程式檔案),
dropbox的Repo我們就先稱之為「遠端Repo」。
在dropbox目錄建好遠端Repo後
(說是遠端,
但其實位在我們本機的dropbox目錄,
但也能說是遠端,
因為跟其他人同步共用中),
進入你專案所在的Repo目錄,
並執行:
git remote add origin Dropbox的目錄/OurProject

如此就會在你專案Repo中建立一個遠端Repo的位址,
然後把這個位址取名為origin,
日後就可以把你的進度放進遠端Repo了。
(通常本地端的Repo預設名是master,而遠端的Repo預設名就是origin)

接著要把你專案Repo的進度放進遠端Repo中,
供其他人取用,
所以要在專案Repo目錄執行Push的指令:
git push origin master

如果push有成功,
你在遠端Repo (dropbox目錄裡的OurProject目錄) 看不到你的程式檔案(剛剛有提過),
要確定是不是真的有push進最新進度,
我們需要再Pull回來看看,
看現在遠端Repo裡是不是最新進度:
git pull origin master 

一下本機一下遠端,操作很複雜?

簡單來說,
 add、commit、branch、checkout等這些都是你自己在本機跟自己玩,
都是操作本機的Repo,
當你要跟其他人一起玩時,
你就要用push、pull,
把別人的成果從遠端Repo拿下來(pull),
自己玩一玩(先commit進自己的Repo,再修改、再commit…),
再丟上遠端Repo(push),
讓其他人也能抓最新進度去玩。

通常我們從遠端Repo拿東西下來,
可以用Clone、Pull、Fetch等方法,
其差異 (就我的理解) 說明如下:

Clone:
會把遠端的repo整個專案抓下來,
放在目前路徑下的新目錄中。
(所以不需要先把新目錄建立成Repo,
就可以整包抓下來,
隨包附上.git目錄)

Pull:
會把遠端的repo整個專案抓下來,
跟你目前所在的Repo及所用的Branch作合併(Merge),
此指令等同Fetch+Merge。

Fetch:
會把遠端的repo整個專案抓下來,
但不跟你目前所用的branch合併,
而是放在本地中的另一個Brance(remoteBranch)。
別人的code跟我寫的衝突了!!!!!!!!!

槽了!專案全亂了!

在teamwork中一「推」一「拉」很有趣,
尤其第一次在Pull別人的成果回來跟自己的成果merge時,
有點怕怕的,
但當你發現它自動merge作得很棒時,
心情也跟著很興奮。
但衝突就這麼發生了!

故事是這樣的… 假設程式檔案Sample.php本來的code是:AA
小明加上BB後,
Pull server的code下來,
跟自己的code完美的合併了(AA+BB沒衝突) 小明commit到自己本地端Repo後,
再Push回Server,
目前Server最新版是:AABB

你現在的code是之前Pull的,
也就是:AA,
現在你刪一個A,
加一個C,
成為了:
AC 接著你先commit到本地端,
然後執行Pull,
要合併別人的進度,
但挫屎了,產生衝突!!
衝突的原因是,
Git不曉得第二個A是否要刪除 (有人要刪,有人要留),
所以它會把這個衝突反應在Sample.php這個檔案中。
開啟Sample.php,
你會看到類似這樣的標記:

第一個A的內容
<<<<<<<
你加的C內容
=======
第二個A的內容
後面BB的內容
 >>>>>>>

<<<<<<< 跟 >>>>>>>標記描述了產生衝突的程式碼,
其間以=======作為區隔,
第一個部份就是你新加的內容,
第二個是遠端的內容,
你一看就會知道這邊有衝突,
於是你要決定怎麼合併它們,
手動更改檔案,
處理好衝突,
先Commit接著Pull再看看有沒有衝突發生,
若還有衝突發生,
就要再手動去檢查產生衝突的檔案,
再Commit,
然後再Pull看看。

直到Pull成功後,
就可以Push回Server,
享受整併最新進度的快感。

相關文章

1. 在Xcode底下使用Git版本控制
2. Git版本控制的進階觀念

沒有留言 :

張貼留言