運用 Git 進行版本控管 – 使用 Visual Studio + Team Foundation Server


作者 – 李智樺 (Ruddy)

註 - Team Foundation Service 已於 2013/11月改名為 Visual Studio Online

Visual Studio是少數能夠同時提供集中式及分散式的程式碼版本控管軟體,Visual Studio在加入Git功能之後,現在的程式設計人員便可以直接運用VS連接到任何執行Git的主機 (例如 Team Foundation Server 或 Team Foundation Service) 進行版本控管,這代表著.Net的開發人員也可以和其他開源程式碼的工程師透過Git一起分享程式資源了。

Team Foundation Server 的二種版本控管:

l   集中式版本控管 -- Team Foundation Version Control, TFVC.

l   分散式版本控管 -- Git

在開始撰寫程式的時候,程式設計師依照團隊的規定或個人的習慣,選擇在新建一個軟體專案時,把軟體的版本控管交給集中存放在伺服器上的TFVC或分散在各個開發成員機器上儲存機制(repository)內的Git機制。 由於Visual Studio 2013的開發團隊,不但實作了Git機制而且更在UI的操作介面上完全取代了Git原有的命令列指令模式(如果你習慣採用命令列的模式處理 Git的話,請參考: Git-TF, http://gittf.codeplex.com/),這一點大大的減少了Git的學習曲線,也因此進一步的改變了程式設計師的專案開發步驟,簡單說明如下:

 

步驟一、啟動 VS後,勾選右下角的加入至原始檔控制選項。VS會在建立好方案(solution)後彈出以下視窗詢問選擇 TFVC或Git作為原始程式碼的版本控制。

 

圖一、 選擇原始檔控制選項的彈出畫面。

 

選擇Git,便擁有了離線開發,輕易開啟新的分支的自由度。

 

步驟二、新增測試專案,選擇單元測試。

此時;你便可以開始加入程式碼了,如果你採用的是測試開發的方式(TDD, Test Driven Development),那就是先寫測試程式再寫程式的編碼方式,也就是先執行測試程式,當得到了錯誤訊息時再開始啟動撰寫正式的程式編碼,也就是從單元測試專案先入手,一直測到沒有錯誤訊息時,也就完成了編寫一個程式撰寫單元。若你並未採用 TDD的開發方式,那就是由原本專案入手開始撰寫程式,並請記得在完成一個單元的程式撰寫後,一定要補上單元測試。

 

步驟三、版本送出(Submit)。點選 Team Explorer 選擇認可功能。以下圖二為Team Explorer的顯示,是在詢問使用者對此次的變更,是要存在本地端或雲端的Git Server上(遠端的伺服器你可以選擇TFS、in the cloud或存放在CodePlex上面),右側的圖三顯示當你點選了認可(Commit)後會出現與上一次認可後有異動部分檔案的通知畫面。

                               

圖二、認可選擇伺服器畫面。                                                                                                                                  

圖三、異動的檔案通知畫面。

 

圖三的畫面將會要求使用者輸入此次認可的原因,是針對使用者有程式碼異動的時候,不論是為了加入新功能編寫程式碼或是為了除錯而修改程式碼都必須輸入的說明。這個「認可訊息」是設計成一定要輸入的強制欄位,從此以後我們便可以藉此來分辨程式進行修改的理由。在點選認可並輸入說明之後才會進行更新存檔。

 

圖四、右側的方案總管在第一列上面按右鍵,選擇「檢視記錄」既可顯示如圖四的認可記錄。至於右上角那個紅色標籤所顯示的則是程式所在的分支名稱(若無更改名稱則內定為master)。

 

步驟四、接下來便應該視你所開發的專案類型進行發布,讓整個專案由進入版本控管成為一個開始,然後進行開發作業、測試接著便是持續整合完成可以發布的作業,最後進行整合測試。

 

補上一張在進行程式認同時,使用者可以很容易地做程式差異的畫面檢視行為。

 

圖五、程式差異的檢視

 

Git工作原理和分支模式

Git 的內部工作原理和分支模式,學習這些內容對於理解 Git 的用處和強大特性是非常重要的。如圖六所示,每個開發者都對原本(origin)的程式庫取得程式檔和PUSH程式。但是除了集中式的存取程式碼的關係之外,每個開發者也可以從子團隊的其他隊友那裡獲得程式碼版本變更,這便是Git的分散式工作模式所帶來的彈性及便利。例如,對於2個或多個開發者一起完成的大版本變更,為了防止過早地向原本程式庫PUSH工作內容,這種機制就變得非常有用。如下圖中子團隊:Alice和Bob,Alice和David,Clair和David之間的相互支流擷取(sub stream fetching)方式。

 

圖六、Git工作原理: 支流擷取

 

Git程式檔的狀態變化週期

 

圖七、程式檔的狀態變化週期

當我們創建了一個專案並選擇Git做為版本控管的儲存機制(此時資料放在本地端的repository內),在未經修改之前它並不會被從這個儲存機制中取出任何檔案來做拷貝工作。直到當我們開始對這些檔案作了一些修改,在完成了某一個階段的程式撰寫或異動的目標之後,最後開始進行送出(Submit)本次更新到儲存機制中(如上圖,進入階段性暫存狀態)。

要注意的是,在工作目錄下面的所有檔案都不外乎這兩種狀態:已追蹤或未追蹤。已追蹤的文件是指本來就被納入版本控制管理的文件,在上次快照中已經有它們的記錄了。但在工作一段時間後,它們的狀態可能是未更新、已修改或者已放入暫存區(階段檔案)。而所有其他檔案都屬於未追蹤檔。它們既沒有上次更新時的快照,也不在當前的暫存區域。初次拷貝某個儲存機制時,工作目錄中的所有檔案便都屬於已追蹤檔,且狀態為未修改。

在編輯過某些檔案之後,Git 將這些檔案標為已修改。並將逐步把這些修改過的檔案放到暫存區域,直到最後一次性送出(Submit)所有這些暫存起來的檔案,如此不斷的重複著,使用Git時的檔案狀態變化週期如圖七所示。

 

有了Git,該怎麼運用它呢?

因為Git是分散式的版本控管架構,因此每個參與的成員都會在本地端存放一組完整的原始檔案,他的好處是讓你可以離線的進行持續開發作業。有了這樣的本地端儲存機制 Repository,接著你該怎麼做呢?

首先,你可以決定原始碼要存在哪裡?除了本地端的Repository之外,你可以考慮要放在 Team Foundation Server (TFS)內或雲端,任何一個你可以輕鬆存取的到的伺服器(CodePlex.com 也是一個好選擇)。

再來,就是Git的設定。它看似簡單但其實背後有著還算陡峭的學習曲線,尤其是它在管理操作上,因為Git原本是設計成運用控制台一行一行下達命令的工作模式,經由執行單一個命令就能完成一些個必要的工作,這是它的工作模式,但在VS中已經可以完全轉換成藉由使用者介面操控的形式。這一點,造成它的操控變得簡單了,也提供我們除了在個人開發程式時能夠多加運用之外,用在團隊協作上才是它真正的課題,這一點有待我們透過不斷的實踐、思考、再實踐來循序漸進的掌握它,但好消息是TFS已經幫我們把大部分的管理操作功能都製作成可以被循序操作的使用者介面,也大大的降低了學習Git的門檻。

 

如何加入團隊Git的使用行列呢?

首先,你要在本地端先選好儲存機制的位置,這一點,需要保持簡潔的命名;請務必將所有的目錄以及次目錄選擇較簡短的命名,並避免重複。對檔案總管可以處理的空白間隔也應該加以避免,如此可以保持清晰性,用來避免在需要使用到控制台命令列鍵入指令時由空白間隔所造成的不必要困擾。

接著,就是將團隊Git 伺服器上的原始檔進行複製(Clone)下來到你的本地端儲存機制的位置,然後你便可以開始寫程式了,然後在工作告一段落後在運用 PUSH的方式將程式碼更新回伺服器(Submit)。

 

當你在進行離線開發時,又害怕會跟團隊脫勾產生程式碼的衝突時,最常見的Git工作流程便是從master之下再創建一個分支,然後便可以在這個分支中開始撰寫程式,最後再把這個分支合併回master中即可。

最後;應該適當的設定一些可以被忽略的屬於本地端的專屬檔案,它們是設定在 .gitignore 檔案裡。至於Git的屬性設定,則可以在.gitattributes裡面進行設定,例如: 如何來處理跳行等本地端的Git工作屬性(如圖八所示,可以在Git 設定畫面隨時更改及修改屬性檔案的內容)。

 

 

圖八、Git設定

 

結論

TFVC是屬於集中式,且程式設計人員無需額外處理的自動式備份作業,而Git 則是完全倒過來的分散式且程式設計人員擁有完全主權的版本控制的軟體協定,要如何決定採用TFVC或Git來做為專案的版本控管機制?何時應該採用TFVC?何時採用 Git呢? 一種簡單的判斷方式,是當遇到專案開發在新進的工程師較多,且開發時間較趕的情形下,我會採用可以即時不斷更新無須我們參與的TFVC做版本控管,它既省時又省力。相對的,當團隊成員較為成熟且常常許要獨立作業時(無法連線到伺服器進行開發工作的時候),此時採用Git可以增加開發者的便利性,也較能發揮它強大的協作功能。從以上觀點,要挑TFVC或Git來做版本控管,明顯的應該要根據團隊的工作屬性及工作需求對版控方式的要求來做決定。以下分別列出這二種方式它們的優點和特性,或許可以幫助你更容易作出決定。

 

TFVC版本控管機制

l   TFVC是一個集中式的版本控制系統

l   它是一個大小通吃的系統(可以承受非常大的程式碼,每個分支服務器可處理以百萬計的檔案數目)

l   能很好且迅速的處理大型二進位檔案

l   能夠提供非常精細的權限控制

l   因為集中式架構,因此很容易檢核並準確地識別使用者對程式碼所做的各種修改變化

 

Git 版本控管機制

l   Git是一個分散式版本控制系統

l   每個開發者都有一個完整的副本存在他的本地端機器上

l   在Git的工作環境下開發人員不受是否連線的限制,無需連接到伺服器才能工作

l   提供了一個簡單的分支模型,使得開發人員能夠快速創建本地端和部門內部獨立的運作版本,進而實現靈活的工作流程

l   具有高效能合併很多版本程式碼的能力

l   可以按自己的習慣工作,不受團隊開發所限制

 

不論是使用TFVC 或是 Git 版控,Visual Studio 及 Team Foundation Server都可完整支援你的專案。

 

附註:

  1. Git為用於Linux核心開發的版本控制工具,為Linus Torvalds所創。

 

 

 

延伸閱讀

 

[線上功能展示影片]

 


Comments (0)

Skip to main content