成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一個成功的Git分支模型

系統(tǒng) Linux
本文中我會展示一種開發(fā)模型,一年前該模型就已經(jīng)被我用在所有的項目中(包括工作中的項目和私有項目),結(jié)果是非常成功的。我早就想為此寫點東西,可直到現(xiàn)在才有時間。本文不會講述任何項目的細(xì)節(jié),只會涉及到分支策略和發(fā)布管理。

本文中我會展示一種開發(fā)模型,一年前該模型就已經(jīng)被我用在所有的項目中(包括工作中的項目和私有項目),結(jié)果是非常成功的。我早就想為此寫點東西,可直到現(xiàn)在才有時間。本文不會講述任何項目的細(xì)節(jié),只會涉及到分支策略和發(fā)布管理。

本文使用Git作為所有源碼的版本控制工具。

為什么是Git?


要全面了解Git與其它集中式版本控制系統(tǒng)相比的優(yōu)劣,可以參考這個頁面。這方面的爭論可謂是硝煙彌漫。作為一個開發(fā)者,所有這些工具中我最鐘情于Git。Git的的確確改變了人們考慮合并及分支的方式。在我之前所處的經(jīng)典CVS/Subversion世界中,合并/分支總是被認(rèn)為是有點可怕的事情(“小心合并沖突,丫會惡心到你”),因此你只應(yīng)偶爾干這種事情。

但有了Git,這類事情就變得非常簡單,分支及合并甚至被認(rèn)為是你日常版本控制操作的核心之一。例如,在CVS/Subversion的書中,分支及合并往往在后面的章節(jié)才被介紹(針對高級用戶),但在每一本Git的書中,該內(nèi)容已經(jīng)在前3章中介紹(基礎(chǔ))。

簡單及易重復(fù)性帶來的好處就是,分支及合并變得不再可怕。版本控制工具本該幫助我們方便的進(jìn)行和分支及合并操作。

簡單介紹下工具后,讓我們來看開發(fā)模型。我講介紹的模型本質(zhì)上只是一組步驟,每個團(tuán)隊成員都必須遵循這些步驟以形成一個可靠管理的軟件開發(fā)過程。

去中心化但仍保持中心化


在這個分支模型中我們使用的,且被證實工作得很好的倉庫配置,其核心是一個中心“真理”倉庫。注意只有該倉庫才被認(rèn)為是中心庫(由于Git是DVCS [分布式版本控制系統(tǒng)],在技術(shù)層面沒有中心庫這一東西)。之后我們用origin指代該倉庫,因為大多數(shù)Git用戶都熟悉這個名稱。

每個開發(fā)者都對origin做push和pull操作。不過除了這種中心化的push-pull關(guān)系外,每個開發(fā)者還可以從其他開發(fā)者或者小組處pull變更。例如,可能兩個或更多的開發(fā)者一起開發(fā)一個大的特性,在往origin***性的push工作代碼之前,他們之間可以執(zhí)行一些去中心化的操作。在上圖中,分別有Alice和Bob、Alice和David、Clair和David這些小組。

從技術(shù)上來說,這僅僅是Alice定義一個Git remote,名字為bob,指向Bob的倉庫,反過來也一樣。

#p#

主要分支


此開發(fā)模型的核心主要受現(xiàn)有的模型啟發(fā)。中心倉庫包含了兩個主要分支,這兩個分支的壽命是無限的:

  • master
  • develop

每個Git用于都應(yīng)該熟悉origin上的master分支。與master分支平行存在的,是另外一個名為develop的分支。

我們認(rèn)為origin/develop分支上的HEAD源碼反映了開發(fā)過程中***的提交變更。有人會稱之為“集成分支”。該分支是自動化每日構(gòu)建的代碼源。

當(dāng)develop分支上的源碼到達(dá)一個穩(wěn)定的狀態(tài)時,就可以發(fā)布版本。所有develop上的變更都應(yīng)該以某種方式合并回master分支,并且使用發(fā)布版本號打上標(biāo)簽。稍后我們會討論具體操作細(xì)節(jié)。

