實(shí)習(xí)第一天眯娱,上司讓我學(xué)習(xí)一下Git Flow

簡(jiǎn)述Git Flow

首先,Git Flow并不是Git的替代品,Git Flow只是把標(biāo)準(zhǔn)的Git命令用腳本組合了起來(lái)办绝,形成比較有效而簡(jiǎn)單的命令。

Git Flow只是給我們提供一個(gè)更簡(jiǎn)便的工作流程命令田绑,而更重要的是我們需要去學(xué)習(xí)和理解關(guān)于版本控制系統(tǒng)的工作流程,才能有效的迭代產(chǎn)品抡爹,避免混亂掩驱。

而當(dāng)項(xiàng)目處于一個(gè)多人協(xié)作的狀態(tài)下,工作流程顯得非常之重要。假設(shè)當(dāng)兩個(gè)甚至多個(gè)開發(fā)者同時(shí)再開發(fā)各自新功能時(shí)欧穴,如果在同一分支上進(jìn)行協(xié)作時(shí)民逼,這必然會(huì)產(chǎn)生大量的沖突。而工作流程的做法苔可,就是每個(gè)開發(fā)者可以各自切出一個(gè)獨(dú)立分支缴挖,當(dāng)各自功能實(shí)現(xiàn)并且測(cè)試成功后,再自行合并到master分支中焚辅,甚至無(wú)需等待其他功能實(shí)現(xiàn)再一起發(fā)布映屋。

分支應(yīng)用情境

Git Flow中,主要的分支有master同蜻、develop棚点、hotfixrelease湾蔓、feature 這五種分支瘫析。masterdevelop分支是我們最常見的分支,它們被稱作長(zhǎng)期分支默责,一直存活在整個(gè)工作流程中贬循,而其它的分支大部分會(huì)因任務(wù)結(jié)束而被刪除。

git flow分支應(yīng)用示意圖

master分支

該分支主要用來(lái)存放穩(wěn)定桃序、隨時(shí)可以上線的版本杖虾。

這個(gè)分支的來(lái)源只能從別的分支合并過(guò)來(lái),開發(fā)者不會(huì)直接commit到這個(gè)分支上媒熊。

通常我們也會(huì)在這個(gè)分支上的提交打上版本號(hào)標(biāo)簽奇适。

develop分支

這個(gè)分支主要是所有開發(fā)的基礎(chǔ)分支。

當(dāng)要添加功能時(shí)芦鳍,所有功能都是從這個(gè)分支切出去的嚷往,而功能分支實(shí)現(xiàn)后,也都會(huì)合并回來(lái)這個(gè)分支中柠衅。

hotfix分支

當(dāng)線上產(chǎn)品發(fā)生了緊急問(wèn)題的時(shí)候皮仁,就會(huì)從master分支中開一個(gè)hotfix分支出來(lái)進(jìn)行修復(fù)。

當(dāng)hotfix分支修復(fù)完成之后菲宴,就會(huì)合并到master分支中魂贬,并且也會(huì)合并到develop分支中。

release分支

當(dāng)develop分支完成需求后裙顽,就可以從develop分支中開一個(gè)release分支,進(jìn)行上線前最后的測(cè)試宣谈。

測(cè)試完成后愈犹,釋放release分支將會(huì)同時(shí)合并到master以及develop分支中。

feature分支

當(dāng)我們需要補(bǔ)充功能的時(shí)候,就會(huì)從develop分支中開一個(gè)feature分支進(jìn)行功能開發(fā)漩怎。

當(dāng)功能實(shí)現(xiàn)后勋颖,在將feature分支合并到develop分支中,等待最后的測(cè)試發(fā)布勋锤。

示意圖

git flow分支應(yīng)用示意圖

安裝與使用

安裝

Mac

brew install git-flow

如果沒有安裝brew的話可使用下列命令進(jìn)行安裝:

 /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"

Win

Windows安裝git flow

初始化

先將項(xiàng)目克隆到本地饭玲。

git clone <project-url>

