1.前言
記得剛工作的時(shí)候根本不知道什么是版本管理工具抽诉,有一次和別人聊天冕广,人家問(wèn)你們公司代碼用什么版本管理工具叠赐?我說(shuō)啥是版本管理工具,我們一般用U盤拷貝五鲫,然后人家就顧左右而言他了溺职。后來(lái)我知道了有個(gè)東西叫SVN,后來(lái)又知道了還有個(gè)東西叫Git。所以說(shuō)剛畢業(yè)的同學(xué)一定要優(yōu)先進(jìn)入專業(yè)的大公司位喂,就像年輕時(shí)候應(yīng)該去大城市闖兩年一樣浪耘,眼界以及你遇到的牛人會(huì)大大加快你以后成功的進(jìn)程。
2.概述
本文主要是介紹一種在具體實(shí)踐中使用Git來(lái)管理項(xiàng)目開發(fā)的一種成功的方式忆某,其實(shí)主要思想來(lái)源于這篇文章《 A successful Git branching model》点待,網(wǎng)上大部分教程都是致敬這篇文章。
3.Git的基本使用方法
關(guān)于git的基本教程弃舒,強(qiáng)烈建議閱讀廖雪峰老師的Git教程癞埠,對(duì)初學(xué)者非常友好。
4.使用Git管理項(xiàng)目的方式
在實(shí)際開發(fā)中如何使用Git沒有一個(gè)標(biāo)準(zhǔn)答案聋呢,使用方式也是各式各樣苗踪,很多基本上都是把Git當(dāng)SVN來(lái)用。下面介紹的是一種經(jīng)過(guò)實(shí)踐的運(yùn)行比較良好的管理方式削锰。
4.1 主分支
實(shí)際開發(fā)中通铲,一個(gè)倉(cāng)庫(kù)(通常只放一個(gè)項(xiàng)目)主要存在兩條主分支:master與develop分支。這個(gè)兩個(gè)分支的生命周期是整個(gè)項(xiàng)目周期器贩。就是說(shuō)颅夺,自創(chuàng)建出來(lái)就不會(huì)刪除,會(huì)隨著項(xiàng)目的不斷開發(fā)不斷的往里面添加代碼蛹稍。master分支是創(chuàng)建git倉(cāng)庫(kù)時(shí)自動(dòng)生成的吧黄,隨即我們就會(huì)從master分支創(chuàng)建develop分支,如下圖所示唆姐。
master:這個(gè)分支最為穩(wěn)定拗慨,這個(gè)分支代表項(xiàng)目處于可發(fā)布的狀態(tài)。
例如王二狗向master分支合并了代碼,那就意味著王二狗完成了此項(xiàng)目的一個(gè)待發(fā)布的版本赵抢,項(xiàng)目經(jīng)理可以認(rèn)為剧蹂,此項(xiàng)目已經(jīng)準(zhǔn)備好發(fā)布新版本了。所以master分支不是隨隨便便就可以簽入代碼的地方烦却,只有計(jì)劃發(fā)布的版本功能在develop分支上全部完成宠叼,而且測(cè)試沒有問(wèn)題了才會(huì)合并到master上。develop:作為開發(fā)的分支短绸,平行于master分支车吹。
例如王二狗要開發(fā)一個(gè)注冊(cè)功能,那么他就會(huì)從develop分支上創(chuàng)建一個(gè)feature分支 fb-register(后面講)醋闭,在fb-register分支上將注冊(cè)功能完成后窄驹,將代碼合并到develop分支上。這個(gè)fb-register就完成了它的使命证逻,可以刪除了乐埠。項(xiàng)目經(jīng)理看王二狗效率很高啊,于是:“二狗你順帶把登錄功能也做了吧”囚企。二狗心中暗暗罵道:日了個(gè)狗的丈咐,但是任務(wù)還的正常做,二狗就會(huì)重復(fù)上面的步驟:從develop分支上新創(chuàng)建一個(gè)名為fb-login的分支龙宏,喝杯咖啡繼續(xù)開發(fā)棵逊,1個(gè)小時(shí)后登錄功能寫好了,二狗又會(huì)將這個(gè)分支的代碼合并回develop分支后將其刪除银酗。
通過(guò)以上分析可以發(fā)現(xiàn)辆影,我們可以使用Git hook 腳本自動(dòng)發(fā)布發(fā)布新的版本,具體就是每當(dāng)有代碼從develop分支合并到master分支的時(shí)候黍特,腳本就會(huì)自動(dòng)觸發(fā)蛙讥,編譯發(fā)布新的版本。
4.2 支持分支
這些分支都是為了程序員協(xié)同開發(fā)灭衷,以及應(yīng)對(duì)項(xiàng)目的各種需求而存在的次慢。這些分支都是為了解決某一個(gè)具體的問(wèn)題而設(shè)立,當(dāng)這個(gè)問(wèn)題解決后翔曲,代碼會(huì)合并回主分支develop或者master后刪除迫像,一般我們會(huì)人為分出三種分支。
-
Feature branches:這種分支和我們程序員日常開發(fā)最為密切瞳遍,稱作功能分支闻妓。
必須從develop分支創(chuàng)建,完成后合并回develop分支
如下圖所示傅蹂。
具體事例可以參考上面王二狗完成登錄注冊(cè)功能時(shí)的做法纷闺。 Release branches:這個(gè)分支用來(lái)分布新版本。
從develop分支創(chuàng)建份蝴,完成后合并回develop與master分支犁功。
這個(gè)分支上可以做一些非常小的bug修復(fù),當(dāng)然婚夫,你也可以禁止在這個(gè)分支做任何bug的修復(fù)工作浸卦,而只做版本發(fā)布的相關(guān)操作,例如設(shè)置版本號(hào)等操作案糙,那樣的話那些發(fā)現(xiàn)的小bug就必須放到下一個(gè)版本修復(fù)了限嫌。如果在這個(gè)分支上發(fā)現(xiàn)了大bug,那么也絕對(duì)不能在這個(gè)分支上改时捌,需要Featrue分支上改怒医,走正常的流程。
實(shí)例:王二狗開發(fā)完了登錄注冊(cè)功能后決定發(fā)一個(gè)版本V0.1奢讨,那么他先從develop分支上創(chuàng)建一個(gè)Release 分支release-v0.1稚叹,然后二狗在這個(gè)分支上把版本號(hào)等做了修改。正準(zhǔn)備編譯發(fā)布了拿诸,項(xiàng)目經(jīng)理說(shuō):“二狗啊扒袖,你那個(gè)登錄框好像向右偏移量1個(gè)像素,你可以調(diào)一下嗎亩码?”二狗心中有暗暗罵道:日了個(gè)狗季率,但是。描沟。飒泻。你們懂得,功能還的正常改啊掏。不過(guò)二狗發(fā)現(xiàn)這個(gè)bug特別小蠢络,對(duì)項(xiàng)目其他部分不造成不可預(yù)知的問(wèn)題,所以直接在release分支上改了迟蜜,然后愉快的發(fā)布了版本1.0.版本上線后刹孔,二狗將這個(gè)分支分別合并回了develop與master分支,然后刪除了這個(gè)分支娜睛。-
Hotfix branches:這個(gè)分支主要為修復(fù)線上特別緊急的bug準(zhǔn)備的髓霞。
必須從master分支創(chuàng)建,完成后合并回develop與master分支畦戒。
如下圖所示:
這個(gè)分支主要是解決線上版本的緊急bug修復(fù)的方库,例如突然版本V0.1上有一個(gè)致命bug,必須修復(fù)障斋。那么我們就可以從master 分支上發(fā)布這個(gè)版本那個(gè)時(shí)間點(diǎn) 例如 tag v0.1(一般代碼發(fā)布后會(huì)及時(shí)在master上打tag)纵潦,來(lái)創(chuàng)建一個(gè) hotfix-v0.1.1的分支徐鹤,然后在這個(gè)分支上改bug,然后發(fā)布新的版本邀层。最后將代碼合并回develop與master分支返敬。
實(shí)例:某天夜里二狗正在和女朋友嘿咻呢,突然項(xiàng)目經(jīng)理打來(lái)電話:“二狗啊寥院,線上出了個(gè)大問(wèn)題劲赠,大量用戶無(wú)法登錄,客服電話已經(jīng)被打爆了秸谢,你緊急處理一下”凛澎。二狗心中默默罵道:日了個(gè)狗,然后就爬起來(lái)去改代碼了估蹄。二狗先找到master分支上tag v0.1 的地方塑煎,然后新建了hotfix-v0.1.1 分支,默默的修bug去了臭蚁。經(jīng)過(guò)一個(gè)多小時(shí)的奮戰(zhàn)轧叽,終于修復(fù)了,然后二狗改了版本號(hào)刊棕,發(fā)布了新版本炭晒。二狗將這個(gè)分支分別合并回了develop與master分支后刪除了這個(gè)分支。終于搞定了甥角,回頭看看床上的女票已經(jīng)進(jìn)入了夢(mèng)鄉(xiāng)网严,二狗賊心不死,上前挑逗嗤无,此刻女票將滿腹怨氣集于一點(diǎn)震束,使出凌空一腳將其登于床下,隨后甩一枕于二狗当犯,二狗會(huì)意垢村,趨客廳,抱枕臥于沙發(fā)嚎卫。嘉栓。。
4.3 總結(jié)圖
上面的講解最后匯成一張圖
5. 總結(jié)
希望廣大程序員不要有王二狗的悲慘遭遇拓诸,最后希望廣大“王二狗媳婦”可以理解廣大“王二狗”的苦衷侵佃。