因此,每次有變化被合并到master分支時,根據(jù)定義這就是一次新的產(chǎn)品版本發(fā)布。我們趨向于嚴(yán)格遵守該規(guī)范,所以理論上來說,每次master有提交時,我們都可以使用一個Git鉤子(hook)腳本來自動構(gòu)建并部署軟件至產(chǎn)品環(huán)境服務(wù)器。

支持性分支


緊接著主要分支master和develop,我們的開發(fā)模型使用多種支持性分支來幫助團(tuán)隊成員間實現(xiàn)并行開發(fā)、追蹤產(chǎn)品特性、準(zhǔn)備產(chǎn)品版本發(fā)布、以及快速修復(fù)產(chǎn)品問題。與主要分支不同的是,這些分支的壽命是有限的,它們最終都會被刪除。

我們會用到的分支有這幾類:

  • 特性分支(feature branch)
  • 發(fā)布分支(release branch)
  • 熱補丁分支(hotfix branch)

上述每種分支都有特定的用途,它們各自關(guān)于源自什么分支、合并回什么分支,都有嚴(yán)格的規(guī)定。稍后我們逐個進(jìn)行介紹。

從技術(shù)角度來說,這些分支一點都不“特殊”。分支按照我們對其的使用方式進(jìn)行分類。技術(shù)角度它們都一樣是平常的Git分支。

#p#

特性分支


可能的分支來源:develop

必須合并回:develop

分支命令約定:任何除master, develop, release-*, 或 hotfix-*以外的名稱

特性分支(有時也被稱作topic分支)是用來為下一發(fā)布版本開發(fā)新特性。當(dāng)開始開發(fā)一個特性的時候,該特性會成為哪個發(fā)布版本的一部分,往往還不知道。特性分支的重點是,只要特性還在開發(fā),該分支就會一直存在,不過它最終會被合并回develop分支(將該特性加入到發(fā)布版本中),或者被丟棄(如果試驗的結(jié)果令人失望)。

特性分支往往只存在于開發(fā)者的倉庫中,而不會出現(xiàn)在origin。

創(chuàng)建一個特性分支

開始開發(fā)新特性的時候,從develop分支創(chuàng)建特性分支。

  1. $ git checkout -b myfeature develop 
  2.  
  3. Switch to a new branch “myfeature” 

合并完成的特性回develop

完成的特性應(yīng)該被合并回develop分支以將特性加入到下一個發(fā)布版本中:

  1. $ git checkout develop 
  2.  
  3. Switch to branch ‘develop’ 
  4.  
  5. $ git merge –no-ff myfeature 
  6.  
  7. Updating ea1b82a..05e9557 
  8.  
  9. (Summary of changes) 
  10.  
  11. $ git branch -d myfeature 
  12.  
  13. Deleted branch myfeature (was 05e9557). 
  14.  
  15. $ git push origin develop 

上述代碼中的–no-ff標(biāo)記會使合并永遠(yuǎn)創(chuàng)建一個新的commit對象,即使該合并能以fast-forward的方式進(jìn)行。這么做可以避免丟失特性分支存在的歷史信息,同時也能清晰的展現(xiàn)一組commit一起構(gòu)成一個特性。比較下面的圖:

在第2張圖中,已經(jīng)無法一眼從Git歷史中看到哪些commit對象構(gòu)成了一個特性——你需要閱讀日志以獲得該信息。在這種情況下,回退(revert)整個特性(一組commit)就會比較麻煩,而如果使用了–no-diff就會簡單很多。

是的,這么做會造成一些(空的)commit對象,但這么做是利大于弊的。

可惜的是,我沒能找到方法讓–no-diff成為默認(rèn)的git merge行為參數(shù),但其實應(yīng)該這么做。

#p#

發(fā)布分支


可能的分支來源:develop

必須合并回:develop和master

分支命名約定:release-*

