Eric
: 這樣你應該 集中式版本控制 與 分散式版本控制 兩者之間的差異,其中 Subservion 是很經典的集中式版制系統[^註1]。不過,因為你之前沒有使用過版控系統,個人建議使用分散式散本控制系統中的 Git。
吉米
: 為什麼 Eric 你會建議使用 Git 呢?
Eric
: 目前 Git 被許多開發人員使用。再者,有許多的網路服務商提供免費或付費的服務,這部份想必對你有也會很多的幫助。
吉米
: 這麼說來,使用這些網路服務的同時,就等於又多一個備份的機制。
Eric
: 沒錯,我們再複習一下分散式版本控制的架構。
(圖片出處: Tutos Android France)
在分散式版本控制系統中,分成本地端與遠端 Repository。
在本地端,為了確實的管控所有的檔案變更與異常,並讓使用者充分的運用到版本控制系統的支援。分成工作區(Working Copy/Working Directory)、暫存區(Staging area)以及本地Repository。
工作區
這個部份,是我們進行檔案操作的位置。不管是 切換 (checkout)、複制 (clone)、重置 (reset)、拉 (pull),複原 (discard) 等動作結果,都會直接影響這邊。
暫存區
當工作複本內容檔案修改後,會將要上傳變更的內容快照一份放在這邊。在 提交 (commit) 時,會將這區域內的資料,上傳到到 Repository。
本地 Repository
保存了所有變更過的檔案,以及各版本的歷史紀錄。
在遠端,也會存在一個遠端 Repository,以儲存管理所有使用者,所上傳的最終變更的版本資訊。同時,也是它提供其他使用者同步資訊的共同來源。利用 推(push)、拉 (pull)、複制 (clone)、拿取(fetch) 等動作,來達到同步旳結果。
吉米
: 聽完你的說明後,對分散式版本控制系統的架構與流程,有比較客觀的認識。當我在本地端,將版控系統建立起來後,就可以立即享受版控帶來的支援與好處。
等到那天,需要在其他台電腦或與其他人協合開發時,也可以利用遠端 Repository 來同步開發的進度。
Eric
: 沒錯,那我們先了解 Git 本地端的使用方式。
git init
git commit
git checkout master
git reset C3
Eric
: 剛剛提到的 commit、checkout、reset 都是在基本的版本管理與記錄,只會這些是無法支援多變的開發需求的。
吉米
: 確實,假若遇到部份功能客制化的需求,這些指令好像無法派上用途,難道要再建一個新的 Repository 嗎?
Eric
: 哈哈,當然不是。所以接下來,要提到 branch、merge 的觀念了。
當我們使用 Git 時,一定會有一條主線 master,但是在實務上,有時會遇到幾種狀況。
像這個時候,為了跟原本軟體版本有所差異,只好分成不同版本,以方便管理。
git branch develop
git merge master
Eric
: 說完 branch、merge 的觀念後,接著來聊聊 遠端 Repository 與 本地端 Repository 的同步。
吉米
: 嗯嗯,記得先前你有提到 push、pull、clone、fetch 這幾個名詞。
Eric
: 說到本地端與遠端的同步,不外乎就是 把資料丟上去的 push,以及把資料抓下來的 clone、fetch、pull。接下來,我們來聊一下 clone、fetch、clone 三者的差異。
因為本地端在沒有設定前,它並不知道遠端 Repository 的位置。所以要同步資訊到遠端前,必需先將遠端 Repository 建立起來後,將它跟本地端進行綁定。
git remote add origin http://xxxx.xxx.xx.xx/ironman/git_tech.git
git push origin master
git push origin master:master
git push origin master:sup
git fetch
git pull
git clone
Eric
: 說了這麼多,但還有很有很多指令都還沒有提到,像 request push、rebase 等等,有機會你再去好好了解它們的用法。
吉米
: 這樣就對有我很大的幫助。不過,對於我這樣的新手,git 沒有提供 GUI 工具呢?
Eric
: 好問題,在 Git 官網中,有提供 GUI Client 的軟體清單,提供下載。你可以選擇自己喜歡的軟體。接著,我們聊聊提供 Remote Repository 的網路服務商。
[^註1]: DEMO大,對於 Subversion SVN 版本控管寫了一系列的教學文章,有興趣可以參考延伸閱讀第 4 項 。