Git Flow工作流總結(jié)

一氧吐、簡介

Git Flow定義了一個項目發(fā)布的分支模型,為管理具有預(yù)定發(fā)布周期的大型項目提供了一個健壯的框架末盔。

二筑舅、流程解析

  1. master分支存放所有正式發(fā)布的版本,可以作為項目歷史版本記錄分支陨舱,不直接提交代碼翠拣。僅用于保持一個對應(yīng)線上運行代碼的 code base。

  2. develop分支為主開發(fā)分支隅忿,一般不直接提交代碼

  3. feature分支為新功能分支心剥,feature分支都是基于develop創(chuàng)建的,開發(fā)完成后會合并到develop分支上背桐。同時存在多個

  4. release分支基于最新develop分支創(chuàng)建优烧,當新功能足夠發(fā)布一個新版本(或者接近新版本發(fā)布的截止日期),從develop分支創(chuàng)建一個release分支作為新版本的起點链峭,用于測試畦娄,所有的測試bug在這個分支改。測試完成后合并到master并打上版本號弊仪,同時也合并到develop熙卡,更新最新開發(fā)分支。(一旦打了release分支之后不要從develop分支上合并新的改動到release分支)励饵,同一時間只有1個驳癌,生命周期很短,只是為了發(fā)布役听。

  5. hotfix分支基于master分支創(chuàng)建颓鲜,對線上版本的bug進行修復(fù)表窘,完成后直接合并到master分支和develop分支,如果當前還有新功能release分支甜滨,也同步到release分支上乐严。同一時間只有1個,生命周期較短


第一步為master分支配套一個develop分支衣摩。簡單來做可以本地創(chuàng)建一個空的develop分支昂验,push到服務(wù)器上:

git branch –b develop
git push -u origin develop

以后這個分支將會包含了項目的全部歷史,而master分支將只包含了部分歷史艾扮。其它開發(fā)者這時應(yīng)該克隆中央倉庫既琴,建好develop分支的跟蹤分支:

git clone ssh://user@host/path/to/repo.git
git checkout -b develop origin/develop

現(xiàn)在每個開發(fā)都有了這些歷史分支的本地拷貝。從develop分支拉一個特性分支進行開發(fā)

git checkout -b some-feature develop
git push(如果這個功能需要多個人協(xié)作栏渺,建議push)

用老套路添加提交到各自功能分支上:編輯呛梆、暫存、提交:

git status
git add
git commit
git push(如果這個功能需要多個人協(xié)作)

添加了提交后磕诊,如果團隊使用Pull Requests,這時候可以發(fā)起一個用于合并到develop分支纹腌。否則就直接合并到本地的develop分支后push到中央倉庫

git pull origin develop
git checkout develop
git merge some-feature
git push
git branch -d some-feature
git push origin --delete some-feature (如果這個功能需要多個人協(xié)作) 

第一條命令在合并功能前確保develop分支是最新的霎终。注意,功能決不應(yīng)該直接合并到master分支升薯。
然后用一個新的分支來做發(fā)布準備莱褒。這一步也確定了發(fā)布的版本號:

git checkout -b release-1.0.0 develop

這個分支是清理發(fā)布、執(zhí)行所有測試涎劈、更新文檔和其它為下個發(fā)布做準備操作的地方广凸,像是一個專門用于改善發(fā)布的功能分支。只要創(chuàng)建這個分支并push到中央倉庫蛛枚,這個發(fā)布就是功能凍結(jié)的谅海。任何不在develop分支中的新功能都推到下個發(fā)布循環(huán)中。
一旦準備好了對外發(fā)布蹦浦,合并修改到master分支和develop分支上扭吁,刪除發(fā)布分支。

git checkout master
git merge release-1.0.0
git push
git checkout develop
git merge release-1.0.0
git push
git branch -d release-1.0.0
git push origin --delete release-1.0.0

發(fā)布分支是作為功能開發(fā)(develop分支)和對外發(fā)布(master分支)間的緩沖盲镶。只要有合并到master分支侥袜,就應(yīng)該打好Tag以方便跟蹤。

git tag -a 1.0.0 -m "Initial public release" master
git push --tags

