團隊協做開發中,大部分都會用到版本控制軟件,好比Git、Svn等。本文將經過一個實例,詳細講解在真實的工做環境中,一個團隊應該如何利用Git+Github進行協做開發,即詳解Git工做流程。並就其中比較棘手的問題做出解答,好比如何解決衝突比較合適,如何創建各類類型的分支等。git
本文不會講解Git簡介、Git原理、Git基本用法等,有不瞭解的能夠參考「 Git 參考手冊 」。咱們舉例演示的是GitFlow工做流的功能,這裏先放一張經典的GitFlow工做流圖示:web
其中涉及到的主要分支類型有:測試
develop分支,即開發分支,從master分支上檢出。團隊成員通常不會直接更改該分支,而是分別從該分支檢出本身的feature分支,開發完成後將feature分支上的改動merge回develop分支。同時release分支由此分支檢出。spa
release分支,即發佈分支,從develop分支上檢出。該分支用做發版前的測試,可進行簡單的bug修復。若是bug修復比較複雜,可merge回develop分支後由其餘分支進行bug修復。此分支測試完成後,須要同時merge到master和develop分支上。3d
feature分支,即功能分支,從develop分支上檢出。團隊成員中每一個人都維護一個本身的feature分支,並進行開發工做,開發完成後將此分支merge回develop分支。此分支通常用來開發新功能或進行項目維護等。版本控制
fix分支,即補丁分支,由develop分支檢出,用做bug修復,bug修復完成需merge回develop分支,並將其刪除。因此該分支屬於臨時性分支。orm
hotfix分支,即熱補丁分支。和fix分支的區別在於,該分支由master分支檢出,進行線上版本的bug修復,修復完成後merge回master分支,並merge到develop分支上,merge完成後也能夠將其刪除,也屬於臨時性分支。blog
下邊咱們一步步拆分講解各類類型分支的用法。ci
(1)假設團隊就一我的「xianhu」,作一個叫TestGit的項目,並將其代碼託管在Github上。首先須要在Github上新建一個項目TestGit:開發
按照Github上的提示,在本地新建一個項目,並關聯到Github上的orgin/master。此時開發一個很小的demo功能,並提交到線上,並在master分支上進行打tag操做,並命名爲v0.1。此時的GitFlow工做流爲:
(2)若是此時master分支的代碼正在線上運行,並且又須要開發新功能,則不能在master分支上直接修改。一個比較好的策略是在master分支上新建並檢出develop分支,新功能的開發在develop分支上進行,此時記得將develop分支提交到遠端:
git branch develop master # 從master分支上新建develop分支 git checkout develop # 檢出develop分支 # 此處可進行功能開發,並add和commit到develop分支 git push origin develop # 推送develop分支到遠端的origin/develop
即Github上保持兩個分支:master和develop。目的是爲之後團隊協做更新develop分支作準備。此時Github上爲:
此時會出現兩種狀況:
git checkout master # 切換回master分支 git checkout -b hotfix master # 新建hotfix分支,並切換到該分支 # 作一些bug修復工做 git checkout master # 切換回master分支 git merge --no-ff hotfix # 合併hotfix分支,此時bug已被修復(無衝突) git tag v0.2 # 新建tag v0.2 git push origin master # 推送master分支代碼到遠端 git push origin --tags # 推送tag到遠端
git checkout develop # 切換回develop分支 git checkout -b release01 develop # 新建release分支,並切換到該分支 # 作一些測試、bug修復等工做 git checkout develop # 切換回develop分支 git merge --no-ff release01 # 合併release01分支到develop分支(無衝突) git push origin develop # 推送develop分支到遠端 git checkout master # 切換回master分支 git merge --no-ff release01 # 合併release01分支到master分支(無衝突) git tag v0.3 # 新建tag v0.3 git push origin master # 推送master分支代碼到遠端 git push origin --tags # 推送tag到遠端
此時GitFlow工做流爲:
(3)這裏能夠繼續develop分支,並不斷push到遠端。此時若是團隊成員增長,多人須要開發不一樣的功能,這裏就會用到feature分支。團隊中的每一個人都從Github克隆一個項目,而後新建本身的feature分支。
git clone xxxx.git git checkout develop git checkout -b feature-xx develop # 從develop分支新建並檢出feature分支
此時「xianhu」作以下操做,並首先第一個提交到了Github遠端:
git checkout -b feature-hu develop # 從develop分支新建並檢出feature分支 # 這裏能夠進行一些功能開發,並不斷的add和commit git checkout develop # 切換回develop分支 git pull origin develop # 更新遠端代碼,看develop分支是否有更新(無更新) git checkout feature-hu # 切換回feature分支 git rebase develop # 合併develop分支到feature分支,並解決衝突(無衝突) git checkout develop # 切換回develop分支 git merge --no-ff feature-hu # 合併feature分支到develop分支 git push origin develop # 推送develop分支到遠端
此時的GitFlow工做流爲:
對於團隊其餘成員,好比zz,操做以下,並打算在「xianhu」提交後進行push操做:
git checkout -b feature-zz develop # 從develop分支新建並檢出feature分支 # 這裏能夠進行一些功能開發,並不斷的add和commit git checkout develop # 切換回develop分支 git pull origin develop # 更新遠端代碼,看develop分支是否有更新(有更新) git checkout feature-hu # 切換回feature分支 git rebase develop # 合併develop分支到feature分支,並解決衝突(有衝突) # 這裏須要進行衝突解決 git add . # 解決完衝突以後執行add操做 git rebase --continue # 繼續剛纔的rebase操做 git checkout develop # 切換回develop分支 git merge --no-ff feature-zz # 合併feature分支到develop分支(無衝突) git push origin develop # 推送develop分支到遠端
若是團隊成員在合併feature分支到develop分支後還須要繼續開發,則檢出本身的feature分支繼續操做,並重覆上述過程便可。這裏須要注意--no-ff參數,其目的是讓commit的流程更加清晰,具體爲何可自行百度。
xianhu這邊進行pull操做,便可看到zz進行的操做。此時的GitFlow工做流爲:
(4)若是此時須要進行測試、發版操做,則須要再次新建並檢出release分支,重複(2)的步驟。完成以後的GitFlow工做流爲:
這裏就完成了從版本v0.1到v1.0的迭代開發,並詳細解釋瞭如何利用Git+Github進行團隊協做開發。文章中沒有用到fix分支,這種分支的用法和feature分支相似,你們能夠本身體會。
最後詳細解釋一下上張圖:
這裏只用到和解釋了GitFlow工做流,團隊協做開發也能夠用Pull Requests或者其餘方式,找一個合適本身團隊和具體業務的協做方式便可。另外,Git博大精深,想要徹底精通也絕非易事,只能是一邊學一邊用。
來自:https://zhuanlan.zhihu.com/p/23478654