發(fā)布分支為準(zhǔn)備新的產(chǎn)品版本發(fā)布做支持。它允許你在***時刻檢查所有的細(xì)節(jié)。此外,它還允許你修復(fù)小bug以及準(zhǔn)備版本發(fā)布的元數(shù)據(jù)(例如版本號,構(gòu)建日期等等)。在發(fā)布分支做這些事情之后,develop分支就會顯得比較干凈,也方便為下一大版本發(fā)布接受特性。

從develop分支創(chuàng)建發(fā)布分支的時間通常是develop分支(差不多)能反映新版本所期望狀態(tài)的時候。至少說,這是時候版本發(fā)布所計劃的特性都已經(jīng)合并回了develop分支。而未來其它版本發(fā)布計劃的特性則不應(yīng)該合并,它們必須等到當(dāng)前的版本分支創(chuàng)建好之后才能合并。

正是在發(fā)布分支創(chuàng)建的時候,對應(yīng)的版本發(fā)布才獲得一個版本號——不能更早。在該時刻之前,develop分支反映的是“下一版本”的相關(guān)變更,但不知道這“下一版本”到底會成為0.3還是1.0,直到發(fā)布分支被創(chuàng)建。版本號是在發(fā)布分支創(chuàng)建時,基于項目版本號規(guī)則確定的。

創(chuàng)建一個發(fā)布分支

發(fā)布分支從develop分支創(chuàng)建。例如,假設(shè)1.1.5是當(dāng)前的產(chǎn)品版本,同時我們即將發(fā)布下個版本。develop分支的狀態(tài)已經(jīng)是準(zhǔn)備好“下一版本”發(fā)布了,我們也決定下個版本是1.2(而不是1.1.6或者2.0)。因此我們創(chuàng)建發(fā)布分支,并且為其賦予一個能體現(xiàn)新版本號的名稱:

  1. $ git checkout -b releases-1.2 develop 
  2.  
  3. Switched to a new branch “release-1.2” 
  4.  
  5. $ ./bump-version.sh 1.2 
  6.  
  7. Files modified successfully. version bumped to 1.2. 
  8.  
  9. $ git commit -a -m “Bumped version number to 1.2” 
  10.  
  11. [release-1.2 74d9424] Bumped version number to 1.2 
  12.  
  13. 1 files changed. 1 insertions(+). 1 deletions(-) 

創(chuàng)建新分支并轉(zhuǎn)到該分支之后,我們設(shè)定版本號。這里的bump-version.sh是一個虛構(gòu)的shell腳本,它修改一些本地工作區(qū)的文件以體現(xiàn)新的版本號。(當(dāng)然這也可以手動完成——這里只是說要有一些文件變更)接著,提交新版本號。

新的發(fā)布分支可能存在一段時間,直到該版本明確對外交付。這段時間內(nèi),該分支上可能會有一些bug的修復(fù)(而不是在develop分支上)。在該分支上添加新特性是嚴(yán)格禁止的。新特性必須合并到develop分支,然后等待下一個版本發(fā)布。

結(jié)束一個發(fā)布分支

當(dāng)發(fā)布分支達(dá)到一個可以正式發(fā)布的狀態(tài)時,我們就需要執(zhí)行一些操作。首先,將發(fā)布分支合并至master(記住,我們之前定義master分支上的每一個commit都對應(yīng)一個新版本)。接著,master分支上的commit必須被打上標(biāo)簽(tag),以方便將來尋找歷史版本。***,發(fā)布分支上的變更需要合并回develop,這樣將來的版本也能包含相關(guān)的bug修復(fù)。

前兩步在Git中的操作:

  1. $ git checkout master 
  2.  
  3. Switched to branch ‘master’ 
  4.  
  5. $ git merge –no-ff release-1.2 
  6.  
  7. Merge made by recursive. 
  8.  
  9. (Summary of changes) 
  10.  
  11. $ git tag -a 1.2 

現(xiàn)在版本發(fā)布完成了,而且為未來的查閱提供了標(biāo)簽。

