Git 團(tuán)隊協(xié)作流程規(guī)范

前言

在使用Git的過程中如果沒有清晰流程和規(guī)劃,否則每個人都提交一堆雜亂無章的commit,項目很快就會變得難以協(xié)調(diào)和維護(hù)稿静。

Git版本管理同樣需要一個清晰的流程和規(guī)范。

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

以下是基于Vincent Driessen提出的Git Flow 流程圖 (非常清晰辕狰,圖片上的英文可以翻譯一下便于理解)

image

分支約定

主分支

image

主分支分為master分支和develop分支改备,是所有開發(fā)活動的核心分支。所有的開發(fā)活動產(chǎn)生的輸出物最終都會反映到主分支的代碼中, 生命周期為常駐蔓倍。

master 分支

  • master分支存放的是隨時可供在生產(chǎn)環(huán)境中部署的穩(wěn)定版本代碼

  • master分支保存官方發(fā)布版本歷史悬钳,release tag標(biāo)識不同的發(fā)布版本

  • 一個項目只能有一個master分支

  • 僅在發(fā)布新的可供部署的代碼時才更新master分支上的代碼

  • 每次更新master,都需對master添加指定格式的tag偶翅,用于發(fā)布或回滾

  • master分支是保護(hù)分支默勾,不可直接push到遠(yuǎn)程倉master分支

  • master分支代碼只能被release分支或hotfix分支合并

develop 分支

  • develop分支是保存當(dāng)前最新開發(fā)成果的分支

  • 一個項目只能有一個develop分支

  • develop分支衍生出各個feature分支

  • develop分支是保護(hù)分支,不可直接push到遠(yuǎn)程倉庫develop分支

  • develop分支不能與master分支直接交互

輔助分支

image

輔助分支分為feature分支聚谁、release 分支母剥、hotfix 分支,輔助分支主要用于組織軟件新功能的并行開發(fā)、簡化新功能開發(fā)代碼的跟蹤环疼、輔助完成版本發(fā)布工作以及對生產(chǎn)代碼的缺陷進(jìn)行緊急修復(fù)工作习霹。這些分支與主分支不同,通常只會在有限的時間范圍內(nèi)存在

feature 分支

