GitHub 系列之「團(tuán)隊(duì)合作利器 Branch」

目錄:

Git 相比于 SVN 最強(qiáng)大的一個(gè)地方就在于「分支」集嵌,Git 的分支操作簡(jiǎn)直不要太方便呵曹,而實(shí)際項(xiàng)目開(kāi)發(fā)中團(tuán)隊(duì)合作最依賴(lài)的莫過(guò)于分支了袒炉,關(guān)于分支前面的系列也提到過(guò)肌括,但是本篇會(huì)詳細(xì)講述什么是分支诅福、分支的具體操作以及實(shí)際項(xiàng)目開(kāi)發(fā)中到底是怎么依賴(lài)分支來(lái)進(jìn)行團(tuán)隊(duì)合作的沈条。

1.什么是分支需忿?

我知道讀者中肯定有些人對(duì)分支這個(gè)概念比較模糊,其實(shí)你們可以這么理解拍鲤,你們幾個(gè)人一起去旅行贴谎,中間走到一個(gè)三岔口,每條路可能有不同的風(fēng)景季稳,你們約定 3 天之后在某地匯聚擅这,然后各自出發(fā)了。而這三條分叉路就可以理解成你們各自的分支景鼠,而等你們匯聚的時(shí)候相當(dāng)于把你們的分支進(jìn)行了合并仲翎。

2.分支的常用操作

通常我們默認(rèn)都會(huì)有一個(gè)主分支叫 master 痹扇,下面我們先來(lái)看下關(guān)于分支的一些基本操作:

新建一個(gè)叫 develop 的分支

git branch develop    

這里稍微提醒下大家,新建分支的命令是基于當(dāng)前所在分支的基礎(chǔ)上進(jìn)行的溯香,即以上是基于 mater 分支新建了一個(gè)叫做 develop 的分支鲫构,此時(shí) develop 分支跟 master 分支的內(nèi)容完全一樣。如果你有 A玫坛、B结笨、C三個(gè)分支,三個(gè)分支是三位同學(xué)的湿镀,各分支內(nèi)容不一樣炕吸,如果你當(dāng)前是在 B 分支,如果執(zhí)行新建分支命令勉痴,則新建的分支內(nèi)容跟 B 分支是一樣的赫模,同理如果當(dāng)前所在是 C 分支,那就是基于 C 分支基礎(chǔ)上新建的分支蒸矛。

切換到 develop 分支

git checkout develop    

如果把以上兩步合并瀑罗,即新建并且自動(dòng)切換到 develop 分支:

git checkout -b develop    

把 develop 分支推送到遠(yuǎn)程倉(cāng)庫(kù)

git push origin develop    

如果你遠(yuǎn)程的分支想取名叫 develop2 ,那執(zhí)行以下代碼:

git push origin develop:develop2    

但是強(qiáng)烈不建議這樣雏掠,這會(huì)導(dǎo)致很混亂斩祭,很難管理,所以建議本地分支跟遠(yuǎn)程分支名要保持一致乡话。

查看本地分支列表

git branch    

查看遠(yuǎn)程分支列表

git branch -r    

刪除本地分支

git branch -d develop    

git branch -D develop (強(qiáng)制刪除)    

刪除遠(yuǎn)程分支

git push origin :develop    

如果遠(yuǎn)程分支有個(gè) develop 停忿,而本地沒(méi)有,你想把遠(yuǎn)程的 develop 分支遷到本地:

git checkout develop origin/develop    

同樣的把遠(yuǎn)程分支遷到本地順便切換到該分支:

git checkout -b develop origin/develop    

3.基本的團(tuán)隊(duì)協(xié)作流程

一般來(lái)說(shuō)蚊伞,如果你是一個(gè)人開(kāi)發(fā),可能只需要 master吮铭、develop 兩個(gè)分支就 ok 了时迫,平時(shí)開(kāi)發(fā)在 develop 分支進(jìn)行,開(kāi)發(fā)完成之后谓晌,發(fā)布之前合并到 master 分支掠拳,這個(gè)流程沒(méi)啥大問(wèn)題。

如果你是 3纸肉、5 個(gè)人溺欧,那就不一樣了,有人說(shuō)也沒(méi)多大問(wèn)題啊柏肪,直接可以新建 A姐刁、B、C 三個(gè)人的分支啊烦味,每人各自開(kāi)發(fā)各自的分支聂使,然后開(kāi)發(fā)完成之后再逐步合并到 master 分支。然而現(xiàn)實(shí)卻是,你正在某個(gè)分支開(kāi)發(fā)某個(gè)功能呢柏靶,這時(shí)候突然發(fā)現(xiàn)線上有一個(gè)很?chē)?yán)重的 bug 弃理,不得不停下手頭的工作優(yōu)先處理 bug ,而且很多時(shí)候多人協(xié)作下如果沒(méi)有一個(gè)規(guī)范屎蜓,很容易產(chǎn)生問(wèn)題痘昌,所以多人協(xié)作下的分支管理規(guī)范很重要,就跟代碼規(guī)范一樣重要炬转,以下就跟大家推薦一種我們內(nèi)部在使用的一種分支管理流程 Git Flow辆苔。

4.Git Flow

我們都知道, 在 git 的分支功能相對(duì) svn 確實(shí)方便許多,而且也非常推薦使用分支來(lái)做開(kāi)發(fā). 我的做法是每個(gè)項(xiàng)目都有2個(gè)分支, master 和 develop. master 分支是主分支, 保證程序有一個(gè) 穩(wěn)定版本, develop 則是開(kāi)發(fā)用的分支, 幾乎所有的功能開(kāi)發(fā), bug 修復(fù)都在這個(gè)分支上, 完成后 再合并回 master.

但是情況并不是這么簡(jiǎn)單. 有時(shí)當(dāng)我們正在開(kāi)發(fā)一個(gè)功能, 但程序突然出現(xiàn) bug 需要及時(shí)去修復(fù)的時(shí)候, 這時(shí)要切回 master 分支, 并基于它創(chuàng)建一個(gè) hotfix 分支. 有時(shí)我們?cè)陂_(kāi)發(fā)一個(gè)功能時(shí), 需要停下來(lái)去開(kāi)發(fā)另一個(gè)功能. 而且所有這些問(wèn)題都出現(xiàn) 的時(shí)候, 發(fā)布也會(huì)成為比較棘手問(wèn)題.

也就是說(shuō), git branch 功能很強(qiáng)大返吻,但是沒(méi)有一套模型告訴我們應(yīng)該怎樣在開(kāi)發(fā)的時(shí)候善用 這些分支姑子。于是有人就整理出了一套比較好的方案 A successful Git branching model, 今天我們就一起來(lái)學(xué)習(xí)下這套方案.

準(zhǔn)確的說(shuō) Git Flow 是一種比較成熟的分支管理流程,我們先看一張圖能清晰的描述他整個(gè)的工作流程:

第一次看上面那個(gè)圖是不是一臉懵逼测僵?跟我當(dāng)時(shí)一樣街佑,不急,我來(lái)用簡(jiǎn)單的話給你們解釋下捍靠。

一般開(kāi)發(fā)來(lái)說(shuō)沐旨,大部分情況下都會(huì)擁有兩個(gè)分支 master 和 develop,他們的職責(zé)分別是:

master:永遠(yuǎn)處在即將發(fā)布(production-ready)狀態(tài)

develop:最新的開(kāi)發(fā)狀態(tài)

確切的說(shuō) master榨婆、develop 分支大部分情況下都會(huì)保持一致磁携,只有在上線前的測(cè)試階段 develop 比 master 的代碼要多,一旦測(cè)試沒(méi)問(wèn)題良风,準(zhǔn)備發(fā)布了谊迄,這時(shí)候會(huì)將 develop 合并到 master 上。

但是我們發(fā)布之后又會(huì)進(jìn)行下一版本的功能開(kāi)發(fā)烟央,開(kāi)發(fā)中間可能又會(huì)遇到需要緊急修復(fù) bug 统诺,一個(gè)功能開(kāi)發(fā)完成之后突然需求變動(dòng)了等情況,所以 Git Flow 除了以上 master 和 develop 兩個(gè)主要分支以外疑俭,還提出了以下三個(gè)輔助分支:

feature: 開(kāi)發(fā)新功能的分支, 基于 develop, 完成后 merge 回 develop

release: 準(zhǔn)備要發(fā)布版本的分支, 用來(lái)修復(fù) bug粮呢,基于 develop,完成后 merge 回 develop 和 master

hotfix: 修復(fù) master 上的問(wèn)題, 等不及 release 版本就必須馬上上線. 基于 master, 完成后 merge 回 master 和 develop

什么意思呢钞艇?

舉個(gè)例子啄寡,假設(shè)我們已經(jīng)有 master 和 develop 兩個(gè)分支了,這個(gè)時(shí)候我們準(zhǔn)備做一個(gè)功能 A哩照,第一步我們要做的挺物,就是基于 develop 分支新建個(gè)分支:

git branch feature/A    

看到了吧,其實(shí)就是一個(gè)規(guī)范葡秒,規(guī)定了所有開(kāi)發(fā)的功能分支都以 feature 為前綴姻乓。

但是這個(gè)時(shí)候做著做著發(fā)現(xiàn)線上有一個(gè)緊急的 bug 需要修復(fù)嵌溢,那趕緊停下手頭的工作,立刻切換到 master 分支蹋岩,然后再此基礎(chǔ)上新建一個(gè)分支:

git branch hotfix/B    

代表新建了一個(gè)緊急修復(fù)分支赖草,修復(fù)完成之后直接合并到 develop 和 master ,然后發(fā)布剪个。

然后再切回我們的 feature/A 分支繼續(xù)著我們的開(kāi)發(fā)秧骑,如果開(kāi)發(fā)完了,那么合并回 develop 分支扣囊,然后在 develop 分支屬于測(cè)試環(huán)境乎折,跟后端對(duì)接并且測(cè)試的差不多了,感覺(jué)可以發(fā)布到正式環(huán)境了侵歇,這個(gè)時(shí)候再新建一個(gè) release 分支:

git branch release/1.0    

這個(gè)時(shí)候所有的 api骂澄、數(shù)據(jù)等都是正式環(huán)境,然后在這個(gè)分支上進(jìn)行最后的測(cè)試惕虑,發(fā)現(xiàn) bug 直接進(jìn)行修改坟冲,直到測(cè)試 ok 達(dá)到了發(fā)布的標(biāo)準(zhǔn),最后把該分支合并到 develop 和 master 然后進(jìn)行發(fā)布溃蔫。

以上就是 Git Flow 的概念與大概流程健提,看起來(lái)很復(fù)雜,但是對(duì)于人數(shù)比較多的團(tuán)隊(duì)協(xié)作現(xiàn)實(shí)開(kāi)發(fā)中確實(shí)會(huì)遇到這么復(fù)雜的情況伟叛,是目前很流行的一套分支管理流程私痹,但是有人會(huì)問(wèn)每次都要各種操作,合并來(lái)合并去统刮,有點(diǎn)麻煩紊遵,哈哈,這點(diǎn) Git Flow 早就想到了侥蒙,為此還專(zhuān)門(mén)推出了一個(gè) Git Flow 的工具癞蚕,并且是開(kāi)源的:

GitHub 開(kāi)源地址:https://github.com/nvie/gitflow

簡(jiǎn)單點(diǎn)來(lái)說(shuō),就是這個(gè)工具幫我們省下了很多步驟辉哥,比如我們當(dāng)前處于 master 分支,如果想要開(kāi)發(fā)一個(gè)新的功能,第一步切換到 develop 分支,第二步新建一個(gè)以 feature 開(kāi)頭的分支名派诬,有了 Git Flow 直接如下操作完成了:

git flow feature start A    

這個(gè)分支完成之后乌妙,需要合并到 develop 分支,然而直接進(jìn)行如下操作就行:

git flow feature finish A    

如果是 hotfix 或者 release 分支甚至?xí)詣?dòng)幫你合并到 develop缓窜、master 兩個(gè)分支。

想必大家已經(jīng)了解了這個(gè)工具的具體作用,具體安裝與用法如下:

A successful Git branching model

主要分支

  • **master: **永遠(yuǎn)處在即將發(fā)布(production-ready)狀態(tài)
  • **develop: **最新的開(kāi)發(fā)狀態(tài)

輔助分支

  • feature: 開(kāi)發(fā)新功能的分支, 基于 develop, 完成后 merge 回 develop
  • release: 準(zhǔn)備要發(fā)布版本的分支, 用來(lái)修復(fù) bug. 基于 develop, 完成后 merge 回 develop 和 master
  • hotfix:修復(fù) master 上的問(wèn)題, 等不及 release 版本就必須馬上上線. 基于 master, 完成后 merge 回 master 和 develop
    作者還提供了 git-flow 命令工具:
$ git flow init

接著它會(huì)問(wèn)你一系列的問(wèn)題捂人,蛋定御雕!盡量使用它的默認(rèn)值就好了:

No branches exist yet. Base branches must be created now.
Branch name for production releases: [master]
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? []

完成后當(dāng)前所在分支就變成 develop. 任何開(kāi)發(fā)都必須從 develop 開(kāi)始:

git flow feature start some_awesome_feature

完成功能開(kāi)發(fā)之后:

git flow feature finish some_awesome_feature

該命令將會(huì)把feature/some_awesome_feature合并到develope分支,然后刪除功能(feature)分支滥搭。

將一個(gè) feature 分支推到遠(yuǎn)程服務(wù)器:

git flow feature publish some_awesome_feature
或者
git push origin feature/some_awesome_feature

當(dāng)你的功能點(diǎn)都完成時(shí)(需要發(fā)布新版本了)酸纲,就基于develop創(chuàng)建一個(gè)發(fā)布(release)分支,然后升級(jí)版本號(hào)并在最后發(fā)布日期前把Bug Fix掉吧:

$ git flow release start v0.1.0

當(dāng)你在完成(finish)一個(gè)發(fā)布分支時(shí)瑟匆,它會(huì)把你所作的修改合并到master分支闽坡,同時(shí)合并回develop分支,所以愁溜,你不需要擔(dān)心你的master分支比develop分支更加超前疾嗅。

最后一件讓git-flow顯得威武的事情是它處理熱修復(fù)(即時(shí)的BugFix)的能力,你可以像其他分支一樣地創(chuàng)建和完成一個(gè)熱修復(fù)分支冕象,區(qū)別是它基于master分支代承,因此你可以在產(chǎn)品出現(xiàn)問(wèn)題時(shí)快速修復(fù),然后通過(guò)”finish”命令把修改合并回master和develop分支渐扮。

注:文章轉(zhuǎn)載stormzhang.
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末论悴,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子席爽,更是在濱河造成了極大的恐慌意荤,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件只锻,死亡現(xiàn)場(chǎng)離奇詭異玖像,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)齐饮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)捐寥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人祖驱,你說(shuō)我怎么就攤上這事握恳。” “怎么了捺僻?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵乡洼,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我匕坯,道長(zhǎng)束昵,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任葛峻,我火速辦了婚禮锹雏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘术奖。我一直安慰自己礁遵,他們只是感情好轻绞,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著佣耐,像睡著了一般政勃。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上晰赞,一...
    開(kāi)封第一講書(shū)人閱讀 48,970評(píng)論 1 284
  • 那天稼病,我揣著相機(jī)與錄音,去河邊找鬼掖鱼。 笑死然走,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的戏挡。 我是一名探鬼主播芍瑞,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼褐墅!你這毒婦竟也來(lái)了拆檬?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤妥凳,失蹤者是張志新(化名)和其女友劉穎竟贯,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體逝钥,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡屑那,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了艘款。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片持际。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖哗咆,靈堂內(nèi)的尸體忽然破棺而出蜘欲,到底是詐尸還是另有隱情,我是刑警寧澤晌柬,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布姥份,位于F島的核電站,受9級(jí)特大地震影響年碘,放射性物質(zhì)發(fā)生泄漏殿衰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一盛泡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧娱颊,春花似錦傲诵、人聲如沸凯砍。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)悟衩。三九已至,卻和暖如春栓拜,著一層夾襖步出監(jiān)牢的瞬間座泳,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工幕与, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留挑势,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓啦鸣,卻偏偏與公主長(zhǎng)得像潮饱,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子诫给,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

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

  • 宇晴君閱讀 114評(píng)論 0 0
  • 突然發(fā)現(xiàn)說(shuō)中狂,說(shuō)話凫碌,多說(shuō)幾句話,能解決很多問(wèn)題胃榕,并且要好好說(shuō)盛险,用心,思考著說(shuō)勤晚,要明白說(shuō)他的意義枉层,更要知道他能給你帶...
    李紅燁閱讀 114評(píng)論 0 0