提醒:你可能同時也會想要用 -s 或者 -u <key> 來對標(biāo)簽進(jìn)行簽名。

為了能保留發(fā)布分支上的變更,我們還需要將分支合并回develop。在Git中:

  1. $ git checkout develop 
  2.  
  3. Switched to branch ‘develop’ 
  4.  
  5. $ git merge –no-ff release-1.2 
  6.  
  7. Merge made by recursive. 
  8.  
  9. (Summary of changes) 

這一操作可能會導(dǎo)致合并沖突(可能性還很大,因為我們改變了版本號)。如果發(fā)現(xiàn),則修復(fù)之并提交。

現(xiàn)在工作才算真正完成了,***一步是刪除發(fā)布分支,因為我們已不再需要它:

  1. $ git branch -d release-1.2 
  2.  
  3. Deleted branch release-1.2 (was ff452fe). 

 #p#

熱補丁分支


可能的分支來源:master

必須合并回:develop和master

分支命名約定:hotfix-*

熱補丁分支和發(fā)布分支十分類似,它的目的也是發(fā)布一個新的產(chǎn)品版本,盡管是不在計劃中的版本發(fā)布。當(dāng)產(chǎn)品版本發(fā)現(xiàn)未預(yù)期的問題的時候,就需要理解著手處理,這個時候就要用到熱補丁分支。當(dāng)產(chǎn)品版本的重大bug需要立即解決的時候,我們從對應(yīng)版本的標(biāo)簽創(chuàng)建出一個熱補丁分支。

使用熱補丁分支的主要作用是(develop分支上的)團(tuán)隊成員可以繼續(xù)工作,而另外的人可以在熱補丁分支上進(jìn)行快速的產(chǎn)品bug修復(fù)。

創(chuàng)建一個熱補丁分支

熱補丁分支從master分支創(chuàng)建。例如,假設(shè)1.2是當(dāng)前正在被使用的產(chǎn)品版本,由于一個嚴(yán)重的bug,產(chǎn)品引起了很多問題。同時,develop分支還處于不穩(wěn)定狀態(tài),無法發(fā)布新的版本。這時我們可以創(chuàng)建一個熱補丁分支,并在該分支上修復(fù)問題:

  1. $ git checkout -b hotfix-1.2.1 master 
  2.  
  3. Switched to a new branch “hotfix-1.2.1″ 
  4.  
  5. $ ./bump-version.sh 1.2.1 
  6.  
  7. Files modified successfully, version bumped to 1.2.1. 
  8.  
  9. $ git commit -a -m “Bumped version number to 1.2.1″ 
  10.  
  11. [hotfix-1.2.1 41e61bb] Bumped version number to 1.2.1 
  12.  
  13. 1 files changed, 1 insertions(+), 1 deletions(-) 

不要忘了在創(chuàng)建熱補丁分之后設(shè)定一個新的版本號!

然后,修復(fù)bug并使用一個或者多個單獨的commit提交。

  1. $ git commit -m “Fixed severe production problem” 
  2.  
  3. [hotfix-1.2.1 abbe5d6] Fixed severe production problem 
  4.  
  5. 5 files changed, 32 insertions(+), 17 deletions(-) 

結(jié)束一個熱補丁分支

修復(fù)完成后,熱補丁分支需要合并回master,但同時它還需要被合并回develop,這樣相關(guān)的修復(fù)代碼才會同時被包含在下個版本中。這與我們完成發(fā)布分支很類似。

首先,更新master分支并打上標(biāo)簽。

  1. $ git checkout master 
  2.  
  3. Switched to branch ‘master’ 
  4.  
  5. $ git merge –no-ff hotfix-1.2.1 
  6.  
  7. Merge made by recursive. 
  8.  
  9. (Summary of changes) 
  10.  
  11. $ git tag -a 1.2.1 

提醒:你可能同時也會想要用 -s 或者 -u <key> 來對標(biāo)簽進(jìn)行簽名。

