2012年11月26日 星期一

團隊專案合作利器──Git (上集)


要抓狂了嗎?

假設,你有一個團隊要一起完成一個專案(通常是程式專案)。也就是說,有很多人需要同時修改同樣一組檔案(通常是文字檔)。那麼,做過這件事的人應該都會發現,這是一項比乍看之下還要艱鉅的工作

原因是這樣的:通常,為了讓很多人可以同時工作,我們把同樣一組檔案複製給每一個人,讓大家分別修改自己的那一份,於是大家改呀改的,等到改得差不多了,問題就來了,要怎麼把每個人改的那麼多個不同「版本」合成一個呢?憑大家的記憶,把各自改過的部分湊起來?如果有人漏掉或忘記了呢?如果,兩個人都改了同一個檔呢?這時你大概要抓狂了吧。

何況這已經是最單純的狀況,更別提這個版本有問題時怎麼回到上一個版本或者更多常見的麻煩狀況了。 

救星:Git

所以「版本控管」這個聽起來堅硬到可以讓烏龜住在裡頭的單字,現在就成了我們的救星(確實是有烏龜沒錯,等下會出現)。

今天要介紹的Git就是一款常用的版本控管軟體。能夠遇到他也是我們的福氣。不管你把檔案改了多少版本,複製多少份給多少人,每一個版本他都會老老實實地幫你記住。想回到過去的舊版本?沒問題。想把兩個版本合成一個?沒問題,他通常都可以幫你自動弄好,那怕有兩個人改的是同一個文字檔都行。

這篇文章會用圖解的方式,簡單說明Git運作的概念。至於實際上要如何操作Git並不在本文的範圍內。因為在這方面,網路上已經有相當多的教學文章,我會把相關連結附在文章最後。(高手網友們如果發現錯誤也請不吝指教~)

取得Git

在解說Git的運作概念之前,我還是先說一下,要怎麼把它弄到手。
這是Git的官方網站下載頁面:http://git-scm.com/downloads
Git有多種不同作業系統的版本,所以在大部分的平台都能使用。基本上Git必須用鍵盤打指令操作,這對於初學者或沒有程式背景的人來說可能不夠親和。
如果你希望有一個容易用滑鼠操作的介面,可以再下載 TortoiseGit(烏龜!)這套軟體來安裝(仍須先安裝Git,並且目前只支援Windows)

Git 的運作概念

關鍵詞:Repository, Remote, Origin, Master, Branch, Commit, Push, Fetch, Pull, Merge, Checkout

建立 Repository(repo、倉庫)

通常,我們會把專案的檔案放在一個資料夾當中。而我們為了做版本控管,會把這個資料夾交給Git管理。這類受到Git管理的專案資料夾,被稱為「Repository(倉庫)」。
Git會在Repository裡,自動新增一個隱藏的資料夾「.git」,Git進行版本控管時會用到的檔案資料都放在裡面,通常我們不必理它,只要讓Git自行管理即可。(注意:一旦刪除它,這個專案資料夾就會脫離Git的管理,並且過去的版本與紀錄都將被刪除)

Commit(認定)版本

在專案資料夾成為Repository後,我們通常會讓Git把現在的Repository內容Commit(認定)為一個版本。Commit一個版本的概念有點像是電腦角色扮演遊戲裡的儲存點。
這樣做有兩個好處:
1.當日後這個Repository的內容有變更的時候,Git就可以跟前一個版本比較,告訴我們有哪些新的變更發生。
2.如果我們把專案改壞了,我們可以選擇還原到之前的任何一個版本。

所以每當我們修改專案到一個段落,或是完成一項新的修改,我們就應該要Commit成一個新的版本。在Commit的時候,Git會要求我們輸入註解,在註解當中簡要描述我們在這個版本所做的修改是很重要的。當日後版本一多,這些註解可以幫助我們快速了解每個版本的差異,並且幫助其他團隊成員了解專案的改變。

這個不斷修改,不斷Commit 新版本的過程,就像下圖。
隨著版本的更新,這條線越來越長。


使用 Branch(分支、骨幹)

這一條用來表示版本演進的粗線,就是Branch。我們的專案,從第一個版本,就在一條被稱之為「Master」的Branch上。
有趣的是,其實Branch是可以有很多條的。
當我們打算對專案進行某個瘋狂的實驗或較大的修改,而暫時不希望把這些修改Commit到Master上,那我們就可以設立一個新的Branch(分支)。

比方說,我們專案的最新版本是版本2,我們希望建立一個分支「Test」(名稱可自訂)。
對Git發出指令之並得到新的分支之後,我們的圖就變成這樣:
在分支之後,不管是Master或Test上的版本都可以被修改,並且各自Commit成新的版本。

Checkout(取出)分支

雖然我們可以自由選擇要編輯哪一個Branch,但是別忘了,我們的專案自料夾就那麼一個。我怎麼知道,我現在改的是在哪個分支上的版本呢?

Checkout的用意就是幫助我們在不同的分支之間切換。我們可以命令Git,Checkout(取出)我們想編輯的分支。當我們取出Test,專案資料夾裡的檔案就會變得跟Test的最新版本一模一樣。而切換到Master時,資料夾的檔案也會馬上變成Master 這個Branch的最新版本(預設是最新版本,但事實上你想變到哪個版本都行)。

Merge(合併)分支

如果我們的瘋狂實驗成功,並且希望在Test分支上的版本可以跟Master上的版本合併,那麼我們就可以命令Git進行Merge的動作。
Merge之後,我們還必須要把合併後的成果Commit到Master當中,Master上才會有合併後的新版本。
完成後,就會變成這樣:
即使在Merge之後,Test 這個Branch也仍然可以繼續發展新版本,而且仍然隨時可以再度Merge到Master上。

將Git使用於團隊當中

到前面為止所說介紹的,都只是在自己的Repository裡跟自己玩。Git 真正的威力其實還沒顯現出來。下集我就要來介紹,跟其他夥伴在專案中一起使用Git工作是怎麼一回事。
(敬請期待下集)

參考網頁

VCS版本控制圖解指引-A Visual Guide to Version Control

寫給大家的 Git 教學

Git 初學筆記 - 指令操作教學

Git指令(這種東西,估狗上面資料很多,自己搜尋就有囉~)

沒有留言:

張貼留言