Git 在團隊中的最佳實踐–如何正確使用Git Flow

Git的優點

Git的優點很多,但是這裡只列出我認為非常突出的幾點。

  1. 由於是分佈式,所有本地庫包含了遠程庫的所有內容。
  2. 優秀的分支模型,打分支以及合併分支,機器方便。
  3. 快速,在這個時間就是金錢的時代,Git由於代碼都在本地,打分支和合併分支機器快速,使用個SVN的能深刻體會到這種優勢。

感興趣的,可以去看一下Git本身的設計,內在的架構體現了很多的優勢,不愧是出資天才程序員Linus (Linux之父) 之手

版本管理的挑戰

雖然有這麼優秀的版本管理工具,但是我們面對版本管理的時候,依然有非常大得挑戰,我們都知道大家工作在同一個倉庫上,那麼彼此的代碼協作必然帶來很多問題和挑戰,如下:

  1. 如何開始一個Feature的開發,而不影響別的Feature?
  2. 由於很容易創建新分支,分支多了如何管理,時間久了,如何知道每個分支是幹什麼的?
  3. 哪些分支已經合併回了主幹?
  4. 如何進行Release的管理?開始一個Release的時候如何凍結Feature, 如何在Prepare Release的時候,開發人員可以繼續開發新的功能?
  5. 線上代碼出Bug了,如何快速修復?而且修復的代碼要包含到開發人員的分支以及下一個Release?

大部分開發人員現在使用Git就只是用三個甚至兩個分支,一個是Master, 一個是Develop, 還有一個是基於Develop打得各種分支。這個在小項目規模的時候還勉強可以支撐,因為很多人做項目就只有一個Release, 但是人員一多,而且項目周期一長就會出現各種問題。

Git Flow

就像代碼需要代碼規範一樣,代碼管理同樣需要一個清晰的流程和規範

Vincent Driessen 同學為了解決這個問題提出了 A Successful Git Branching Model

下面是Git Flow的流程圖

上面的圖你理解不了?沒關係,這不是你的錯,我覺得這張圖本身有點問題,這張圖應該左轉90度,大家應該就很用以理解了。

Git Flow常用的分支

Production 分支

也就是我們經常使用的Master分支,這個分支最近發佈到生產環境的代碼,最近發佈的Release, 這個分支只能從其他分支合併,不能在這個分支直接修改

Develop 分支

這個分支是我們是我們的主開發分支,包含所有要發佈到下一個Release的代碼,這個主要合併與其他分支,比如Feature分支

Feature 分支

這個分支主要是用來開發一個新的功能,一旦開發完成,我們合併回Develop分支進入下一個Release

Release分支

當你需要一個發佈一個新Release的時候,我們基於Develop分支創建一個Release分支,完成Release後,我們合併到Master和Develop分支

Hotfix分支

當我們在Production發現新的Bug時候,我們需要創建一個Hotfix, 完成Hotfix後,我們合併回Master和Develop分支,所以Hotfix的改動會進入下一個Release

Git Flow如何工作

初始分支

所有在Master分支上的Commit應該Tag

Feature 分支

分支名 feature/*

Feature分支做完後,必須合併回Develop分支, 合併完分支後一般會刪點這個Feature分支,但是我們也可以保留

Release分支

分支名 release/*

Release分支基於Develop分支創建,打完Release分之後,我們可以在這個Release分支上測試,修改Bug等。同時,其它開發人員可以基於開發新的Feature (記住:一旦打了Release分支之後不要從Develop分支上合併新的改動到Release分支)

發佈Release分支時,合併Release到Master和Develop, 同時在Master分支上打個Tag記住Release版本號,然後可以刪除Release分支了。

維護分支 Hotfix

分支名 hotfix/*

hotfix分支基於Master分支創建,開發完後需要合併回Master和Develop分支,同時在Master上打一個tag

Git flow工具

實際上,當你理解了上面的流程後,你完全不用使用工具,但是實際上我們大部分人很多命令就是記不住呀,流程就是記不住呀,腫么辦呢?

總有聰明的人創造好的工具給大家用, 那就是Git flow script.

安裝

OS X

brew install git-flow

Linux

apt-get install git-flow

Windows

wget -q -O – –no-check-certificate https://github.com/nvie/gitflow/raw/develop/contrib/gitflow-installer.sh | bash

使用

初始化: git flow init

開始新Feature: git flow feature start MYFEATURE

Publish一個Feature(也就是push到遠程): git flow feature publish MYFEATURE

獲取Publish的Feature: git flow feature pull origin MYFEATURE

完成一個Feature: git flow feature finish MYFEATURE

開始一個Release: git flow release start RELEASE [BASE]

Publish一個Release: git flow release publish RELEASE

發佈Release: git flow release finish RELEASE 別忘了git push –tags

開始一個Hotfix: git flow hotfix start VERSION [BASENAME]

發佈一個Hotfix: git flow hotfix finish VERSION