初始化Git Flow

git flow init

命令行會(huì)提示你是否修改Git Flow提供的默認(rèn)分支前綴叁执。不同場(chǎng)景的分支前綴不同茄厘,默認(rèn)情況下分支前綴是這樣的。

場(chǎng)景 分支前綴
新功能 feature
預(yù)發(fā)布 release
熱修復(fù) hotfix
打標(biāo)簽
Which branch should be used for bringing forth production releases?
   - develop
   - master
Branch name for production releases: [master]

Which branch should be used for integration of the "next release"?
   - develop
Branch name for "next release" development: [develop]

How to name your supporting branch prefixes?
Feature branches? [feature/]
Release branches? [release/]
Hotfix branches? [hotfix/]
Support branches? [support/]
Version tag prefix? []

分支前綴的作用是區(qū)分不同分支的使用場(chǎng)景谈宛,同時(shí)當(dāng)你使用Git Flow命令時(shí)就不需要手動(dòng)增加分支前綴次哈,Git Flow會(huì)幫你加上。

通常情況下不需要修改默認(rèn)的命名前綴吆录,只需要加上-d就可以跳過(guò)修改命名步驟窑滞。

git flow init -d

feature場(chǎng)景

[圖片上傳失敗...(image-e844a5-1609829360387)]

當(dāng)我們需要開發(fā)一個(gè)新功能的時(shí)候,此時(shí)需要基于develop分支拉出feature分支進(jìn)行開發(fā)恢筝,即feature場(chǎng)景的生命周期開始哀卫。

通常來(lái)說(shuō),一種場(chǎng)景的完整生命周期至少包含以下幾種行為:

  • start :開始開發(fā)
  • publish :發(fā)布到遠(yuǎn)程分支
  • finish :完成開發(fā)撬槽、合并分支

start

新功能開始開發(fā)前此改,需準(zhǔn)備好開發(fā)分支。

git flow feature start <feature-name>

執(zhí)行上面命令后恢氯,將會(huì)在本地創(chuàng)建一個(gè)名為<feature-name> 的分支带斑,并切換到該分支。

而且無(wú)論你當(dāng)前處于哪個(gè)分支勋拟,它都會(huì)基于本地develop分支創(chuàng)建的勋磕。

上述命令相當(dāng)于執(zhí)行了下面的Git操作。

git checkout -b feature/<feature-name> develop

需要注意的一點(diǎn)是敢靡,該分支是基礎(chǔ)本地的develop 分支創(chuàng)建挂滓,所以執(zhí)行此命令錢一般需要拉取最新的遠(yuǎn)程代碼。

publish

在本地開發(fā)完成新功能并進(jìn)行commit操作后啸胧,需要將本地代碼提交到遠(yuǎn)程倉(cāng)庫(kù)赶站。

git flow feature publish <feature-name>

該命令主要做了三件事情:

  • 創(chuàng)建一個(gè)名為feature/<feature-name>的遠(yuǎn)程分支
  • 本地分支track遠(yuǎn)程分支
  • 如果本地存在還沒提交的代碼,就進(jìn)行代碼提交
git push origin feature/<feature-name>
git push --set-upstream origin feature/<feature-name>
git push origin

當(dāng)你執(zhí)行后publish操作后纺念,后續(xù)還需要進(jìn)行代碼提交的話贝椿,只需執(zhí)行正常的push命令既可。

git push

finish

當(dāng)功能開發(fā)完畢后就將進(jìn)入測(cè)試階段陷谱,此時(shí)需要將該分支合并到develop分支烙博。

git flow feature finish <feature-name>

該命令也主要做了三件事情:

  • 切換到develop分支
  • 合并代碼到develop分支
  • 刪除本地feature/<feature-name>分支
git checkout develop
git merge feature/<feature-name>
git branch -d feature/<feature-name>

Git Flowmerge操作與默認(rèn)的git merge操作有些不同瑟蜈。

