Git 在團隊中的最佳實踐--如何正確使用Git Flow

我們已經從SVN 切換到Git很多年了,現在幾乎所有的項目都在使用Github管理, 本篇文章講一下為什么使用Git, 以及如何在團隊中正確使用。

Git的優點

Git的優點很多,但是這里只列出我認為非常突出的幾點。

由于是分布式,所有本地庫包含了遠程庫的所有內容。

優秀的分支模型,打分支以及合并分支,機器方便。

快速,在這個時間就是金錢的時代,Git由于代碼都在本地,打分支和合并分支機器快速,使用個SVN的能深刻體會到這種優勢。

感興趣的,可以去看一下Git本身的設計,內在的架構體現了很多的優勢,不愧是出資天才程序員Linus (Linux之父) 之手

版本管理的挑戰

雖然有這么優秀的版本管理工具,但是我們面對版本管理的時候,依然有非常大得挑戰,我們都知道大家工作在同一個倉庫上,那么彼此的代碼協作必然帶來很多問題和挑戰,如下:

如何開始一個Feature的開發,而不影響別的Feature?

由于很容易創建新分支,分支多了如何管理,時間久了,如何知道每個分支是干什么的?

哪些分支已經合并回了主干?

如何進行Release的管理?開始一個Release的時候如何凍結Feature, 如何在Prepare Release的時候,開發人員可以繼續開發新的功能?

線上代碼出Bug了,如何快速修復?而且修復的代碼要包含到開發人員的分支以及下一個Release?

大部分開發人員現在使用Git就只是用三個甚至兩個分支,一個是Master, 一個是Develop, 還有一個是基于Develop打得各種分支。這個在小項目規模的時候還勉強可以支撐,因為很多人做項目就只有一個Release, 但是人員一多,而且項目周期一長就會出現各種問題。

Git Flow

就像代碼需要代碼規范一樣,代碼管理同樣需要一個清晰的流程和規范

Vincent Driessen 同學為了解決這個問題提出了?A Successful Git Branching Model

下面是Git Flow的流程圖

上面的圖你理解不了? 沒關系,這不是你的錯,我覺得這張圖本身有點問題,這張圖應該左轉90度,大家應該就很用以理解了。

Git Flow常用的分支

Production 分支

也就是我們經常使用的Master分支,這個分支最近發布到生產環境的代碼,最近發布的Release, 這個分支只能從其他分支合并,不能在這個分支直接修改

Develop 分支

這個分支是我們是我們的主開發分支,包含所有要發布到下一個Release的代碼,這個主要合并與其他分支,比如Feature分支

Feature 分支

這個分支主要是用來開發一個新的功能,一旦開發完成,我們合并回Develop分支進入下一個Release

Release分支

當你需要一個發布一個新Release的時候,我們基于Develop分支創建一個Release分支,完成Release后,我們合并到Master和Develop分支

Hotfix分支

當我們在Production發現新的Bug時候,我們需要創建一個Hotfix, 完成Hotfix后,我們合并回Master和Develop分支,所以Hotfix的改動會進入下一個Release

Git Flow如何工作

初始分支

所有在Master分支上的Commit應該Tag

Feature 分支

分支名 feature/*

Feature分支做完后,必須合并回Develop分支, 合并完分支后一般會刪點這個Feature分支,但是我們也可以保留

Release分支

分支名 release/*

Release分支基于Develop分支創建,打完Release分之后,我們可以在這個Release分支上測試,修改Bug等。同時,其它開發人員可以基于開發新的Feature (記住:一旦打了Release分支之后不要從Develop分支上合并新的改動到Release分支)

發布Release分支時,合并Release到Master和Develop, 同時在Master分支上打個Tag記住Release版本號,然后可以刪除Release分支了。

維護分支 Hotfix

分支名 hotfix/*

hotfix分支基于Master分支創建,開發完后需要合并回Master和Develop分支,同時在Master上打一個tag

Git Flow代碼示例

a. 創建develop分支

gitbranch developgit push -u origin develop

b. 開始新Feature開發

git checkout -b some-feature develop# Optionally, push branch to origin:git push -u origin some-feature# 做一些改動? ? git statusgitadd some-filegit commit

c. 完成Feature

git pull origin developgit checkout developgit merge --no-ff some-featuregitpushorigin developgit branch -d some-feature# If you pushed branch to origin:gitpushorigin --deletesome-feature

d. 開始Relase

git checkout -brelease-0.1.0develop# Optional: Bumpversionnumber,commit#Preparerelease,commit

e. 完成Release

gitcheckoutmastergitmerge--no-ffrelease-0.1.0gitpushgitcheckoutdevelopgitmerge--no-ffrelease-0.1.0gitpushgitbranch-drelease-0.1.0#Ifyoupushedbranchtoorigin:gitpushorigin--deleterelease-0.1.0gittag-av0.1.0mastergitpush--tags

f. 開始Hotfix

gitcheckout-bhotfix-0.1.1master

g. 完成Hotfix

gitcheckoutmastergitmerge--no-ffhotfix-0.1.1gitpushgitcheckoutdevelopgitmerge--no-ffhotfix-0.1.1gitpushgitbranch-dhotfix-0.1.1gittag-av0.1.1mastergitpush--tags

Git flow工具

實際上,當你理解了上面的流程后,你完全不用使用工具,但是實際上我們大部分人很多命令就是記不住呀,流程就是記不住呀,腫么辦呢?

總有聰明的人創造好的工具給大家用, 那就是Git flow script.

安裝

OS X

brew install git-flow

Linux

apt-get install git-flow

Windows

wget -q -O - --no-check-certificate https://github.com/nvie/gitflow/raw/develop/contrib/gitflow-installer.sh | bash

使用

初始化:?git flow init

開始新Feature:?git flow feature start MYFEATURE

Publish一個Feature(也就是push到遠程):?git flow feature publish MYFEATURE

獲取Publish的Feature:?git flow feature pull origin MYFEATURE

完成一個Feature:?git flow feature finish MYFEATURE

開始一個Release:?git flow release start RELEASE [BASE]

Publish一個Release:?git flow release publish RELEASE

發布Release:?git flow release finish RELEASE

別忘了git push --tags

開始一個Hotfix:?git flow hotfix start VERSION [BASENAME]

發布一個Hotfix:?git flow hotfix finish VERSION

Git Flow GUI

上面講了這么多,我知道還有人記不住,那么又有人做出了GUI 工具,你只需要點擊下一步就行,工具幫你干這些事!!!

SourceTree

當你用Git-flow初始化后,基本上你只需要點擊git flow菜單選擇start feature, release或者hotfix, 做完后再次選擇git flow菜單,點擊Done Action. 我勒個去,我實在想不到還有比這更簡單的了。

目前SourceTree支持Mac, Windows, Linux.

這么好的工具請問多少錢呢??免費!!!!

Git flow for visual studio

廣大VS的福音

GitFlow for Visual Studio

歡迎工作一到五年的Java工程師朋友們加入Java架構開發: 854393687

群內提供免費的Java架構學習資料(里面有高可用、高并發、高性能及分布式、Jvm性能調優、Spring源碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構資料)合理利用自己每一分每一秒的時間來學習提升自己,不要再用"沒有時間“來掩飾自己思想上的懶惰!趁年輕,使勁拼,給未來的自己一個交代!

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

推薦閱讀更多精彩內容