接著,將修復(fù)代碼合并到develop:

  1. $ git checkout develop 
  2.  
  3. Switched to branch ‘develop’ 
  4.  
  5. $ git merge –no-ff hotfix-1.2.1 
  6.  
  7. Merge made by recursive. 
  8.  
  9. (Summary of changes) 

這里還有個例外情況,如果這個時候有發(fā)布分支存在,熱補丁分支的變更則應(yīng)該合并至發(fā)布分支,而不是develop。將熱補丁合并到發(fā)布分支,也意味著當(dāng)發(fā)布分支結(jié)束的時候,變更最終會被合并到develop。(如果develop上的開發(fā)工作急需熱補丁并無法等待發(fā)布分支完成,這時你也已經(jīng)可以安全地將熱補丁合并到develop分支。)

***,刪除臨時的熱補丁分支:

  1. $ git branch -d hotfix-1.2.1 
  2.  
  3. Deleted branch hotfix-1.2.1 (was abbe5d6). 

小結(jié)


雖然這個分支模型中沒有什么特別新鮮的東西,但本文起始處的“全景圖”事實上在我們的項目中起到了非常大的作用。它幫助建立了優(yōu)雅的,易理解的概念模型,使得團(tuán)隊成員能夠快速建立并理解一個公用的分支和發(fā)布過程。

責(zé)任編輯:奔跑的冰淇淋 來源: Linux中國
相關(guān)推薦

2015-10-10 11:09:48

NFVNFVI網(wǎng)絡(luò)虛擬化

2021-05-24 10:38:54

數(shù)據(jù)數(shù)據(jù)策略業(yè)務(wù)

2015-08-19 09:29:35

Git協(xié)議編寫

2014-08-08 10:20:23

Git版本管理系統(tǒng)

2016-08-05 12:58:44

GitLinux開源

2015-04-30 08:03:36

2009-08-18 17:19:33

C#事件模型

2020-12-10 10:29:32

大數(shù)據(jù)科學(xué)數(shù)據(jù)科學(xué)

2017-02-23 14:30:09

SpringhibernateJava

2009-02-10 09:06:21

DBA數(shù)據(jù)庫DB2

2022-05-25 16:51:41

Git 分支重命名開發(fā)者

2023-04-24 12:57:01

數(shù)據(jù)中心綜合布線

2017-11-07 11:36:57

開源項目代碼

2020-05-28 10:45:31

Git分支合并

2022-08-11 15:45:13

Git

2023-12-01 11:05:29

Git 分支

2020-07-09 08:00:25

Git分支模式

2022-11-07 08:01:18

Git分支管理

2022-10-26 09:22:19

git命令Linux

2023-10-09 08:39:33

Git Flow分支管理模型
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 亚洲精品乱码久久久久v最新版 | 久久久久国产一区二区三区 | 免费能直接在线观看黄的视频 | 亚洲伊人精品酒店 | 午夜av电影 | 观看av| 99精品在线观看 | 日韩免费 | 欧美一级免费片 | 噜噜噜噜狠狠狠7777视频 | 欧美h视频 | 理伦毛片| 国产精品久久九九 | 亚洲在线久久 | 午夜精品久久久久久久久久久久 | 亚洲aⅴ | 亚洲成人精品免费 | 亚洲激情专区 | 日韩欧美精品在线播放 | 激情av在线 | 国产婷婷色综合av蜜臀av | 日韩a在线 | 欧美日韩亚洲国产 | 精品国产成人 | 欧美激情国产精品 | www.亚洲一区二区三区 | 一区二区中文字幕 | 国产精品特级毛片一区二区三区 | 成人精品久久日伦片大全免费 | 精品国产91亚洲一区二区三区www | 在线91 | 国产一区二区影院 | 亚洲九九精品 | 成人免费共享视频 | 偷拍自拍网址 | 日本午夜精品一区二区三区 | 99re视频在线观看 | 久久综合久久综合久久综合 | 中文字幕国产视频 | 在线观看免费av网 | 国产美女黄色片 |