Home Contact Gallery RSS Git 在團(tuán)隊(duì)中的最佳實(shí)踐--如何正確使用Git Flow
我們已經(jīng)從SVN 切換到Git很多年了,現(xiàn)在幾乎所有的項(xiàng)目都在使用Github管理, 本篇文章講一下為什么使用Git, 以及如何在團(tuán)隊(duì)中正確使用。
Git的優(yōu)點(diǎn)
Git的優(yōu)點(diǎn)很多,但是這里只列出我認(rèn)為非常突出的幾點(diǎn)。
- 由于是分布式,所有本地庫包含了遠(yuǎn)程庫的所有內(nèi)容。
- 優(yōu)秀的分支模型,打分支以及合并分支,機(jī)器方便。
- 快速,在這個(gè)時(shí)間就是金錢的時(shí)代,Git由于代碼都在本地,打分支和合并分支機(jī)器快速,使用個(gè)SVN的能深刻體會(huì)到這種優(yōu)勢(shì)。
感興趣的,可以去看一下Git本身的設(shè)計(jì),內(nèi)在的架構(gòu)體現(xiàn)了很多的優(yōu)勢(shì),不愧是出資天才程序員Linus (Linux之父) 之手
版本管理的挑戰(zhàn)
雖然有這么優(yōu)秀的版本管理工具,但是我們面對(duì)版本管理的時(shí)候,依然有非常大得挑戰(zhàn),我們都知道大家工作在同一個(gè)倉庫上,那么彼此的代碼協(xié)作必然帶來很多問題和挑戰(zhàn),如下:
- 如何開始一個(gè)Feature的開發(fā),而不影響別的Feature?
- 由于很容易創(chuàng)建新分支,分支多了如何管理,時(shí)間久了,如何知道每個(gè)分支是干什么的?
- 哪些分支已經(jīng)合并回了主干?
- 如何進(jìn)行Release的管理?開始一個(gè)Release的時(shí)候如何凍結(jié)Feature, 如何在Prepare Release的時(shí)候,開發(fā)人員可以繼續(xù)開發(fā)新的功能?
- 線上代碼出Bug了,如何快速修復(fù)?而且修復(fù)的代碼要包含到開發(fā)人員的分支以及下一個(gè)Release?
大部分開發(fā)人員現(xiàn)在使用Git就只是用三個(gè)甚至兩個(gè)分支,一個(gè)是Master, 一個(gè)是Develop, 還有一個(gè)是基于Develop打得各種分支。這個(gè)在小項(xiàng)目規(guī)模的時(shí)候還勉強(qiáng)可以支撐,因?yàn)楹芏嗳俗鲰?xiàng)目就只有一個(gè)Release, 但是人員一多,而且項(xiàng)目周期一長(zhǎng)就會(huì)出現(xiàn)各種問題。
Git Flow
就像代碼需要代碼規(guī)范一樣,代碼管理同樣需要一個(gè)清晰的流程和規(guī)范
Vincent Driessen 同學(xué)為了解決這個(gè)問題提出了 A Successful Git Branching Model
下面是Git Flow的流程圖
上面的圖你理解不了? 沒關(guān)系,這不是你的錯(cuò),我覺得這張圖本身有點(diǎn)問題,這張圖應(yīng)該左轉(zhuǎn)90度,大家應(yīng)該就很用以理解了。
Git Flow常用的分支
- Production 分支
也就是我們經(jīng)常使用的Master分支,這個(gè)分支最近發(fā)布到生產(chǎn)環(huán)境的代碼,最近發(fā)布的Release, 這個(gè)分支只能從其他分支合并,不能在這個(gè)分支直接修改
- Develop 分支
這個(gè)分支是我們是我們的主開發(fā)分支,包含所有要發(fā)布到下一個(gè)Release的代碼,這個(gè)主要合并與其他分支,比如Feature分支
- Feature 分支
這個(gè)分支主要是用來開發(fā)一個(gè)新的功能,一旦開發(fā)完成,我們合并回Develop分支進(jìn)入下一個(gè)Release
- Release分支
當(dāng)你需要一個(gè)發(fā)布一個(gè)新Release的時(shí)候,我們基于Develop分支創(chuàng)建一個(gè)Release分支,完成Release后,我們合并到Master和Develop分支
- Hotfix分支
當(dāng)我們?cè)赑roduction發(fā)現(xiàn)新的Bug時(shí)候,我們需要?jiǎng)?chuàng)建一個(gè)Hotfix, 完成Hotfix后,我們合并回Master和Develop分支,所以Hotfix的改動(dòng)會(huì)進(jìn)入下一個(gè)Release
Git Flow如何工作
初始分支
所有在Master分支上的Commit應(yīng)該Tag
Feature 分支
分支名 feature/*
Feature分支做完后,必須合并回Develop分支, 合并完分支后一般會(huì)刪點(diǎn)這個(gè)Feature分支,但是我們也可以保留
Release分支
分支名 release/*
Release分支基于Develop分支創(chuàng)建,打完Release分之后,我們可以在這個(gè)Release分支上測(cè)試,修改Bug等。同時(shí),其它開發(fā)人員可以基于開發(fā)新的Feature (記?。阂坏┐蛄薘elease分支之后不要從Develop分支上合并新的改動(dòng)到Release分支)
發(fā)布Release分支時(shí),合并Release到Master和Develop, 同時(shí)在Master分支上打個(gè)Tag記住Release版本號(hào),然后可以刪除Release分支了。
維護(hù)分支 Hotfix
分支名 hotfix/*
hotfix分支基于Master分支創(chuàng)建,開發(fā)完后需要合并回Master和Develop分支,同時(shí)在Master上打一個(gè)tag
Git Flow代碼示例
a. 創(chuàng)建develop分支
git branch develop git push -u origin develop
b. 開始新Feature開發(fā)
git checkout -b some-feature develop # Optionally, push branch to origin: git push -u origin some-feature # 做一些改動(dòng) 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工具
實(shí)際上,當(dāng)你理解了上面的流程后,你完全不用使用工具,但是實(shí)際上我們大部分人很多命令就是記不住呀,流程就是記不住呀,腫么辦呢?
總有聰明的人創(chuàng)造好的工具給大家用, 那就是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一個(gè)Feature(也就是push到遠(yuǎn)程): git flow feature publish MYFEATURE
-
獲取Publish的Feature: git flow feature pull origin MYFEATURE
-
完成一個(gè)Feature: git flow feature finish MYFEATURE
-
開始一個(gè)Release: git flow release start RELEASE [BASE]
- Publish一個(gè)Release: git flow release publish RELEASE
-
發(fā)布Release: git flow release finish RELEASE
別忘了git push --tags -
開始一個(gè)Hotfix: git flow hotfix start VERSION [BASENAME]
-
發(fā)布一個(gè)Hotfix: git flow hotfix finish VERSION
Git Flow GUI
上面講了這么多,我知道還有人記不住,那么又有人做出了GUI 工具,你只需要點(diǎn)擊下一步就行,工具幫你干這些事?。?!
SourceTree
當(dāng)你用Git-flow初始化后,基本上你只需要點(diǎn)擊git flow菜單選擇start feature, release或者h(yuǎn)otfix, 做完后再次選擇git flow菜單,點(diǎn)擊Done Action. 我勒個(gè)去,我實(shí)在想不到還有比這更簡(jiǎn)單的了。
目前SourceTree支持Mac, Windows, Linux.
這么好的工具請(qǐng)問多少錢呢? 免費(fèi)!!!!
Git flow for visual studio
廣大VS的福音
GitFlow for Visual Studio