1. 程式人生 > >圖文詳解如何利用GIT+GitHub進行團隊寫作開發

圖文詳解如何利用GIT+GitHub進行團隊寫作開發

bsp 解決沖突 atlas evel src 出現 info flow 多人

技術分享圖片

圖文詳解如何利用Git與GitHub進行團隊協作開發

團隊協作開發中,大部分都會用到版本控制軟件,比如Git、Svn等。本文將通過一個實例,詳細講解在真實的工作環境中,一個團隊應該如何利用Git+Github進行協作開發,即詳解Git工作流程。並就其中比較棘手的問題作出解答,比如如何解決沖突比較合適,如何建立各種類型的分支等。關於Git工作流,建議參考文章:Git Workflows and Tutorials。

本文不會講解Git簡介、Git原理、Git基本用法等,有不了解的可以參考“Git 參考手冊”。我們舉例演示的是GitFlow工作流的功能,這裏先放一張經典的GitFlow工作流圖示:

技術分享圖片

其中涉及分支主要類型:

- master 分支,即為主分支。任何項目都必須有這個分支。對項目進行tag或者發布版本等操作,都必須在這個分支上面進行。

- develop 分支,即為開發分支,從master分支上檢出。團隊成員一般不會直接更改該分支,而是分別從該分支檢出自己的feature分支,開發完成後將feature分支上的改動merge回develop分支。同時release分支由此分支檢出。

- release 分支,即為發布分支,從develop 分支上檢出,該分支用作發版前的測試,可進行簡單的bug修改,如果bug修復比較復雜,可merge回develop分支後由其他分支進行bug修復。此分支測試完成後,需要同時merge到master和develop分支上。

- feature 分支,即為功能分支,從develop分支上檢出,團隊成員中每個人都維護一個自己的feature分支,並進行開發工作,開發完成後將此分支merge回develop分支,此分支一般用來開發新功能或進行項目維護等。

- fix 分支,即為補丁分支,由develop分支檢出,用作bug修復,bug修復完成需merge回develop分支,並將其刪除,所以該分支屬於臨時分支。

- hotfix分支,即為熱丁分支。和fix分支的區別在於該分支有master分支檢出,進行線上版本的bug修復,修復完成後merge回master分支,並merge到develop分支上,merge完成後也可以將其刪除,也屬於臨時分支。

下邊我們一步步拆分講解各種類型分支的用法。

(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上為:

 技術分享圖片

此時會出現兩種情況:

  線上版本的代碼(master分支)出現了緊急bug,需要修復。這裏用到了hotfix分支。

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到遠端

  develop分支上的功能開發完成了,需要進行測試和提交。這裏用到了release分支

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-zz    # 切換回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分支類似,大家可以自己體會。

最後詳細解釋一下上張圖:

  • xianhu在master分支上完成v0.1版本開發,“done demo in master”
  • 發現master分支上有bug,需緊急修復。新建並檢出hotfix分支進行bug修復,並merge回master分支,發布版本v0.2。
  • xianhu新建並檢出develop分支進行叠代開發,然後在develop分支上檢出release01分支,進行發版前測試和bug修復。“fix bugs in release01”,完成後將release01分支merge回develop和master分支,並在master分支上發布版本v0.3。
  • xianhu繼續開發develop分支。此時團隊成員增加,團隊中的每個人都在develop的基礎上新建並檢出自己的feature分支,開發完成後merge回develop分支。這裏利用到了rebase操作和沖突解決等,需要特別註意一點步驟。
  • xianhu在develop分支上檢出release02分支,再次進行發版前測試和bug修復,“fix bugs in release02”,完成後將release02分支merge回develop和master分支,並在master分支上發布版本v1.0。

這裏只用到和解釋了GitFlow工作流,團隊協作開發也可以用Pull Requests或者其他方式,找一個合適自己團隊和具體業務的協作方式即可。另外,Git博大精深,想要完全精通也絕非易事,只能是一邊學一邊用。

------------------------------------------------------------------------------------------

更新1:git merge和git rebase的區別

(1)使用git merge合並分支,解決完沖突,執行add和commit操作,此時會產生一個額外的commit。如下圖:

技術分享圖片

(2)使用git rebase合並分支,解決完沖突,執行add和git rebase --continue,不會產生額外的commit。這樣master分支上不會有無意義的commit。如下圖:

技術分享圖片

所以可以這麽說:merge是顯性合並,rebase是隱性合並。

同理,當你執行git pull時,是同時執行了git fetch 和 git merge兩個操作。如果你不想進行merge操作,即不想留下合並的記錄,可以使用 git pull --rebase操作。

更新2:如何在Github上創建、刪除分支

1、在本地創建新分支:git branch newbranch
2、在本地切換到新分支:git checkout newbranch
3、將新分支推送到github:git push origin newbranch
4、在本地刪除一個分支:git branch -d newbranch
5、在Github遠端刪除一個分支:git push origin :newbranch
==========================================================

轉載:笑虎(Python愛好者,關註爬蟲、數據分析、數據挖掘、數據可視化等)

用於自己學習與積累。感謝大佬

圖文詳解如何利用GIT+GitHub進行團隊寫作開發