本篇導讀:
上篇介紹了一款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還有很多功能沒有一一介紹,相信有了本篇的基礎,上手不是難事了。