使用規(guī)范:

  • 命名規(guī)則:feature/*

  • develop分支的功能分支

  • feature分支使用develop分支作為它們的父類分支

  • 以功能為單位從develop拉一個feature分支

  • 每個feature分支顆粒要盡量小炫隶,以利于快速迭代和避免沖突

  • 當(dāng)其中一個feature分支完成后淋叶,它會合并回develop分支

  • 當(dāng)一個功能因為各種原因不開發(fā)了或者放棄了,這個分支直接廢棄等限,不影響develop分支

  • feature分支代碼可以保存在開發(fā)者自己的代碼庫中而不強(qiáng)制提交到主代碼庫里

  • feature分支只與develop分支交互爸吮,不能與master分支直接交互

如有幾個同事同時開發(fā),需要分割成幾個小功能望门,每個人都需要從develop中拉出一個feature分支形娇,但是每個feature顆粒要盡量小,因為它需要我們能盡早merge回develop分支筹误,否則沖突解決起來就沒完沒了桐早。同時,當(dāng)一個功能因為各種原因不開發(fā)了或者放棄了厨剪,這個分支直接廢棄哄酝,不影響develop分支。

release 分支

使用規(guī)范:

  • 命名規(guī)則:release/*祷膳,“*”以本次發(fā)布的版本號為標(biāo)識

  • release分支主要用來為發(fā)布新版的測試陶衅、修復(fù)做準(zhǔn)備

  • 當(dāng)需要為發(fā)布新版做準(zhǔn)備時,從develop衍生出一個release分支

  • release分支可以從develop分支上指定commit派生出

  • release分支測試通過后直晨,合并到master分支并且給master標(biāo)記一個版本號

  • release分支一旦建立就將獨(dú)立搀军,不可再從其他分支pull代碼

  • 必須合并回develop分支和master分支

release分支是為發(fā)布新的產(chǎn)品版本而設(shè)計的。在這個分支上的代碼允許做小的缺陷修正勇皇、準(zhǔn)備發(fā)布版本所需的各項說明信息(版本號罩句、發(fā)布時間、編譯時間等)敛摘。通過在release分支上進(jìn)行這些工作可以讓develop分支空閑出來以接受新的feature分支上的代碼提交门烂,進(jìn)入新的軟件開發(fā)迭代周期。

當(dāng)develop分支上的代碼已經(jīng)包含了所有即將發(fā)布的版本中所計劃包含的軟件功能兄淫,并且已通過所有測試時屯远,我們就可以考慮準(zhǔn)備創(chuàng)建release分支了。而所有在當(dāng)前即將發(fā)布的版本之外的業(yè)務(wù)需求一定要確保不能混到release分支之內(nèi)(避免由此引入一些不可控的系統(tǒng)缺陷)拖叙。

成功的派生了release分支氓润,并被賦予版本號之后,develop分支就可以為“下一個版本”服務(wù)了薯鳍。所謂的“下一個版本”是在當(dāng)前即將發(fā)布的版本之后發(fā)布的版本。版本號的命名可以依據(jù)項目定義的版本號命名規(guī)則進(jìn)行。

hotfix 分支

使用規(guī)范:

  • 命名規(guī)則:hotfix/*

  • hotfix分支用來快速給已發(fā)布產(chǎn)品修復(fù)bug或微調(diào)功能

  • 只能從master分支指定tag版本衍生出來

  • 一旦完成修復(fù)bug挖滤,必須合并回master分支和develop分支

  • master被合并后崩溪,應(yīng)該被標(biāo)記一個新的版本號

  • hotfix分支一旦建立就將獨(dú)立,不可再從其他分支pull代碼

除了是計劃外創(chuàng)建的以外斩松,hotfix分支與release分支十分相似:都可以產(chǎn)生一個新的可供在生產(chǎn)環(huán)境部署的軟件版本伶唯。

當(dāng)生產(chǎn)環(huán)境中的軟件遇到了異常情況或者發(fā)現(xiàn)了嚴(yán)重到必須立即修復(fù)的軟件缺陷的時候,就需要從master分支上指定的TAG版本派生hotfix分支來組織代碼的緊急修復(fù)工作惧盹。

這樣做的顯而易見的好處是不會打斷正在進(jìn)行的develop分支的開發(fā)工作乳幸,能夠讓團(tuán)隊中負(fù)責(zé)新功能開發(fā)的人與負(fù)責(zé)代碼緊急修復(fù)的人并行的開展工作。

Git Flow 如何使用

  • Master/Develop 分支

所有在Master分支上的Commit應(yīng)該打上Tag钧椰,一般情況下Master不存在Commit粹断,Devlop分支基于Master分支創(chuàng)建

image
  • Feature 分支

Feature分支做完后,必須合并回Develop分支, 合并完分支后一般會刪點(diǎn)這個Feature分支嫡霞,畢竟保留下來意義也不大瓶埋。

image
  • Release 分支

Release分支基于Develop分支創(chuàng)建,打完Release分支之后诊沪,我們可以在這個Release分支上測試养筒,修改Bug等。同時端姚,其它開發(fā)人員可以基于Develop分支新建Feature (記自畏唷:一旦打了Release分支之后不要從Develop分支上合并新的改動到Release分支)發(fā)布Release分支時,合并Release到Master和Develop渐裸, 同時在Master分支上打個Tag記住Release版本號巫湘,然后可以刪除Release分支了。

image
  • Hotfix 分支

hotfix分支基于Master分支創(chuàng)建橄仆,開發(fā)完后需要合并回Master和Develop分支剩膘,同時在Master上打一個tag。

image

使用規(guī)范

所有使用了本規(guī)范的項目盆顾,必須嚴(yán)格規(guī)范操作怠褐,否則不予以合并代碼、提測您宪、打包上線等后續(xù)操作

基本要求

  • 所有commit必須有注釋奈懒,內(nèi)容必須簡潔明了的描述本次commit涵蓋了哪些內(nèi)容。嚴(yán)禁注釋內(nèi)容過于簡單或不能明確表達(dá)提交內(nèi)容的宪巨!

  • 合理控制提交內(nèi)容的顆粒度磷杏,一次commit含一個獨(dú)立功能點(diǎn)。嚴(yán)禁一次提交涵蓋多個功能項捏卓。

  • 正確為每個項目設(shè)置Git提交用到的user.name和user.email信息极祸,以公司郵箱為準(zhǔn),不可隨意設(shè)置以影響無法正確識別。 查看當(dāng)前項目配置信息的命令:git config -l

commit提交規(guī)范

<type>(<scope>): <subject>

type

commit 的類型:

  • feat: 新功能遥金、新特性

  • fix: 修改 bug

  • perf: 更改代碼浴捆,以提高性能(在不影響代碼內(nèi)部行為的前提下,對程序性能進(jìn)行優(yōu)化)

  • refactor: 代碼重構(gòu)(重構(gòu)稿械,在不影響代碼內(nèi)部行為选泻、功能下的代碼修改)

  • docs: 文檔修改

  • style: 代碼格式修改, 注意不是 css 修改(例如分號修改)

  • test: 測試用例新增、修改

  • build: 影響項目構(gòu)建或依賴項修改

  • revert: 恢復(fù)上一次提交

  • ci: 持續(xù)集成相關(guān)文件修改

  • chore: 其他修改(不在上述類型中的修改)

  • release: 發(fā)布新版本

  • workflow: 工作流相關(guān)文件修改

scope

commit 影響的范圍, 比如: route, component, utils, build...

subject

commit 的概述

示例

fix

如果修復(fù)的這個BUG只影響當(dāng)前修改的文件美莫,可不加范圍页眯。如果影響的范圍比較大,要加上范圍描述厢呵。

例如這次 BUG 修復(fù)影響到全局窝撵,可以加個 global。如果影響的是某個目錄或某個功能述吸,可以加上該目錄的路徑忿族,或者對應(yīng)的功能名稱。

// 示例1
fix(global):修復(fù)checkbox不能復(fù)選的問題
// 示例2 下面圓括號里的 common 為通用管理的名稱
fix(common): 修復(fù)字體過小的BUG蝌矛,將通用管理下所有頁面的默認(rèn)字體大小修改為 14px
// 示例3
fix: value.length -> values.length

版本號(tag)

  • 版本號(tag)命名規(guī)則:主版本號.次版本號.修訂號道批,如2.1.13。(遵循GitHub語義化版本命名規(guī)范)

  • 版本號僅標(biāo)記于master分支入撒,用于標(biāo)識某個可發(fā)布/回滾的版本代碼

  • 對master標(biāo)記tag意味著該tag能發(fā)布到生產(chǎn)環(huán)境

  • 對master分支代碼的每一次更新(合并)必須標(biāo)記版本號

  • 僅項目管理員有權(quán)限對master進(jìn)行合并和標(biāo)記版本號

項目權(quán)限

  • Git權(quán)限分管理員隆豹、開發(fā)者、瀏覽者三種類型

  • 瀏覽者只能瀏覽代碼茅逮,無push璃赡、pull request等所有寫權(quán)限

  • 開發(fā)者擁有瀏覽、push非主分支献雅、提交pull request工單權(quán)限

  • 管理員擁有建立和管理Git項目碉考、合并分支和代碼、給master打tag版本號等權(quán)限

分支使用

  • 每個Git項目固定含有上述所有分支類型挺身。主分支master和develop是保護(hù)分支侯谁,只能進(jìn)行合并請求,均不可直接提交代碼章钾。

  • 功能需求或常規(guī)Bug修復(fù)墙贱,請從develop拉取feature分支;線上緊急問題修復(fù)贱傀,請從master拉去hotfix分支惨撇。

代碼提交

  • 一個提交就代表解決一個問題

  • 大問題適當(dāng)?shù)胤纸鉃槎鄠€小問題,以便每次小型提交都更易于理解

  • 提交前本地代碼需要編譯成功府寒,并檢查一下提交的代碼 (這一步很重要魁衙,測試代碼报腔、簡單的邏輯錯誤都可以被發(fā)現(xiàn), 可以有效解決簡單粗心的bug產(chǎn)生)

參考資料:

Git工作流與規(guī)范

Git Flow正確使用姿勢

Git Commit提交規(guī)范

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市纺棺,隨后出現(xiàn)的幾起案子榄笙,更是在濱河造成了極大的恐慌邪狞,老刑警劉巖祷蝌,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異帆卓,居然都是意外死亡巨朦,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進(jìn)店門剑令,熙熙樓的掌柜王于貴愁眉苦臉地迎上來糊啡,“玉大人,你說我怎么就攤上這事吁津∨镄睿” “怎么了?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵碍脏,是天一觀的道長梭依。 經(jīng)常有香客問我,道長典尾,這世上最難降的妖魔是什么役拴? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮钾埂,結(jié)果婚禮上河闰,老公的妹妹穿的比我還像新娘。我一直安慰自己褥紫,他們只是感情好姜性,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著髓考,像睡著了一般部念。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上绳军,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天印机,我揣著相機(jī)與錄音,去河邊找鬼门驾。 笑死射赛,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的奶是。 我是一名探鬼主播楣责,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼竣灌,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了秆麸?” 一聲冷哼從身側(cè)響起初嘹,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎沮趣,沒想到半個月后屯烦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡房铭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年驻龟,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缸匪。...
    茶點(diǎn)故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡翁狐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出凌蔬,到底是詐尸還是另有隱情露懒,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布砂心,位于F島的核電站懈词,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏计贰。R本人自食惡果不足惜钦睡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望躁倒。 院中可真熱鬧荞怒,春花似錦、人聲如沸秧秉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽象迎。三九已至荧嵌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間砾淌,已是汗流浹背啦撮。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留汪厨,地道東北人赃春。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像劫乱,于是被迫代替她去往敵國和親织中。 傳聞我的和親對象是個殘疾皇子锥涕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評論 2 355

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