對外發(fā)布后溉贿,發(fā)現(xiàn)了當前版本的一個Bug枫吧,從master分支上拉出了一個Hotfix分支,提交修改以解決問題宇色,然后直接合并回master分支

git checkout -b issue-#001 master
Fix the bug…..
git checkout master
git merge issue-#001
git push

就像發(fā)布分支九杂,維護分支中新加這些重要修改需要包含到develop分支中闽寡,然后才刪除這個Hotfix分支

git checkout develop
git merge issue-#001
git push
git branch -d issue-#001

三、Git Flow使用

3.1 安裝Git Flow(最新的git bash已經(jīng)支持尼酿,不用安裝)

  1. 在git bash中輸入:git clone --recursive git://github.com/nvie/gitflow.git d:\gitflow(指定git flow 安裝目錄)

2) 進入gitflow\contrib路徑下爷狈,執(zhí)行:msysgit-install.cmd d:\gitgit的安裝目錄)

  1. 打開Git Bash命令窗口,執(zhí)行git flow,輸出如下:

說明git flow 安裝成功!

3.2 Git Flow常用命令

git flow init:初始化一個現(xiàn)有的 git 庫,將會設(shè)置一些初始的參數(shù)裳擎,如分支前綴名等涎永,建議用默認值。

git flow feature start [featureBranchName]: 創(chuàng)建一個基于'develop'的feature分支鹿响,并切換到這個分支之下羡微。

git flow feature finish [featureBranchName]: 完成開發(fā)新特性, 合并 MYFEATURE 分支到 'develop', 刪除這個新特性分支, 切換回 'develop' 分支。

git flow feature publish [featureBranchName]:發(fā)布新特性分支到遠程服務(wù)器惶我,也可以使用git的push命令

git flow feature pull origin [featureBranchName]:取得其它用戶發(fā)布的新特性分支妈倔,并簽出遠程的變更。也可以使用git的pull命令

git flow feature track [featureBranchName]:跟蹤在origin上的feature分支绸贡。

git flow release start [releaseBranchName]:開始準備release版本盯蝴,從 'develop' 分支開始創(chuàng)建一個 release 分支。

git flow release publish [releaseBranchName]:創(chuàng)建 release 分支之后立即發(fā)布允許其它用戶向這個 release 分支提交內(nèi)容听怕。

git flow release track [releaseBranchName]:簽出 release 版本的遠程變更捧挺。

git flow release finish [releaseBranchName]:歸并 release 分支到 'master' 分支,用 release 分支名打 Tag尿瞭,歸并 release 分支到 'develop'闽烙,移除 release 分支。

git flow hotfix start [hotfixBranchName]:開始 git flow 緊急修復(fù)声搁,從master上建立hotfix分支黑竞。

git flow hotfix finish [hotfixBranchName]:結(jié)束 git flow 緊急修復(fù),代碼歸并回 develop 和 master 分支疏旨。相應(yīng)地很魂,master 分支打上修正版本的 TAG。

Tips:你依舊可以繼續(xù)使用你所知道和了解的git命令按照git flow的流程走充石,git flow只是一個工具集合莫换。

推薦工具:Sourcetree 下載地址:https://www.sourcetreeapp.com/,上面集成了git flow的工具包骤铃。

3.3 使用git flow命令實現(xiàn)分支管理流程


可以看出拉岁,上面的操作又是拉分支又是改版本又是合并, 很繁瑣惰爬。下面介紹一款插件喊暖,簡化整個流程,讓很多操作自動化撕瞧。

四陵叽、使用jgitflow-maven-plugin