默認(rèn)情況下它會(huì)檢查本次merge有多少commit記錄,如果僅有一條的話采用fast-forward模式渣窜,即只移動(dòng)HEAD指針而不會(huì)生成提交記錄铺根;如果超過(guò)一條commit的話,這采用no-ff模式乔宿,該模式下則會(huì)多生成一條mergecommit記錄位迂。

這樣做的好處是當(dāng)有多條提交記錄時(shí)方便進(jìn)行代碼回退和記錄監(jiān)察,而只有單條提交記錄的時(shí)候則簡(jiǎn)化代碼提交記錄從而便于管理详瑞。

當(dāng)finish操作過(guò)程中掂林,如果merge發(fā)生了沖突,則會(huì)終端finish操作蛤虐,不會(huì)刪除feature/<feature-name>分支党饮,同時(shí)也處于develop分支上。

當(dāng)本地沖突解決并commit后驳庭,重新進(jìn)行finish操作即可刑顺。

另外,finish指令還支持三個(gè)附加參數(shù):

  • -r :即merge前先執(zhí)行rebase饲常,但即使rebase后符合fast-forward條件也不一定會(huì)用fast-forward蹲堂。
  • -F :即合并完成連同遠(yuǎn)程分支一并刪除。
  • -k :即保留本地feature分支贝淤,不執(zhí)行delete動(dòng)作柒竞。

release場(chǎng)景

[圖片上傳失敗...(image-e5c7e0-1609829360387)]

當(dāng)新功能開發(fā)完成后,將進(jìn)入測(cè)試階段播聪,此時(shí)需要基于develop分支拉出release 分支進(jìn)行集成測(cè)試朽基,也有將release場(chǎng)景作為預(yù)發(fā)布環(huán)境進(jìn)行測(cè)試。

在這種情況下离陶,一般而言release只有少數(shù)改動(dòng)稼虎。

start

使用start開啟一個(gè)release場(chǎng)景。

git flow release start <release-name>

該命令會(huì)基于本地的develop分支創(chuàng)建一個(gè)release/<release-name>分支招刨,并切換到這個(gè)分支霎俩。

需要注意一點(diǎn)是,如果本地還有未finishrelease分支的話沉眶,將不允許使用start指令開啟新的release分支打却,這一點(diǎn)是對(duì)并行發(fā)布的一個(gè)限制。

publish

為了讓其他協(xié)同人員能夠看到該分支并一同測(cè)試谎倔,需要將其發(fā)布出去柳击。

git flow release publish <release-name>

finish

待測(cè)試通過(guò)后需要發(fā)布正式版:

git flow release finish <release-name>

該命令的動(dòng)作會(huì)比較多,大致是:

  • git fetch片习,拉取最新的代碼
  • 將分支合并到master分支
  • 生成名為<release-name>tag
  • 將分支合并到develop分支
  • 刪除release/<release-name>分支
  • 切換回develop分支

如果merge產(chǎn)生沖突不會(huì)終止流程腻暮,只是不會(huì)將本地的release分支刪除彤守。待解決完沖突后需再次執(zhí)行finish操作。

finish只是完成了本地代碼的一系列操作哭靖,可使用下列命令進(jìn)行推送所有的分支和tag

git push origin --all
git push origin --tag

hotfix場(chǎng)景

release場(chǎng)景

如果在線上發(fā)現(xiàn)了bug侈离,需要進(jìn)行緊急修復(fù)的時(shí)候试幽,就需要用到了hotfix場(chǎng)景。

start

git flow hotfix start <hotfix-name>

該命令將從master分支創(chuàng)建了一個(gè)hotfix/<hotfix-name>的分支并切換到該分支卦碾。

finish

hotfix沒有publish命令铺坞,因?yàn)?code>Git Flow認(rèn)為hotfix應(yīng)該是小范圍的改動(dòng),不需要其他協(xié)同人員參與洲胖。

但本地修改結(jié)束并進(jìn)行commit操作后济榨,則執(zhí)行finish操作。

git flow hotfix finish <hotfix-name>

