如何開始使用分散式版本管控 DVCS–GIT
@為什麼會有這篇文章
Git 的用法和說明現在在市面上和網路上已經有很多很多資料可以查,雖然有很多寫的很棒也很清楚,但對於不是 Command 派的朋友或是想要入門的可能會覺得難以入門。再加上有 V 公司詢問了一些問題,索性就一併整理相關的工具、用法以及 對照說明。希望借由 三種不同的方式可以看到無論是用 Command 、Git GUI 或是 Visual Studio 其結果都是一致的
@選擇適合自已的版本管控機制
有接觸 Team Foundation Server 的朋友知道從 2005 年推出以來都是集中式的版本控制機制 ( CVCS ) ,而且這幾年以來也都有很多人詢問 TFS 是否有計劃支援 分散式的版本控制機制 ( DVCS )。一直到 2012 年的時候才正式對外公佈 Git 是 TFS 支援 DVCS 的解決方案,在 VS Online 上支援 Git 後,總算在 TFS 2013 上有正式支援 Git 的版本管控。而這個機制並不是在 2012 年時才提出,而是在 2010 年時就有推出 Git 和 TFS 整合的外掛套件,一直到 2012 年的時候正式整併到 TFS 之中。
tip:主要是因為 Visual Studio Team 的Wish List 中 分散式版控有非常多的投票
也許有些朋友覺得分散式版本管控是未來的主流或是很潮,但就以自已的觀點來看選擇最適合自已團隊或企業流程來說才是最正確的答案。無論是系統或是管理分久必合、合久必分是不變的道理,沒有必要為了趕流行而一昧地改變,一切都是為了團隊的需求而決定要用什麼技術來解決問題。所以就以管理的角度而言絕對不是選邊站就好,分散式可以解決版控連線分支困難的問題,但也許會造成合併等權限管理的問題。
但就以管理階層來說當然會希望企業統一用一個管控機制來統一管理,想要同時有 CVCS 和 DVCS 就代表團隊必須要有兩套版本管控工具,而且又要考量到專案工作管理的整合這絕對會有很多的衝突。因此 Team Foundation Server 提了一個我覺得很酷的 Solution 就是同時提供 TFS 的版本管控 ( TFVC ) 和 Git 的版本管控,可以讓每個團隊隨著自已的需求選擇要用 CVCS 或是 DVCS 。而且無論是用 TFVC 或是 Git 都可以跟 TFS 的 Work item ( Task or Bug ) 進行連結,以達到專案管理中最基本的要求 - 追溯性 Traceability 。
對於 Git 有想要了解的話,可以參考 Git 的官方的電子書 (正體中文) 。有興趣的朋友可以參考
Brian Harry 有更詳細的說明
http://blogs.msdn.com/b/bharry/archive/2013/01/30/git-init-vs.aspx
@開始我們的第一步的準備環境
主要的工具
一、Git 的 Open Source 的標準套件 Git Command / Git GUI
二、Visual Studio 2013 內建套件
依團隊性質來分類要準備的工具
.NET Team for VS 2012 之後
以 Visual Studio 2012 為分水嶺, Visual Studio 2012 update 2 以後有整合 Git 套件可以做 Clone、Commit、Push、Rebase 等等動作
VS 2012 的 Git 套件,需要單獨下載安裝。而 2013 則是內建
http://visualstudiogallery.msdn.microsoft.com/abafc7d6-dcaa-40f4-8a5e-d6724bdb980c
不管如何,為了分支管理還是要安裝 Git for Windows
Web Platform Installer 的安裝套件支援
http://go.microsoft.com/fwlink/?LinkId=278817 (有 WPI 的話,可以直接下載幫您安裝好 )
.NET Team for VS 2012 之前
MSYSGit
Git Command line
http://www.microsoft.com/en-us/download/details.aspx?id=30474
其他平台 for Windows
Git Command line
http://www.microsoft.com/en-us/download/details.aspx?id=30474
MSYSGit
TortoiseGit 俗稱的小烏龜 for Git ( 必須要安裝 MSYSGit 才能用 )
http://code.google.com/p/tortoisegit/wiki/Download
Download TortoiseGit 1.8.9.0 - 32-bit / Download TortoiseGit 1.8.9.0 - 64-bit
其他平台 for Linux / AIX / Mac
Git Command line
http://www.microsoft.com/en-us/download/details.aspx?id=30474
Mac Git Client
http://git-scm.com/download/macLinux Git Client
Server
若不想要自已安裝或是維護 Server 的話可以考慮用 Visual Studio Online 而且 5 人以下 FREE
Visual Studio Online
http://www.visualstudio.com/zh-tw
Team Foundation Server 2013
http://msdn.microsoft.com/en-us/vstudio/ff637362.aspx
@建立第一個 Git 的版控專案
這裡會同時說明如何用 Visual Studio 和 Git GUI / Command 來說明整個操作項目,這樣子雖然說明的時候看起來很雜,但應該可以比較快了解到 GUI 、Command 和 Visual Studio 之間的關係。
在 Team 總管上時按下建立
記得要選 GIT 啊,不然選錯了就要重新來了
建立完成後可以看到 Git 對應的 變更 ( Staging / Commit ) 、未同步處理的認可 ( Push )、分支 等
Git 的功能都是以 橘紅色為主
@Git Init 建立 Local Repository
無論是用 VS 或是 Git Command line / Git GUI,我們都必須要先在本機建立 Repos 。
這裡有「預設儲存機制位置」就是指我們現在本機 Repo git 檔放的位置,對應到 Git Command 就是 Git Init
Tip:若是您只有用 Git 的話,則 Repos 要放那則是沒有太大的問題,但若是您的團隊是 VCS 和 DVCS 混合使用的話。( ex.. TFS / Git ) 那麼這裡就強烈建議您的 VCS 的 workspace 和 DVCS 的 Repos 是放在同一層,這樣子比較便於團隊統一管理。
而「預設儲存機制位置」其實就跟 TFS 的「工作區 work space 」是一模一樣的意思。
也可以用 安裝好的 Git for Windows 來建立新的 Repository
安裝完成後會有 Git GUI 和 Command line 兩種方式可以供我們操作
用 Command line 的話可以參考這個
http://git-scm.com/docs/git-init
@將程式碼 Commit 到 Git
初始化的 Repos 路徑目前是放在 C:\workspace\Franma\TestGit 之下,所以將程式碼 搬過去後用 Visual Studio 新增到版本管控並再做 「認可 Commit」
當然這個時候用 Git Gui 開啟即有的 Repository
就可以看到剛剛新增的檔案在 Unstaged Changes 清單了 ( 簡單來說就是修改過的檔案清單 )
這個畫面中也可以進行 Commit ,但記得要先做 Stage Changed 將檔案加入到 下方綠色的地方。
接下來我們回到 Visaul Studio 中進行 Commit
這裡就會出現變更的畫面,其實就是 TFS 的 ChangeSet 。而這裡的 GUI 畫面有整合 Git 的兩個動作,分別是 Git Add 和 Git Commit 。
我們通常在 Commit 之前要用指令的方式將檔案加入到 Git 的 Staging。
當然即然是 TFS 就是要可以讓 Git 跟 TFS 的 Work Item ( Task , Bug ) 直接做連結
直接輸入單號之外,也可以托拉多個工作單 or Bug 的方式
確認完成後可以看到工作單已經 Link 在一起
到目前為止的 認可 Commit 都還只是在「本機的 Repository」之中,所以在 Push 之前 Server 上是沒有任何的記錄的喔!而這裡的相關工作項目也只有在該本機才看得到。
@用 Git GUI 進行 Commit 並關聯工作單
如同剛剛說的,也可以直接修改完檔案後用 Git GUI 進行變更
確認那些檔案要簽入 ( 對應到 TFS 的話就是決定那些檔案要納入 ChangeSet )
確認無誤後我們就可以做 簽入認可 Commit 了,這個時候只要在 Commit Message 上加上 「#工作單單號」
TFS 就會幫我們將 Commit 的項目和 工作單連結在一起了,再回到 TFS 上確認可以查到剛剛修改的項目和工作單有關聯
@用 Git Command 進行 Commit 並關聯工作單
Git 的操作資料大部分都是以 Command Line 的方式來呈現,當然即然 TFS 支援 Git 而 Command Line 也是順理成章地也有支援
用 Visual Studio 的朋友基本上也已經有內建了,最直接的方式就是透過 Git 的 動作 Action 來開啟「命令提示字元」
用這個才會將 Git 的 Path 建立好,不然就要自已指定,或是用 Gui Command ( 熟 Linux cmd 的才推薦 )
這裡很偷懶地用「Git Add .」將所有的檔案加入到 Staging 之中
然後再用 「Git Commit –m “註解說明 #工作單單號”」的方式 Commit
可以看到已經將檔案放到 Local Repos 了 ( 這個時候才算是正式地 簽入到本機 )
這個時候回到 Team Explorer 來看是有完整記錄並且還有正確關聯到工作項目。
@同步到 Server 上
當要將自已的開發成果也可以讓別人看得到或是取得的話,那麼勢必就必須將程式碼同步到 Server 上。Git 和 一般的 VCS 最大的不同是簽入的位置不一樣,Git 的 簽入只有自已看得到,而 TFS 只要一簽入則所有人都會知道。那麼 Git 要分享給別人的話就必須要再多做一個 「同步 Push」的動作。
當然按照慣例我們先用 Visual Studio 的方式先做同步處理
這個時候會切換到依上次到現在所有的修改的 Commit
確認無誤後按下「推送 Push 」會一併推送到 Server 而且目前用的分支是 master
推送之後現在在 Server 上才看得到剛剛變更的內容變更和項目
而且一樣可以直接用 Chorme 、FF 、Safari 和 IE 看每一次的 Commit 的變更、關聯的工作項目以及 程式碼修改的差異清單。而且程式碼的 Review 也可以直接在這裡加上註解或是討論,只要是文字檔就可以直接看到得完全沒有限制平台或是程式語言,這一點對於開發團隊有在做 Review 的時候非常非常地方便呢。
Remotes 膚色的就是指我剛剛送到 Server 上的點,然後我又再繼續 Commit了 1.2 的功能。
雖然說同步看起來好像很簡單,但若是多人同時針對 Master 在做 push 的話,那麼您還是會跟 VCS 遇到一樣的問題,光是合併的「程序」就夠我們傷腦筋了。所以合併的 SOP 還是要好好地先規範好。
用 Command 則是
「git remote add origin http://tfs2013:8080/tfs/DefaultCollection/_git/TestGit」「git push -u origin --all」
而 Git GUI 則是
@分支管理
大家都知道開發過程中絕對不是可以讓我們安安心心地開發新功能,您還要面對上一次測試發現的 Bug 或是 線上 Production 發生了緊急問題需要修復。當然也有可能長官突然靈光一現希望我們可以先做他的事情,最慘的就是統統都寫好了準備要上線了,最後 User 才跟我們說這個功能不能上線要拿掉其中某一個功能 ( 其他的還是要上喔 ) ,有各種因素折磨影響著我們的開發進度和流程。
因此適當的分支管理就非常非常地重要,這個動作會影響我們交付時間快速與否的決定性因素。好的分支可以讓我們很容易從中抽取版本再讓我們合併,不好的分支流程就會讓我們一個一個檔案挑不完。
ps.. 無論是否為 集中式版控 CVCS 或是 分散式版控 DVCS 都是一樣要做功課
Git 分支 - 利用分支進行開發的工作流程
這對於主導權在開發人員手上時,分散式版控的機制就會減少集中式分支管理設定上的時間,在 Server 上也不需要真的開那麼多的分支出來。這一點是分散式版控上的優勢
首先我們就先開始建立第一個分支,從 Master 分支出 NewFeature 只要是開發新功能或是開發週期超過一個 Sprint / Itration 的,我都先放在這裡。
當然分支完成後,我們到 Git GUI 看整個記錄
可以看到原本的 Master 已經有多一個新的分支出來是 NewFeature 了
那麼是否可以在這個分支樹上直接選擇並建立新的分支?當然可以而且這樣子做更直覺方便,可以比較容易選擇想要的 Commit 點來決定是否要分支。
基本上目前比較建議分支直接用 Git GUI 的方式來管理是最方便的
接下來看一下目前 Master 1.2 的 code 改了那些地方
這個時候我們想要到 NewFeature 這個分支修改程式碼,若是 .NET 的開發工具的話只要在 這個地方選擇分支就會自動幫我們切換分支內容。
這個時候可以看到原本開啟的 About.aspx 的檔案內容已經切換成 NewFeature 的程式碼內容了,若是用 SVN 或是 TFVC 的分支的話就必須要在另外一個目錄再開啟專案才行。
當然依照我們開發的需求進行 Commit 後再用 Git GUI 來確認可以看到程式碼修改歷程已經不一樣了
Git 分支 - 分支的管理
http://git-scm.com/book/zh-tw/Git-%E5%88%86%E6%94%AF-%E5%88%86%E6%94%AF%E7%9A%84%E7%AE%A1%E7%90%86
@Git Clone 的做法
回頭過來我們說明若不是自行建立 Repos ,而是從 Server 上取得別人的開發成果和程式碼那麼就必須要用 Clone 的方式。
一樣我們依照 Visual Studio 的部分來說明
系統會依照最一開始設定的路徑幫我們依照 Team Project 和 Git Repository 的名稱來建立路徑
按下後就會幫我們 copy 檔案和建立 local repos
Command line 複製儲存機制
「git clone http://tfs2013:8080/tfs/DefaultCollection/_git/TestGit」
http://TFS2013:8080/tfs/DefaultCollection/_git/TeamProject名稱
Git GUI
將遠端的路徑和本機路徑輸入進去即可,可以參考第一個作法上的設定。
@總結
去除一些網路上個人的品牌喜好問題,大部分都是針對分散式版控要解決開發團隊在分支管理上以及同步的問題。但因為這樣子就宣告 集中式版本管控已經死了嗎?不,我不這麼認為若是要管理到每一個檔案的權限的話,那麼 DVCS 可能就不是最佳選擇了。再者,當功能越強大則學習的成果也就越高,所需要的 skill 也比較要求。 ( 大家都知道勇者要穿高等裝備的話,沒有足夠的等級是沒辦法穿的 ) 所以,第一個要考量的就是團隊成員的 skill 和 團隊文化。
其實現在 TFS 的版本管控也開始有學 SVN 和 Git 的優點。像是 SVN 的檔案異動感知、小烏龜就是非常好的例子,而在 TFS 2013 的版本又追加了像是 Git 的 Local Repos 的機制 – Local WorkSpace 雖然沒有辦法像 Git 那樣子可以隨意簽入、建立分支,但在所有的修改可以在「不連線」的情況下完成 ( 包含 Undo ) 。 而且也可以像 Git 那樣子有自已專屬的 Commit 空間 ( 像是 擱置 ) ,無論自已是用什麼工具請先徹底地了解才能發揮最大效益。
但不管如何,版控只是開發的其中一個環節而已。對於一些朋友來說為什麼要用 TFS 就是因為 可以讓團隊的產出和專案管理的 PLM 整合並且有關聯來追蹤進度。
若是您想要同時有 集中式 / 分散式(GIT) 的版控機制?
若是您的團隊需要用 Agile / Scrum 來管理?
若是您需要同時管理 .NET / Java / Mac 等不同的開發 Team 來用一個 Repository 統一管理?
若是您也想要做自動化建置/部署 ( CI / CD ) 的話
那麼 Team Foundation Server 或是 Visual Studio Online 會是您相當不錯的選擇!
以下有一些參考資料可以供各位參考,一併整理如下 希望各位朋友可以選擇最適合你們自已的方法
參考資料
Git 基礎 - 提交更新到儲存庫
http://blogs.msdn.com/b/msdntaiwan/archive/2013/09/10/visual-studio-team-foundation-server-git.aspx
http://huan-lin.blogspot.com/2013/07/tfs-on-cloud-with-git.html
Git Command prompt
http://msdn.microsoft.com/en-us/library/dd286572.aspx
Share your code in Git
http://www.visualstudio.com/en-us/get-started/share-your-code-in-GIT-vs
http://msdn.microsoft.com/zh-tw/library/hh850445.aspx
http://msdn.microsoft.com/zh-tw/library/hh967655.aspx
http://msdn.microsoft.com/zh-tw/library/hh850436.aspx
http://msdn.microsoft.com/zh-tw/library/jj190809.aspx
http://msdn.microsoft.com/zh-tw/library/dd286559.aspx
http://msdn.microsoft.com/zh-tw/library/dn237244.aspx
http://d.hatena.ne.jp/xyk/20130920/1379659991
http://code.google.com/p/tortoisegit/
http://code.google.com/p/tortoisegit/wiki/SetupHowTo
http://msysgit.github.io/#contribute
https://github.com/dahlbyk/posh-git
http://gitcredentialstore.codeplex.com/
http://devproconnections.com/visual-studio-2013/git-team-foundation-server-2013
http://roadtoalm.com/2014/03/27/combining-tfs-version-control-and-git-with-git-tf/
http://blog.crboy.net/2012/05/git-on-windows.html
http://shaocian.blogspot.tw/2013/01/windows-git-msysgit-tortoisegit.html
http://www.mrmu.com.tw/2011/05/06/git-tutorial-for-beginner/
http://www.mrmu.com.tw/2011/05/06/git-using-dropbox-as-server/