4.1 配置maven

            <plugin>
                <groupId>external.atlassian.jgitflow</groupId>
                <artifactId>jgitflow-maven-plugin</artifactId>
                <version>1.0-m5.1</version>
                <configuration>
                    <localOnly>false</localOnly>
                    <pushFeatures>true</pushFeatures><!--是否在feature start 之后將feature分支推送到遠程倉庫-->
                    <pushReleases>true</pushReleases><!--是否在release start 之后將feature分支推送到遠程倉庫-->
                    <pushHotfixes>true</pushHotfixes><!--是否在hotfix start 之后將feature分支推送到遠程倉庫-->
                    <squash>false</squash>
                    <allowSnapshots>true</allowSnapshots>
                    <goals>clean</goals>
                    <noHotfixBuild>true</noHotfixBuild><!--是否在feature期間build項目-->
                    <noFeatureBuild>true</noFeatureBuild>
                    <noReleaseBuild>true</noReleaseBuild>
                    <!-- see goals wiki page for configuration options -->
                    <flowInitContext>
                        <masterBranchName>master</masterBranchName>
                        <developBranchName>develop</developBranchName>
                        <featureBranchPrefix>feature-</featureBranchPrefix>
                        <releaseBranchPrefix>release-</releaseBranchPrefix>
                        <hotfixBranchPrefix>hotfix-</hotfixBranchPrefix>
                        <versionTagPrefix>loan-</versionTagPrefix>
                    </flowInitContext>
                </configuration>
            </plugin>
            <plugin>
                <!--版本號管理插件-->
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>versions-maven-plugin</artifactId>
                <configuration>
                    <generateBackupPoms>false</generateBackupPoms>
                </configuration>
            </plugin>

官方文檔:https://bitbucket.org/atlassian/jgit-flow/wiki/Home

4.2 常用命令

mvn jgitflow:feature-start

mvn jgitflow:feature-finish

mvn jgitflow:release-start

mvn jgitflow:release-finish

mvn jgitflow:hotfix-start

mvn jgitflow:hotfix-finish

每個命令的大概意思參考第三節(jié)的git flow命令狞尔,具體的區(qū)別看下一節(jié)。

4.3 jgitflow-maven-plugin管理流程

  • 無需安裝Git Flow

  • 無需git flow init巩掺,在pom文件中就可以配置各個分支的前綴名等信息

  • 可根據(jù)配置決定在start的時候feature偏序、release、hotfix分支是否自動推送到遠程胖替,建議開啟

  • feature-finish后研儒,自動刪除feature本地和遠程分支,同理release和hotfix一樣

  • feature-finish后独令,自動合并到develop分支端朵,release-finish后,自動合并到master和develop分支

4.4 pom文件參數(shù)配置表


詳細請看:https://bitbucket.org/atlassian/jgit-flow/wiki/browse/goals

五燃箭、特殊情況討論

由于Git Flow只是定義的一套常規(guī)的開發(fā)流程模型冲呢,如果公司有特殊的流程,可以靈活運用Git Flow招狸,增加或者修改一些節(jié)點使之成為適合自己的流程敬拓。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市瓢颅,隨后出現(xiàn)的幾起案子恩尾,更是在濱河造成了極大的恐慌,老刑警劉巖挽懦,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異木人,居然都是意外死亡信柿,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門醒第,熙熙樓的掌柜王于貴愁眉苦臉地迎上來渔嚷,“玉大人,你說我怎么就攤上這事稠曼⌒尾。” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵霞幅,是天一觀的道長漠吻。 經(jīng)常有香客問我,道長司恳,這世上最難降的妖魔是什么途乃? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮扔傅,結(jié)果婚禮上耍共,老公的妹妹穿的比我還像新娘烫饼。我一直安慰自己,他們只是感情好试读,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布杠纵。 她就那樣靜靜地躺著,像睡著了一般钩骇。 火紅的嫁衣襯著肌膚如雪比藻。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天伊履,我揣著相機與錄音韩容,去河邊找鬼。 笑死唐瀑,一個胖子當著我的面吹牛群凶,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播哄辣,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼请梢,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了力穗?” 一聲冷哼從身側(cè)響起毅弧,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎当窗,沒想到半個月后够坐,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡崖面,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年元咙,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片巫员。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡庶香,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出赶掖,到底是詐尸還是另有隱情,我是刑警寧澤七扰,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站戳寸,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏疫鹊。R本人自食惡果不足惜司致,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望脂矫。 院中可真熱鬧,春花似錦霉晕、人聲如沸庭再。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拄轻。三九已至,卻和暖如春伟葫,著一層夾襖步出監(jiān)牢的瞬間恨搓,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工筏养, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留斧抱,地道東北人。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓渐溶,卻偏偏與公主長得像辉浦,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子茎辐,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容