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

我們已經從SVN 切換到Git很多年了,現在幾乎所有的項目都在使用Github管理, 本篇文章講一下為什麼使用Git, 以及如何在團隊中正確使用。

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的流程圖

Git 在團隊中的最佳實踐——如何正確使用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

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

Feature 分支

分支名 feature/*

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

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

Release分支

分支名 release/*

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

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

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

維護分支 Hotfix

分支名 hotfix/*

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

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

Git Flow代碼示例

a. 創建develop分支

git branch develop
git push -u origin develop

b. 開始新Feature開發

git checkout -b some-feature develop
# Optionally, push branch to origin:
git push -u origin some-feature
# 做一些改動
git status
git add some-file
git commit

c. 完成Feature

git pull origin develop
git checkout develop
git merge --no-ff some-feature
git push origin develop
git branch -d some-feature
# If you pushed branch to origin:
git push origin --delete some-feature

d. 開始Relase

git checkout -b release-0.1.0 develop
# Optional: Bump version number, commit
# Prepare release, commit

e. 完成Release

git checkout master
git merge --no-ff release-0.1.0
git push
git checkout develop
git merge --no-ff release-0.1.0
git push
git branch -d release-0.1.0
# If you pushed branch to origin:
git push origin --delete release-0.1.0
git tag -a v0.1.0 master
git push --tags

f. 開始Hotfix

git checkout -b hotfix-0.1.1 master 

g. 完成Hotfix

git checkout master
git merge --no-ff hotfix-0.1.1
git push
git checkout develop
git merge --no-ff hotfix-0.1.1
git push
git branch -d hotfix-0.1.1
git tag -a v0.1.1 master
git push --tags

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
Git 在團隊中的最佳實踐——如何正確使用Git Flow

Git Flow GUI

上面講了這麼多,我知道還有人記不住,那麼又有人做出了GUI 工具,你只需要點擊下一步就行,工具幫你幹這些事!!!

SourceTree

當你用Git-flow初始化後,基本上你只需要點擊git flow菜單選擇start feature, release或者hotfix, 做完後再次選擇git flow菜單,點擊Done Action. 我勒個去,我實在想不到還有比這更簡單的了。

目前SourceTree支持Mac, Windows, Linux.

這麼好的工具請問多少錢呢? 免費!!!!

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

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

Git flow for visual studio

廣大VS的福音

GitFlow for Visual Studio

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

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

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

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


分享到:


相關文章: