目錄:
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分支渐扮。