Git 工作流程

Git 作為一個源碼管理系統,不可避免涉及到多人協作。

java架構師教程目錄

協作必須有一個規范的工作流程,讓大家有效地合作,使得項目井井有條地發展下去。"工作流程"在英語里,叫做"workflow"或者"flow",原意是水流,比喻項目像水流那樣,順暢、自然地向前流動,不會發生沖擊、對撞、甚至漩渦。

本文介紹三種廣泛使用的工作流程:

Git flow

Github flow

Gitlab flow

如果你對Git還不是很熟悉,可以先閱讀下面的文章。

《Git 使用規范流程》

《常用 Git 命令清單》

《Git 遠程操作詳解》

一、功能驅動

java架構師教程目錄

本文的三種工作流程,有一個共同點:都采用"功能驅動式開發"(Feature-driven development,簡稱FDD)。

它指的是,需求是開發的起點,先有需求再有功能分支(feature branch)或者補丁分支(hotfix branch)。完成開發后,該分支就合并到主分支,然后被刪除。

二、Git flow

最早誕生、并得到廣泛采用的一種工作流程,就是Git flow

2.1 特點

它最主要的特點有兩個。

首先,項目存在兩個長期分支。

主分支master

開發分支develop

前者用于存放對外發布的版本,任何時候在這個分支拿到的,都是穩定的分布版;后者用于日常開發,存放最新的開發版。

其次,項目存在三種短期分支。

功能分支(feature branch)

補丁分支(hotfix branch)

預發分支(release branch)

一旦完成開發,它們就會被合并進develop或master,然后被刪除。

Git flow 的詳細介紹,請閱讀我翻譯的中文版《Git 分支管理策略》

2.2 評價

Git flow的優點是清晰可控,缺點是相對復雜,需要同時維護兩個長期分支。大多數工具都將master當作默認分支,可是開發是在develop分支進行的,這導致經常要切換分支,非常煩人。

更大問題在于,這個模式是基于"版本發布"的,目標是一段時間以后產出一個新版本。但是,很多網站項目是"持續發布",代碼一有變動,就部署一次。這時,master分支和develop分支的差別不大,沒必要維護兩個長期分支。

三、Github flow

Github flow是Git flow的簡化版,專門配合"持續發布"。它是 Github.com 使用的工作流程。

3.1 流程

它只有一個長期分支,就是master,因此用起來非常簡單。

官方推薦的流程如下。

第一步:根據需求,從master拉出新分支,不區分功能分支或補丁分支。

第二步:新分支開發完成后,或者需要討論的時候,就向master發起一個pull request(簡稱PR)。

第三步:Pull Request既是一個通知,讓別人注意到你的請求,又是一種對話機制,大家一起評審和討論你的代碼。對話過程中,你還可以不斷提交代碼。

第四步:你的Pull Request被接受,合并進master,重新部署后,原來你拉出來的那個分支就被刪除。(先部署再合并也可。)

3.2 評價

Github flow 的最大優點就是簡單,對于"持續發布"的產品,可以說是最合適的流程。

問題在于它的假設:master分支的更新與產品的發布是一致的。也就是說,master分支的最新代碼,默認就是當前的線上代碼。

可是,有些時候并非如此,代碼合并進入master分支,并不代表它就能立刻發布。比如,蘋果商店的APP提交審核以后,等一段時間才能上架。這時,如果還有新的代碼提交,master分支就會與剛發布的版本不一致。另一個例子是,有些公司有發布窗口,只有指定時間才能發布,這也會導致線上版本落后于master分支。

上面這種情況,只有master一個主分支就不夠用了。通常,你不得不在master分支以外,另外新建一個production分支跟蹤線上版本。

四、Gitlab flow

Gitlab flow是 Git flow 與 Github flow 的綜合。它吸取了兩者的優點,既有適應不同開發環境的彈性,又有單一主分支的簡單和便利。它是 Gitlab.com 推薦的做法。

4.1 上游優先

Gitlab flow 的最大原則叫做"上游優先"(upsteam first),即只存在一個主分支master,它是所有其他分支的"上游"。只有上游分支采納的代碼變化,才能應用到其他分支。

Chromium項目就是一個例子,它明確規定,上游分支依次為:

Linus Torvalds的分支

子系統(比如netdev)的分支

設備廠商(比如三星)的分支

4.2 持續發布

java架構師教程目錄

Gitlab flow 分成兩種情況,適應不同的開發流程。

對于"持續發布"的項目,它建議在master分支以外,再建立不同的環境分支。比如,"開發環境"的分支是master,"預發環境"的分支是pre-production,"生產環境"的分支是production。

開發分支是預發分支的"上游",預發分支又是生產分支的"上游"。代碼的變化,必須由"上游"向"下游"發展。比如,生產環境出現了bug,這時就要新建一個功能分支,先把它合并到master,確認沒有問題,再cherry-pick到pre-production,這一步也沒有問題,才進入production。

只有緊急情況,才允許跳過上游,直接合并到下游分支。

4.3 版本發布

對于"版本發布"的項目,建議的做法是每一個穩定版本,都要從master分支拉出一個分支,比如2-3-stable、2-4-stable等等。

以后,只有修補bug,才允許將代碼合并到這些分支,并且此時要更新小版本號。

五、一些小技巧

java架構師教程目錄

5.1 Pull Request

功能分支合并進master分支,必須通過Pull Request(Gitlab里面叫做 Merge Request)。

前面說過,Pull Request本質是一種對話機制,你可以在提交的時候,@相關人員團隊,引起他們的注意。

5.2 Protected branch

master分支應該受到保護,不是每個人都可以修改這個分支,以及擁有審批 Pull Request 的權力。

GithubGitlab都提供"保護分支"(Protected branch)這個功能。

5.3 Issue

Issue 用于 Bug追蹤和需求管理。建議先新建 Issue,再新建對應的功能分支。功能分支總是為了解決一個或多個 Issue。

功能分支的名稱,可以與issue的名字保持一致,并且以issue的編號起首,比如"15-require-a-password-to-change-it"。

開發完成后,在提交說明里面,可以寫上"fixes #14"或者"closes #67"。Github規定,只要commit message里面有下面這些動詞+ 編號,就會關閉對應的issue。

close

closes

closed

fix

fixes

fixed

resolve

resolves

resolved

這種方式還可以一次關閉多個issue,或者關閉其他代碼庫的issue,格式是username/repository#issue_number。

Pull Request被接受以后,issue關閉,原始分支就應該刪除。如果以后該issue重新打開,新分支可以復用原來的名字。

5.4 Merge節點

Git有兩種合并:一種是"直進式合并"(fast forward),不生成單獨的合并節點;另一種是"非直進式合并"(none fast-forword),會生成單獨節點。

前者不利于保持commit信息的清晰,也不利于以后的回滾,建議總是采用后者(即使用--no-ff參數)。只要發生合并,就要有一個單獨的合并節點。

5.5 Squash 多個commit

為了便于他人閱讀你的提交,也便于cherry-pick或撤銷代碼變化,在發起Pull Request之前,應該把多個commit合并成一個。(前提是,該分支只有你一個人開發,且沒有跟master合并過。)


這可以采用rebase命令附帶的squash操作

java架構師教程目錄

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

推薦閱讀更多精彩內容

  • 作者:阮一峰原文出處:http://www.ruanyifeng.com/blog/2015/12/git-wor...
    IT程序獅閱讀 742評論 0 15
  • 多種多樣的工作流使得在項目中實施Git時變得難以選擇。這份教程提供了一個出發點,調查企業團隊最常見的Git工作流。...
    JSErik閱讀 4,443評論 2 8
  • 逢著氣候微涼, 聆聽風信子, 夏末殘留的熱, 以及剛剛的月圓, 每逢秋中有傷悲, 詞人爭搶來斷眉。 吾之凡人思秋意...
    初勛閱讀 328評論 0 0
  • 30歲的身體,80歲的靈魂。現在的我在這個城市過的很壓抑。 -1-故事的開始一場爭吵,關于我的工作。 “你為什么不...
    愛學習的荔枝閱讀 339評論 2 2
  • 公園 第二天李先生帶我去了附近的公園,westmount park,西蒙社區的公園。很大,沒有鐵柵欄圍的墻,人們隨...
    summerlight閱讀 219評論 0 0