閱讀62 返回首頁    go 阿裏雲 go 技術社區[雲棲]


rdc最佳實踐之開發模式——git flow

引子

今天新建項目的時候,發現rdc除原有的分支模式以外還增加了master分支開發模式git flow模式,這是一件非常令人欣喜的事情——畢竟git flow是一個流傳已久的,大家都普遍接受的開發模式。
於是我就把應用刪掉了,改用git flow模式,目前體驗很完美。
鑒於很多人可能還不太了解git flow,本文就對此分享一些微小的經驗。

前言

你會用git嗎?

我相信在座的大多數人都會自信的回答:“會”。
而實際上,大家可能從來沒有考慮過自己的用法是否真的科學,真的健壯,尤其是項目越來越大,人數越來越多,周期越來越長的時候。

其中,典型的有以下幾個問題:

  1. 當我開發某個功能到一半的時候,PM突然給我安排了一個新的緊急任務,我該怎麼開始這個任務,而不影響現在的?
  2. 當我代碼寫好了的時候,如何發布?
  3. 當我發布後,代碼出問題了,如何快速修複?
  4. 以上的情況,還要求修複後,還要包含之後開發的所有代碼?

大部分開發人員使用git的時候,基本隻使用兩個甚至一個分支,所以下麵的這些理念,顯然是打開了一扇新世界的大門了。

方案

顯然,不光代碼有代碼規範,代碼的管理和協同同樣需要一個清晰的流程和規範,由此,行業內的通用解決方案是Git Flow

git-flow

怎麼樣,眼花繚亂吧,不過我可以給你個建議:把頭左轉90度,別著急罵....這是office picture,並非我畫的。

在上麵這幅圖上,最上麵的一行,代表分支,它們分別是

|名稱|解釋
|-|-
|master|這個分支最近發布到生產環境的代碼,最近發布的Release, 這個分支隻能從其他分支合並,不能在這個分支直接修改
|Develop|這個分支是我們是我們的主開發分支,包含所有要發布到下一個Release的代碼,這個主要合並與其他分支,比如Feature分支
|Feature|這個分支主要是用來開發一個新的功能,一旦開發完成,我們合並回Develop分支進入下一個Release
|Release|當你需要一個發布一個新Release的時候,我們基於Develop分支創建一個Release分支,完成Release後,我們合並到Master和Develop分支
|Hotfix|當我們在Production發現新的Bug時候,我們需要創建一個Hotfix, 完成Hotfix後,我們合並回Master和Develop分支,所以Hotfix的改動會進入下一個Release.

實現細則

master分支

在master分枝上工作,我們需要遵循一個基本原則,所有在master分支上的commit應該tag.

git-flow

feature分支

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

git-flow

開始一個新的功能的開發

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    

開發完成

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    

release分支

分支名 release/*
release分支基於develop分支創建,打完release分支後,我們可以在這個release分支上測試,修改bug等。同時,其它開發人員可以基於開發新的feature,一旦打了release分支之後不要從develop分支上合並新的改動到Release分支
發布release分支時,合並releasemasterdevelop, 同時在master分支上打個tag記住release版本號,然後可以刪除release分支了(當然,你可以選擇不刪除)。

git-flow

開始release

git checkout -b release-0.1.0 develop

# Optional: Bump version number, commit
# Prepare release, commit

完成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

hotfix

分支名 hotfix/*
hotfix分支基於master分支創建,開發完後需要合並回masterdevelop分支,同時在master上打一個tag
git-flow

開始hotfix

git checkout -b hotfix-0.1.1 master    

完成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

工具

如果你能堅持看到這裏,我真的為你感到欣喜,這說明你是用心學習的,並且是不畏艱險的,畢竟上麵那麼長的一大串的代碼,可能已經使你感到畏懼。
而顯然的是,作為通用的一個解決方案,不可能這麼繁瑣,那麼,唯一的可能是——有!工!具!

平台 命令
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
IDEA Git Flow Integration

其中還有一大部分是gui的,比較簡單,本文就不再贅述了。下麵著重介紹下命令行下的使用

  • 初始化: 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-flow

最後更新:2017-07-21 11:03:11

  上一篇:go  SRID (空間引用識別號, 坐標係)
  下一篇:go  《仿人機器人原理與實戰》一3.3 熱平衡模擬器