GitHub 系列之「團隊合作利器 Branch」

目錄:

Git 相比于 SVN 最強大的一個地方就在于「分支」,Git 的分支操作簡直不要太方便,而實際項目開發中團隊合作最依賴的莫過于分支了,關于分支前面的系列也提到過,但是本篇會詳細講述什么是分支、分支的具體操作以及實際項目開發中到底是怎么依賴分支來進行團隊合作的。

1.什么是分支?

我知道讀者中肯定有些人對分支這個概念比較模糊,其實你們可以這么理解,你們幾個人一起去旅行,中間走到一個三岔口,每條路可能有不同的風景,你們約定 3 天之后在某地匯聚,然后各自出發了。而這三條分叉路就可以理解成你們各自的分支,而等你們匯聚的時候相當于把你們的分支進行了合并。

2.分支的常用操作

通常我們默認都會有一個主分支叫 master ,下面我們先來看下關于分支的一些基本操作:

新建一個叫 develop 的分支

git branch develop    

這里稍微提醒下大家,新建分支的命令是基于當前所在分支的基礎上進行的,即以上是基于 mater 分支新建了一個叫做 develop 的分支,此時 develop 分支跟 master 分支的內容完全一樣。如果你有 A、B、C三個分支,三個分支是三位同學的,各分支內容不一樣,如果你當前是在 B 分支,如果執行新建分支命令,則新建的分支內容跟 B 分支是一樣的,同理如果當前所在是 C 分支,那就是基于 C 分支基礎上新建的分支。

切換到 develop 分支

git checkout develop    

如果把以上兩步合并,即新建并且自動切換到 develop 分支:

git checkout -b develop    

把 develop 分支推送到遠程倉庫

git push origin develop    

如果你遠程的分支想取名叫 develop2 ,那執行以下代碼:

git push origin develop:develop2    

但是強烈不建議這樣,這會導致很混亂,很難管理,所以建議本地分支跟遠程分支名要保持一致。

查看本地分支列表

git branch    

查看遠程分支列表

git branch -r    

刪除本地分支

git branch -d develop    

git branch -D develop (強制刪除)    

刪除遠程分支

git push origin :develop    

如果遠程分支有個 develop ,而本地沒有,你想把遠程的 develop 分支遷到本地:

git checkout develop origin/develop    

同樣的把遠程分支遷到本地順便切換到該分支:

git checkout -b develop origin/develop    

3.基本的團隊協作流程

一般來說,如果你是一個人開發,可能只需要 master、develop 兩個分支就 ok 了,平時開發在 develop 分支進行,開發完成之后,發布之前合并到 master 分支,這個流程沒啥大問題。

如果你是 3、5 個人,那就不一樣了,有人說也沒多大問題啊,直接可以新建 A、B、C 三個人的分支啊,每人各自開發各自的分支,然后開發完成之后再逐步合并到 master 分支。然而現實卻是,你正在某個分支開發某個功能呢,這時候突然發現線上有一個很嚴重的 bug ,不得不停下手頭的工作優先處理 bug ,而且很多時候多人協作下如果沒有一個規范,很容易產生問題,所以多人協作下的分支管理規范很重要,就跟代碼規范一樣重要,以下就跟大家推薦一種我們內部在使用的一種分支管理流程 Git Flow。

4.Git Flow

我們都知道, 在 git 的分支功能相對 svn 確實方便許多,而且也非常推薦使用分支來做開發. 我的做法是每個項目都有2個分支, master 和 develop. master 分支是主分支, 保證程序有一個 穩定版本, develop 則是開發用的分支, 幾乎所有的功能開發, bug 修復都在這個分支上, 完成后 再合并回 master.

但是情況并不是這么簡單. 有時當我們正在開發一個功能, 但程序突然出現 bug 需要及時去修復的時候, 這時要切回 master 分支, 并基于它創建一個 hotfix 分支. 有時我們在開發一個功能時, 需要停下來去開發另一個功能. 而且所有這些問題都出現 的時候, 發布也會成為比較棘手問題.

也就是說, git branch 功能很強大,但是沒有一套模型告訴我們應該怎樣在開發的時候善用 這些分支。于是有人就整理出了一套比較好的方案 A successful Git branching model, 今天我們就一起來學習下這套方案.

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

第一次看上面那個圖是不是一臉懵逼?跟我當時一樣,不急,我來用簡單的話給你們解釋下。

一般開發來說,大部分情況下都會擁有兩個分支 master 和 develop,他們的職責分別是:

master:永遠處在即將發布(production-ready)狀態

develop:最新的開發狀態

