大家好膝晾,我是IT修真院北京分院第22期學(xué)員,一枚正直善良的web程序員务冕。
1.背景介紹
什么是Git工作流玷犹?
Git工作流你可以理解為工作中團(tuán)隊(duì)成員遵守的一種代碼管理方案,在Git中有以下幾種工作流方案作為方案指導(dǎo)
1洒疚、集中式工作流
2歹颓、功能分支工作流
3、Gitflow工作流
4油湖、Forking工作流
2.知識(shí)剖析
集中式工作流:
這種工作方式跟svn類似巍扛,它只有一個(gè)master分支,開發(fā)者會(huì)先把遠(yuǎn)程的倉(cāng)庫(kù)克隆到本地乏德,之后的修 改和提交都在本地操作撤奸,直到在某個(gè)合適的時(shí)間點(diǎn)將本地的代碼合入到遠(yuǎn)程master。這種工作流比 較適合小團(tuán)隊(duì)喊括,因?yàn)樾F(tuán)隊(duì)可能不會(huì)太多的協(xié)作和合流的動(dòng)作胧瓜。
3.常見問(wèn)題
Gitflow工作流的工作方式?
4.解決方案
Gitflow工作流是經(jīng)典模型,處于核心位置郑什,體現(xiàn)了工作流的經(jīng)驗(yàn)和精髓府喳。
Gitflow工作流通過(guò)為功能開發(fā)、發(fā)布準(zhǔn)備和維護(hù)分配獨(dú)立的分支蘑拯,讓發(fā)布迭代過(guò)程更流暢钝满。嚴(yán)格的分支模型也為大型項(xiàng)目提供了一些非常必要的結(jié)構(gòu)兜粘。
歷史分支
相對(duì)使用僅有的一個(gè)master分支,Gitflow工作流使用2個(gè)分支來(lái)記錄項(xiàng)目的歷史弯蚜。 master分支存儲(chǔ)了正式發(fā)布的歷史孔轴,而develop分支作為功能的集成分支。 這樣也方便master分支上的所有提交分配一個(gè)版本號(hào)碎捺。
功能分支
每個(gè)新功能位于一個(gè)自己的分支路鹰,這樣可以push到中央倉(cāng)庫(kù)以備份和協(xié)作。 但功能分支不是從master分支上拉出新分支收厨,而是使用develop分支作為父分支悍引。 當(dāng)新功能完成時(shí),合并回develop分支帽氓。 新功能提交應(yīng)該從不直接與master分支交互。 從各種含義和目的上來(lái)看俩块,功能分支加上develop分支就是功能分支工作流的用法黎休。但Gitflow工作流沒有在這里止步。
發(fā)布分支
一旦develop分支上有了做一次發(fā)布(或者說(shuō)快到了既定的發(fā)布日)的足夠功能玉凯,就從develop分支上checkout一個(gè)發(fā)布分支势腮。 新建的分支用于開始發(fā)布循環(huán),所以從這個(gè)時(shí)間點(diǎn)開始之后新的功能不能再加到這個(gè)分支上—— 這個(gè)分支只應(yīng)該做Bug修復(fù)漫仆、文檔生成和其它面向發(fā)布任務(wù)捎拯。 一旦對(duì)外發(fā)布的工作都完成了, 發(fā)布分支合并到master分支并分配一個(gè)版本號(hào)打好Tag盲厌。 另外署照,這些從新建發(fā)布分支以來(lái)的做的修改要合并回develop分支。
使用一個(gè)用于發(fā)布準(zhǔn)備的專門分支吗浩,使得一個(gè)團(tuán)隊(duì)可以在完善當(dāng)前的發(fā)布版本的同時(shí)建芙,另一個(gè)團(tuán)隊(duì)可以繼續(xù)開發(fā)下個(gè)版本的功能。 這也打造定義良好的開發(fā)階段懂扼。
維護(hù)分支
維護(hù)分支或說(shuō)是熱修復(fù)(hotfix)分支用于生成快速給產(chǎn)品發(fā)布版本(production releases)打補(bǔ)丁禁荸, 這是唯一可以直接從master分支fork出來(lái)的分支。 修復(fù)完成阀湿,修改應(yīng)該馬上合并回master分支和dev elop分支(當(dāng)前的發(fā)布分支)赶熟,master分支應(yīng)該用新的版本號(hào)打好Tag。
為Bug修復(fù)使用專門分支陷嘴,讓團(tuán)隊(duì)可以處理掉問(wèn)題而不用打斷其它工作或是等待下一個(gè)發(fā)布循環(huán)映砖。 你可以把維護(hù)分支想成是一個(gè)直接在master分支上處理的臨時(shí)發(fā)布。
5.編碼實(shí)戰(zhàn)
由于本次均為理論性內(nèi)容灾挨,所以以示例為主
下面的示例演示本工作流如何用于管理單個(gè)發(fā)布循環(huán)啊央。假設(shè)你已經(jīng)創(chuàng)建了一個(gè)中央倉(cāng)庫(kù)眶诈。創(chuàng)建開發(fā)分支
1、第一步為master分支配套一個(gè)develop分支瓜饥。簡(jiǎn)單來(lái)做可以本地創(chuàng)建一個(gè)空的develop分支逝撬,push到服務(wù)器上。 以后這個(gè)分支將會(huì)包含了項(xiàng)目的全部歷史乓土,而master分支將只包含了部分歷史宪潮。 其它開發(fā)者這時(shí)應(yīng)該克隆中央倉(cāng)庫(kù),建好develop分支的跟蹤分支: 現(xiàn)在每個(gè)開發(fā)都有了這些歷史分支的本地拷貝趣苏。
小紅和小明開始開發(fā)新功能
這個(gè)示例中狡相,小紅和小明開始各自的功能開發(fā)。他們需要為各自的功能創(chuàng)建相應(yīng)的分支食磕。
新分支不是基于master分支尽棕,而是應(yīng)該基于develop分支,
他們用老套路添加提交到各自功能分支上:編輯彬伦、暫存滔悉、提交。
小紅完成功能開發(fā)
添加了提交后单绑,小紅覺得她的功能OK了回官。如果團(tuán)隊(duì)使用Pull Requests,這時(shí)候可以發(fā)起一個(gè)用于合并到develop分支搂橙。 否則她可以直接合并到她本地的develop分支后push到中央倉(cāng)歉提。 在合并功能前確保develop分支是最新的。注意区转,功能決不應(yīng)該直接合并到master分支苔巨。沖突解決方法和集中式工作流一樣。
小紅開始準(zhǔn)備發(fā)布
這個(gè)時(shí)候小明正在實(shí)現(xiàn)他的功能废离,小紅開始準(zhǔn)備她的第一個(gè)項(xiàng)目正式發(fā)布恋拷。 像功能開發(fā)一樣,她用一個(gè)新的分支來(lái)做發(fā)布準(zhǔn)備厅缺。這一步也確定了發(fā)布的版本號(hào)蔬顾。
這個(gè)分支是清理發(fā)布、執(zhí)行所有測(cè)試湘捎、更新文檔和其它為下個(gè)發(fā)布做準(zhǔn)備操作的地方诀豁,像是一個(gè)專門用于改善發(fā)布的功能分支。 只要小紅創(chuàng)建這個(gè)分支并push到中央倉(cāng)庫(kù),這個(gè)發(fā)布就是功能凍結(jié)的。任何不在develop分支中的新功能都推到下個(gè)發(fā)布循環(huán)中枕扫。
小紅完成發(fā)布
一旦準(zhǔn)備好了對(duì)外發(fā)布丧荐,小紅合并修改到master分支和develop分支上烹骨,刪除發(fā)布分支翻伺。
合并回develop分支很重要,因?yàn)樵诎l(fā)布分支中已經(jīng)提交的更新需要在后面的新功能中也要是可用的沮焕。
發(fā)布分支是作為功能開發(fā)(develop分支)和對(duì)外發(fā)布(master分支)間的緩沖吨岭。 只要有合并到master分支,就應(yīng)該打好Tag以方便跟蹤峦树。
Git有提供各種勾子(hook)辣辫,即倉(cāng)庫(kù)有事件發(fā)生時(shí)觸發(fā)執(zhí)行的腳本。 可以配置一個(gè)勾子魁巩,在你push中央倉(cāng)庫(kù)的master分支時(shí)急灭,自動(dòng)構(gòu)建好對(duì)外發(fā)布。
最終用戶發(fā)現(xiàn)Bug
對(duì)外發(fā)布后谷遂,小紅回去和小明一起做下個(gè)發(fā)布的新功能開發(fā)葬馋,直到有最終用戶開了一個(gè)Ticket抱怨當(dāng)前版本的一個(gè)Bug。 為了處理Bug肾扰,小紅(或小明)從master分支上拉出了一個(gè)維護(hù)分支畴嘶,提交修改以解決問(wèn)題,然后直接合并回master分支白对。 就像發(fā)布分支,維護(hù)分支中新加這些重要修改需要包含到develop分支中换怖,所以小紅要執(zhí)行一個(gè)合并操作甩恼。 然后就可以安全地刪除這個(gè)分支了。
最終用戶發(fā)現(xiàn)Bug
對(duì)外發(fā)布后沉颂,小紅回去和小明一起做下個(gè)發(fā)布的新功能開發(fā)条摸,直到有最終用戶開了一個(gè)Ticket抱怨當(dāng)前版本的一個(gè)Bug。 為了處理Bug铸屉,小紅(或小明)從master分支上拉出了一個(gè)維護(hù)分支钉蒲,提交修改以解決問(wèn)題,然后直接合并回master分支彻坛。 就像發(fā)布分支顷啼,維護(hù)分支中新加這些重要修改需要包含到develop分支中,所以小紅要執(zhí)行一個(gè)合并操作昌屉。 然后就可以安全地刪除這個(gè)分支了钙蒙。
6.擴(kuò)展思考
SourceTree里GitFlow的使用
1、初始化
SourceTree會(huì)自動(dòng)化進(jìn)行一些操作间驮,最明顯的變化是項(xiàng)目代碼庫(kù)里自動(dòng)增加了一個(gè)develop的分支躬厌。
將新創(chuàng)建的develop分支推送到遠(yuǎn)端倉(cāng)庫(kù)。
從此竞帽,代碼庫(kù)里就存在了兩個(gè)永久性的分支:master和develop扛施,未來(lái)所有的開發(fā)工作都圍繞這兩個(gè)分支進(jìn)行派生跟合并鸿捧。
之前提到,項(xiàng)目里有兩個(gè)永久的分支:master和develop疙渣。這兩個(gè)分支也被稱為“歷史性”分支匙奴,在其后的開發(fā)工作中, Gitflow模型支持在feature昌阿、release饥脑、hotfix分支上折騰,這樣也有效避免了不同類型的開發(fā)工作在代碼層級(jí)的耦合和干擾懦冰。
這三個(gè)分支的用途灶轰、派生來(lái)源分支和合并目標(biāo)分支如下:
feature,功能開發(fā)分支刷钢,用于承接具體功能需求的開發(fā)
派生于develop
合并于develop
hotfix笋颤,bug修復(fù)分支,用于解決線上運(yùn)行環(huán)境發(fā)現(xiàn)的bug
派生于master
合并于master内地、develop
release伴澄,版本發(fā)布分支,用于完成發(fā)布準(zhǔn)備的
派生于develop
合并于master阱缓、develop
跟“歷史性”分支相反非凌,這三類分支都是短期分支,針對(duì)他們的工作內(nèi)容完成后荆针,一般都要進(jìn)行刪除敞嗡。工作內(nèi)容完成的標(biāo)識(shí)有兩個(gè):開發(fā)完成、合并完成航背,缺一不可喉悴。
我們使用sourcetree來(lái)實(shí)際演示一下
三類臨時(shí)性分支中,hotfix和release的結(jié)果都要合并到master和develop中玖媚,為什么箕肃?因?yàn)樗鼈兊男薷慕Y(jié)果持續(xù)影響這后續(xù)的開發(fā)和維護(hù),必須合并以保證代碼的一致性今魔。 如果你沒有認(rèn)識(shí)到這個(gè)特性很有用勺像,那是因?yàn)槟愕拈_發(fā)工作還沒有復(fù)雜到一個(gè)程度,一個(gè)必須要規(guī)避代碼干擾错森、保證并行推進(jìn)的程度咏删。 對(duì)于小型項(xiàng)目和團(tuán)隊(duì)來(lái)說(shuō),基于GIT的中心式協(xié)作模型和特性分支模型就足夠了问词;GitFlow模型適合中型督函、大型項(xiàng)目和團(tuán)隊(duì)。
7.參考文獻(xiàn)
參考一:Git工作流指南
8.更多討論
1.這個(gè)工作流是必須的嗎?by雪飛
不辰狡,這只是一個(gè)開發(fā)流程的規(guī)范锋叨,你不按照他照樣可以開發(fā),比如咱們官網(wǎng)的開發(fā)流程就不是這樣宛篇。
2.那咱們官網(wǎng)開發(fā)流程是什么娃磺。 by婷婷
先理一下葡萄藤的開發(fā)流程;
三個(gè)文件夾:后端叫倍,前臺(tái)偷卧,后臺(tái),前后臺(tái)文件夾里有各自的branch吆倦,tag听诸,trunk,trunk放主要開發(fā)的版本蚕泽,tag用來(lái)放進(jìn)行功能升級(jí)后的版本號(hào)晌梨,在wiki上登記發(fā)布功能,版本號(hào)须妻,回滾版本號(hào)仔蝌,各個(gè)負(fù)責(zé)人名字,截圖發(fā)郵件給運(yùn)維發(fā)布到測(cè)試環(huán)境荒吏,經(jīng)過(guò)測(cè)試人員測(cè)試通過(guò)后發(fā)布到線上環(huán)境敛惊。
3.trunk到底放著那個(gè)版本?by yg
大佬解釋:trunk是正在玩的游戲绰更,tag是 保存的游戲記錄
視頻鏈接:https://pan.baidu.com/s/1jHE1jls 密碼: 8zrt
ppt鏈接:https://ptteng.github.io/PPT/PPT/css-02-What%20is%20Gitflow%20Workflow-yanggang.html#/
今天的分享就到這里啦瞧挤,歡迎大家點(diǎn)贊、轉(zhuǎn)發(fā)动知、留言皿伺、拍磚~
------------------------------------------------------------------------------------------------------------------------
技能樹.IT修真院
“我們相信人人都可以成為一個(gè)工程師员辩,現(xiàn)在開始盒粮,找個(gè)師兄,帶你入門奠滑,掌控自己學(xué)習(xí)的節(jié)奏丹皱,學(xué)習(xí)的路上不再迷茫”宋税。
這里是技能樹.IT修真院摊崭,成千上萬(wàn)的師兄在這里找到了自己的學(xué)習(xí)路線,學(xué)習(xí)透明化杰赛,成長(zhǎng)可見化呢簸,師兄1對(duì)1免費(fèi)指導(dǎo)。快來(lái)與我一起學(xué)習(xí)吧?根时!