[.net 物件導向程式設計進階] (26) 團隊開發利器(五)分散式版本控制系統Git——圖形化Git客戶端工具TortoiseGit
讀前必備:
接上篇:
分散式版本控制系統Git——使用GitStack+TortoiseGit 圖形介面搭建Git環境
http://www.cnblogs.com/yubinfeng/p/5182271.html
本篇導讀:
上篇介紹了一款Windows環境下的Git伺服器工具GitStack ,搭建了最簡單的Windows下的Git伺服器,需要再次提醒的是GitStack是打包了相對較穩定的Git原生版本的,喜歡使用命令列的同學,並不影響你。GitStack僅僅是提供了一套介面化操作和一個Http服務。本篇將深入介紹如何使用強大客戶端Git工具TortoiseGit進行分支切換、合併等操作。
1. 建立分支
分支在Git中可以說非常的方便實用,首先我們在什麼情況下需要建立分支呢?
在這點上Git和SVN理念上就有差異。SVN的分支一般作為管理員事先分配好分支的用途,開發人員不能隨意建立。而Git你想建就建吧,你自己知道分支是什麼就行。
Git中每個開發者最好都有一個自己的分支。然後可以再建立分支作為階段備份,作為試驗品,幹什麼都行。最後,你把你的試驗成果合併到自己的分支上。再然後如果自己的分支相對穩定,再提交到主幹上。
當然master是否採納你的分支全部或部分,這是master的工作。這樣的自由開發方式,是不是心動了呢,繼續看下去吧!
話不多說,我們直入主題,下面看下如何建立一個分支。
在專案 主資料夾右擊或開啟主專案檔案件,在空白處右擊,選擇TortoiseGit,選擇創“建立分支”
輸入一個分支名稱,"Yu_V1"表示我個人的第一個版本,下面切換到新分支如果選中,建立完成後,工作環境將切換到新分支了,如果沒選,也可以很方便的切換
完成分支建立以後,我們更新增一個檔案“我的第四個檔案.txt”
新建檔案後,我們在空白區域右擊,發現提交預設變成了 提交到 Yu_V1
進入提交,輸入備註,選中新建的檔案四,在這個視窗可以看到當前所要提交的分支名稱
2. 切換分支
這時,如果我們要回到主幹怎麼辦呢,Git的分支切換非常方便
專案目錄空白處右擊,TortoiseGit=> 切換/檢出
在切換視窗,我們可以很方便的切換到任一分支,假如我們切換到master
我們會發現,分支Yu_V1中第四個檔案沒有了,右擊空白,會發現切換到了master.
第四個檔案並不會丟失,當我們再次切換回分支Yu_V1的時候,第四個檔案又會回來了
這就是Git強大的地方,他在伺服器上儲存了一個檔案庫(以後設資料方式儲存),再儲存了一個版本及分支更改等的變更資訊庫,每次我們切換的時候向服務端傳送了一個請求,服務端則根據我們的請求變更我們的專案中的檔案。
整個過程就是快速的傳輸,伺服器上並不會一一儲存各個分支的檔案副本,這也是Git服務端版本庫不會暴增的主要原因。
(我會在介紹過程中,慢慢把Git的工作原理切入進來)
3. 檢視日誌
專案目錄空白處右擊,TortoiseGit=> 顯示日誌
如上圖,在開啟的顯示日誌視窗中,我們可以看到如果建立了分支,日誌資訊中會在變更資訊前顯示一個分支名稱,以方便我們瞭解是哪一個分支的變更
我們再次建一個檔案,建立一個新分支Yu_V2,將新建的檔案提交到該分支,再次檢視日誌
可以看到紅色表示當前所在分支,綠色表示其他分支變更資訊
4. 檢視版本分支圖
專案目錄空白處右擊,TortoiseGit=> 檢視版本分支圖
在開啟的分支圖視窗中,可以看到版本分支的建立歷史流程
5. 合併分支
專案目錄空白處右擊,TortoiseGit=> 合併
在彈出的合併視窗中,我們先選擇一個分支,合併至當前分支(這裡一定要注意,合併關係,如果要最終合併到那個分支,先切換到該分支,再選一個合併目標)
提示合併完成,是不是非常簡單。
6. 刪除分支和分支更名
專案目錄空白處右擊,TortoiseGit=> 切換/檢出
在切換介面中,分支選擇後面的選擇按鈕開啟,如上圖右側視窗,可以更新和刪除某個分支,注意,不能刪除當前分支,如果要刪除當前分支,請換到到其他分支進行操作
7. 推送
專案目錄空白處右擊,TortoiseGit=> 推送
在推送視窗中,如果選擇 推送所有分支,則本地庫中所有分支都被推送到伺服器,預設為推送當前分支。我們可以選擇推送到其他分支,而提交只能提交到遠端的對應分支或新建分支。
我們可以隨時在伺服器端GitStack中檢視我們的專案提交情況
開啟GitStack,找到我們建立的版本庫"MyGitObject",點選右邊的“瀏覽”按鈕,如下圖
在服務端,我們可以很方便的檢視推送到伺服器的檔案及分支資訊。
8. 更新版本庫
前面我們已經熟悉了從遠端伺服器克隆一個版本庫到本地及從本地推送給Git,在專案推進過程中,我們如何及時獲取其它分支的更新內容呢,接下來將介紹這點。
關於更新本地庫,這裡有兩個操作,如果你是中文版本的TortoiseGit很容易搞錯,這就是語言差異。
中文版本 分別為 拉取和獲取 對應英文版為 Pull(拉取)和Fetch(獲取)
在這裡一起介紹這兩個指令,他們有什麼區別呢?
拉取(Pull)會從遠端取得最新版本然後合併(Merge)到本地庫
獲取(Fetch)則會從遠端取得最新版本,並不會合併(Merge)到本地庫
可以說 拉取(Pull)=獲取(Fetch)+合併(Merge)
從安全形度來說,Fetch更安全,因為我們可以先Fetch新版本,然後進行差異比較後,再選擇性的 Merge。這也是推薦做法,即先Fetch到一個本地副本分支,然後將該副本分支和本地版本比較,合併後,再提交到遠端主機。
獲取和拉取的操作很簡單
專案目錄空白處右擊,TortoiseGit=> 拉取(Pull)
專案目錄空白處右擊,TortoiseGit=> 獲取(Fetch)
9. 差異比較
9.1 比較分支版本差異
我們該如何檢視分支1和分支2的差異呢?TortoiseGit為我們提供了很方便的功能
專案目錄空白處右擊,TortoiseGit=> 檢視日誌
9.2 比較同一分支當前版本和上一版本差異
專案目錄空白處右擊,TortoiseGit=> 比較與上一版本差異
9.3 比較兩個檔案差異
選中專案中兩個檔案 右擊,TortoiseGit=> 比較差異
開啟檔案差異比較視窗,如下
也可以在某個檔案上右擊,選擇”與上一版本差異“來檢視某個檔案的更改內容
10. 還原
如果某次操作我們後悔了,可以使用還原,將還原到上次提交前的狀態。
專案目錄空白處右擊,TortoiseGit=> 還原
注意:還原只能還原到最近一次提交時的狀態, 之前提交的的版本怎麼還原呢,也是有辦法的,如下:
專案目錄空白處右擊,TortoiseGit=> 檢視日誌
選中一個歷史版本,右擊,點”重置到這個版本“將把版本回退到之前的版本。
11. Git中解決衝突
使用Git這種非鎖定式的版本控制系統以後,很多初學者都有解決衝突恐懼症,分散式的開發給我們帶來便利的同時,產生衝突也是正常的。所謂防範勝於救災,我們可以避免,如何避免呢?
(1)首先團隊在開發過程中需要有明確規範;
(2)開發人員需要及時獲取新版本;
(3)修改後,一定要及時遞交;
即使做到以上三點,仍然會有衝突的存在,解決衝突並不可怕,通過上面的介紹,我們可以看到GIT給我們提供了許多輔助功能,比如檔案差異比較,版本差異比較等。我們要充分利用這些便利解決問題。
一般衝突主要有三種:邏輯衝突、樹衝突、內容衝突
這三種衝突如何應對呢?
(1)邏輯衝突
產生原因:比如A方法作用是返回從0-5的隨機數1個,但是同事在沒有更改方法名的情況下,改成了方法返回6-9的隨機數1個。如果拉回同事提交的版本庫,應用該方法後,就會出現程式邏輯錯誤。
解決辦法:首先我們在使用獲取一個副本支的方式更好,避免了這一問題,如果衝突,我們可以獲取版本後,使用恢復功能,或修改衝突再提交。溝通很重要,一般這種BUG都是事先沒有溝通好。
(2)樹衝突
產生原因:兩個人同時修改一個檔名
解決辦法:其中一個人獲取新版本,然後刪除自己改過名的檔案,雙方協商好用什麼名字,再由其中一人更改,另一人獲取新版本即可。
(3)內容衝突
產生原因:兩個人同時改了同一檔案的同一位置內容
解決辦法:提交檔案產生這種衝突時,我們利用檔案差異比較,檢視兩個檔案內容衝突的位置手動更改,然後推送到伺服器。
12. 分支管理策略
Git在分支建立和合並上為我們帶來前所未有的便利,同時版本四處開花,分支遍地,很容易讓初次使用者找不到主幹發展方向。這就需要我們學習一下工作流,Git的工作流網上有很多大神介紹,本篇文章不能一一列舉了。但是Vincent Driessen的分支管理策略得到了眾多支持者。我們分享一下他的成果。
他的策略可以使版本庫演進保持簡潔、主幹清晰、分支各司其職。
(1) Master分支(主分支)
首先,程式碼庫應該有一個、且僅有一個主分支。所有提供給使用者使用的正式版本,都在這個主分支上釋出。Git主分支的名字,預設叫做Master。它是自動建立的,版本庫初始化以後,預設就是在主分支在進行開發。我們可以給主分支上的每個版本庫打上tag,為了更好的管理。
(2)開發分支Develop
主分支只用來分佈重大版本,日常開發應該在另一條分支上完成。我們把開發用的分支,叫做Develop。
如果想正式對外發布,就在Master分支上,對Develop分支進行”合併”(merge)。
(3)臨時性分支
前面講到版本庫的兩條主要分支:Master和Develop。前者用於正式釋出,
後者用於日常開
發。其實,常設分支只需要這兩條就夠了,不需要其他了。但是,除了常設分支以外,還有一些臨時性分支,用於應對一些特定目的的版本開發。臨時性分支主要有三種: * 功能(feature)分支
* 預釋出(release)分支
* 修補bug(fixbug)分支
這三種分支都屬於臨時性需要,使用完以後,應該刪除,使得程式碼庫的常設分支始終只有Master和Develop。
功能分支
第一種是功能分支,它是為了開發某種特定功能,從Develop分支上面分出來的。開發完成後,要再併入Develop。
預釋出分支
第二種是預釋出分支,它是指釋出正式版本之前(即合併到Master分支之前),我們可能需要有一個預釋出的版本進行測試。
預釋出分支是從Develop分支上面分出來的,預釋出結束以後,必須合併進Develop和Master分支。它的命名,可以採用release-*的形式。
修補Bug分支
最後一種是修補bug分支。軟體正式釋出以後,難免會出現bug。這時就需要建立一個分支,進行bug修補。修補bug分支是從Master分支上面分出來的。修補結束以後,再合併進Master和Develop分支。它的命名,可以採用fixbug-*的形式。
合併完成以後的修補Bug分支要刪除的。
對於分支管理策略,我推薦一篇文章,可以參考一下:http://www.cnblogs.com/cnblogsfans/p/5075073.html
13. 本篇要點
本篇主要介紹了Git的分支、合併、分支切換、差異比較、衝突解決等,使用TortoiseGit介面化的客戶端工具,讓我們在使用過程中更加簡單了,先理解了Git的工作流程和使用方法,再慢慢了解一下命令列,也是不錯的。其實介面化的工具每一步指令的本質還是命令列。在寫這篇文章的同時,我也參考了很多部落格,在此表示感謝。TortoiseGit還有很多功能沒有一一介紹,相信有了本篇的基礎,上手不是難事了。下一篇我會繼續介紹如何在Visual Studio 2015/2013中使用Git進行版本控制,敬請關注。
==============================================================================================
<如果對你有幫助,記得點一下推薦哦,如有有不明白或錯誤之處,請多交流>
<對本系列文章閱讀有困難的朋友,請先看《.net 物件導向程式設計基礎》>
<轉載宣告:技術需要共享精神,歡迎轉載本部落格中的文章,但請註明版權及URL>
==============================================================================================