確切的說 master、develop 分支大部分情況下都會保持一致,只有在上線前的測試階段 develop 比 master 的代碼要多,一旦測試沒問題,準備發布了,這時候會將 develop 合并到 master 上。

但是我們發布之后又會進行下一版本的功能開發,開發中間可能又會遇到需要緊急修復 bug ,一個功能開發完成之后突然需求變動了等情況,所以 Git Flow 除了以上 master 和 develop 兩個主要分支以外,還提出了以下三個輔助分支:

feature: 開發新功能的分支, 基于 develop, 完成后 merge 回 develop

release: 準備要發布版本的分支, 用來修復 bug,基于 develop,完成后 merge 回 develop 和 master

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

什么意思呢?

舉個例子,假設我們已經有 master 和 develop 兩個分支了,這個時候我們準備做一個功能 A,第一步我們要做的,就是基于 develop 分支新建個分支:

git branch feature/A    

看到了吧,其實就是一個規范,規定了所有開發的功能分支都以 feature 為前綴。

但是這個時候做著做著發現線上有一個緊急的 bug 需要修復,那趕緊停下手頭的工作,立刻切換到 master 分支,然后再此基礎上新建一個分支:

git branch hotfix/B    

代表新建了一個緊急修復分支,修復完成之后直接合并到 develop 和 master ,然后發布。

然后再切回我們的 feature/A 分支繼續著我們的開發,如果開發完了,那么合并回 develop 分支,然后在 develop 分支屬于測試環境,跟后端對接并且測試的差不多了,感覺可以發布到正式環境了,這個時候再新建一個 release 分支:

git branch release/1.0    

這個時候所有的 api、數據等都是正式環境,然后在這個分支上進行最后的測試,發現 bug 直接進行修改,直到測試 ok 達到了發布的標準,最后把該分支合并到 develop 和 master 然后進行發布。

以上就是 Git Flow 的概念與大概流程,看起來很復雜,但是對于人數比較多的團隊協作現實開發中確實會遇到這么復雜的情況,是目前很流行的一套分支管理流程,但是有人會問每次都要各種操作,合并來合并去,有點麻煩,哈哈,這點 Git Flow 早就想到了,為此還專門推出了一個 Git Flow 的工具,并且是開源的:

GitHub 開源地址:https://github.com/nvie/gitflow

簡單點來說,就是這個工具幫我們省下了很多步驟,比如我們當前處于 master 分支,如果想要開發一個新的功能,第一步切換到 develop 分支,第二步新建一個以 feature 開頭的分支名,有了 Git Flow 直接如下操作完成了:

git flow feature start A    

這個分支完成之后,需要合并到 develop 分支,然而直接進行如下操作就行:

git flow feature finish A    

如果是 hotfix 或者 release 分支甚至會自動幫你合并到 develop、master 兩個分支。

想必大家已經了解了這個工具的具體作用,具體安裝與用法如下:

A successful Git branching model

主要分支

  • **master: **永遠處在即將發布(production-ready)狀態
  • **develop: **最新的開發狀態

輔助分支

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

接著它會問你一系列的問題,蛋定!盡量使用它的默認值就好了:

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? []

完成后當前所在分支就變成 develop. 任何開發都必須從 develop 開始:

git flow feature start some_awesome_feature

完成功能開發之后:

git flow feature finish some_awesome_feature

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

將一個 feature 分支推到遠程服務器:

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

當你的功能點都完成時(需要發布新版本了),就基于develop創建一個發布(release)分支,然后升級版本號并在最后發布日期前把Bug Fix掉吧:

$ git flow release start v0.1.0

當你在完成(finish)一個發布分支時,它會把你所作的修改合并到master分支,同時合并回develop分支,所以,你不需要擔心你的master分支比develop分支更加超前。

最后一件讓git-flow顯得威武的事情是它處理熱修復(即時的BugFix)的能力,你可以像其他分支一樣地創建和完成一個熱修復分支,區別是它基于master分支,因此你可以在產品出現問題時快速修復,然后通過”finish”命令把修改合并回master和develop分支。

注:文章轉載stormzhang.
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,250評論 6 530
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 97,923評論 3 413
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,041評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,475評論 1 308
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,253評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,801評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,882評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,023評論 0 285
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,530評論 1 331
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,494評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,639評論 1 366
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,177評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,890評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,289評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,552評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,242評論 3 389
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,626評論 2 370

推薦閱讀更多精彩內容

  • 突然發現說,說話,多說幾句話,能解決很多問題,并且要好好說,用心,思考著說,要明白說他的意義,更要知道他能給你帶...
    李紅燁閱讀 123評論 0 0