該命令所做任務(wù)與release基本相同绿映,先拉取代碼擒滑,然后將分支合并到masterdevelop分支中叉弦,并且打上tag丐一,然后刪除該分支,最后切回develop分支淹冰。

其他代碼工作流

Git Flow相似的代碼管理工作流還有Github Flow和[Gitlab Flow][https://docs.gitlab.com/ee/topics/gitlab_flow.html]库车。

  • Github Flow是簡(jiǎn)化版的Git Flow,它使用了mainfeature來(lái)管理代碼樱拴,它只有一個(gè)長(zhǎng)期分支柠衍,就是main
  • Gitlab Flow更關(guān)注代碼的持續(xù)集成晶乔,一個(gè)版本需要?jiǎng)?chuàng)建測(cè)試環(huán)境珍坊、預(yù)覽環(huán)境、生成環(huán)境的分支瘪弓,最后匯總到stable branch分支用于發(fā)布垫蛆。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市腺怯,隨后出現(xiàn)的幾起案子袱饭,更是在濱河造成了極大的恐慌,老刑警劉巖呛占,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件虑乖,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡晾虑,警方通過(guò)查閱死者的電腦和手機(jī)疹味,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門仅叫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人糙捺,你說(shuō)我怎么就攤上這事诫咱。” “怎么了洪灯?”我有些...
    開封第一講書人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵坎缭,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我签钩,道長(zhǎng)掏呼,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任铅檩,我火速辦了婚禮憎夷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘昧旨。我一直安慰自己拾给,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開白布臼予。 她就那樣靜靜地躺著鸣戴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪粘拾。 梳的紋絲不亂的頭發(fā)上窄锅,一...
    開封第一講書人閱讀 52,156評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音缰雇,去河邊找鬼入偷。 笑死,一個(gè)胖子當(dāng)著我的面吹牛械哟,可吹牛的內(nèi)容都是我干的疏之。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼暇咆,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼锋爪!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起爸业,我...
    開封第一講書人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤其骄,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后扯旷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拯爽,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年钧忽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了毯炮。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逼肯。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖桃煎,靈堂內(nèi)的尸體忽然破棺而出篮幢,到底是詐尸還是另有隱情,我是刑警寧澤为迈,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布洲拇,位于F島的核電站,受9級(jí)特大地震影響曲尸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜男翰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一另患、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蛾绎,春花似錦昆箕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至顽爹,卻和暖如春纤泵,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背镜粤。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工捏题, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人肉渴。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓公荧,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親同规。 傳聞我的和親對(duì)象是個(gè)殘疾皇子循狰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359

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

  • 什么是GitFlow? Git Flow定義了一個(gè)項(xiàng)目發(fā)布的分支模型,為管理具有預(yù)定發(fā)布周期的大型項(xiàng)目提供了一個(gè)健...
    一天大佬閱讀 12,726評(píng)論 0 5
  • 一券勺、簡(jiǎn)介 Git Flow定義了一個(gè)項(xiàng)目發(fā)布的分支模型绪钥,為管理具有預(yù)定發(fā)布周期的大型項(xiàng)目提供了一個(gè)健壯的框架。 二...
    _Mitch閱讀 26,584評(píng)論 2 41
  • 簡(jiǎn)介 Gitflow工作流程圍繞項(xiàng)目發(fā)布定義了嚴(yán)格的分支模型朱灿。盡管它比Feature Branch Workflo...
    要開心閱讀 376評(píng)論 0 0
  • Git FLow是什么 Git Flow是構(gòu)建在Git之上的一個(gè)組織軟件開發(fā)活動(dòng)的模型昧识,也是軟件開發(fā)過(guò)程中一種成功...
    華枯榮閱讀 2,253評(píng)論 2 10
  • 漸變的面目拼圖要我怎么拼? 我是疲乏了還是投降了甸祭? 不是不允許自己墜落缕碎, 我沒有滴水不進(jìn)的保護(hù)膜。 就是害怕變得面...
    悶熱當(dāng)乘涼閱讀 4,249評(píng)論 0 13