Git作為目前強(qiáng)有力的軟件團(tuán)隊(duì)合作工具,除去git工具的基礎(chǔ)使用,怎樣在項(xiàng)目團(tuán)隊(duì)中合理地使用強(qiáng)大的分布式版本控制軟件揽涮,以實(shí)現(xiàn)敏捷高效的開(kāi)發(fā)工作抠藕,也是學(xué)習(xí)Git的重要內(nèi)容。本文主要參考atlassian蒋困,在該文章的基礎(chǔ)上盾似,做了一些標(biāo)注與說(shuō)明,并結(jié)合git常用操作雪标,對(duì)Git工作流作一些介紹與分析零院。
關(guān)于Git基本操作,推薦廖雪峰的教程村刨,戳Git基礎(chǔ)教程
分布式工作流
在集中式版本控制系統(tǒng)如SVN告抄、CVN下工作時(shí),有一臺(tái)中央服務(wù)器保存了項(xiàng)目的全部核心代碼庫(kù)烹困,客戶端全部是其的離線拷貝玄妈,所有提交最終都要匯總到中心服務(wù)器乾吻,并且可以影響全部離線拷貝髓梅。
和集中式版本控制系統(tǒng)相比,分布式版本控制系統(tǒng)Git的安全性要高很多绎签,因?yàn)槊總€(gè)人電腦里都有完整的版本庫(kù)枯饿,這樣,工作的時(shí)候就不需要聯(lián)網(wǎng)了诡必,因?yàn)榘姹径际窃谧约旱碾娔X上奢方。
使用Git為開(kāi)發(fā)工作流提供了一些好處:
- 它給每個(gè)開(kāi)發(fā)者自己的整個(gè)項(xiàng)目的本地副本。 這個(gè)隔離的環(huán)境使每個(gè)開(kāi)發(fā)人員獨(dú)立于項(xiàng)目的所有其他更改工作爸舒,他們可以添加提交到本地存儲(chǔ)庫(kù)蟋字,完全忘記上游開(kāi)發(fā),直到它們方便扭勉。
- 它讓你訪問(wèn)Git的魯棒分支和合并模型鹊奖。 與SVN不同,Git分支被設(shè)計(jì)為一種故障安全機(jī)制涂炎,用于集成代碼和在存儲(chǔ)庫(kù)之間共享更改忠聚。
分支管理
Git工作流使用最好遵循標(biāo)準(zhǔn)的使用規(guī)范,下面列出常用的分支:
- Master分支
這個(gè)分支也稱為Production分支唱捣,包含了最近發(fā)布到生產(chǎn)環(huán)境的代碼两蟀,最近發(fā)布的Release, 這個(gè)分支只能從其他分支合并震缭,不能在這個(gè)分支直接修改 - Develop 分支
這個(gè)分支是我們是我們的主開(kāi)發(fā)分支赂毯,包含所有要發(fā)布到下一個(gè)Release的代碼,這個(gè)主要合并與其他分支,比如Feature分支 - Feature 分支
這個(gè)分支主要是用來(lái)開(kāi)發(fā)一個(gè)新的功能党涕,一旦開(kāi)發(fā)完成活烙,我們合并回Develop分支進(jìn)入下一個(gè)Release - Release分支
當(dāng)你需要一個(gè)發(fā)布一個(gè)新Release的時(shí)候,我們基于Develop分支創(chuàng)建一個(gè)Release分支遣鼓。
- 這個(gè)分支只應(yīng)該做Bug修復(fù)啸盏、文檔生成和其它面向發(fā)布任務(wù)。一旦對(duì)外發(fā)布的工作都完成了骑祟,發(fā)布分支合并到master分支并分配一個(gè)版本號(hào)打好Tag回懦。
- 另外,這些從新建發(fā)布分支以來(lái)的做的修改要合并回develop分支次企。
- Hotfix分支
當(dāng)我們?cè)赑roduction發(fā)現(xiàn)新的Bug時(shí)候怯晕,我們需要?jiǎng)?chuàng)建一個(gè)Hotfix分支。這是唯一可以直接從master分支fork出來(lái)的分支缸棵。修復(fù)完成舟茶,修改應(yīng)該馬上合并回master分支和develop分支(當(dāng)前的發(fā)布分支),master分支應(yīng)該用新的版本號(hào)打好Tag堵第。
工作實(shí)踐
在服務(wù)器上建立好遠(yuǎn)程中央倉(cāng)庫(kù)吧凉。
創(chuàng)建Develop分支
第一步為Mater分支建立一個(gè)Develop分支。一個(gè)簡(jiǎn)單的方法是一個(gè)開(kāi)發(fā)人員在本地創(chuàng)建一個(gè)空的Develop分支并將其推送到服務(wù)器:
git branch develop git push -u origin develop
項(xiàng)目組其他開(kāi)發(fā)人員克隆中央倉(cāng)庫(kù)克隆踏志,并切換至Develop分支:
git clone ssh://user@host/path/to/repo.git git checkout -b develop origin/develop
開(kāi)發(fā)者A與B并行開(kāi)發(fā)功能
開(kāi)發(fā)者A與B開(kāi)始各自的功能開(kāi)發(fā)阀捅,工作應(yīng)在新分支上展開(kāi),新的Feature分支應(yīng)基于
Develop分支建立针余。
git checkout -b feature-X develop
在各自功能分支上進(jìn)行編輯饲鄙、暫存、提交:
git status git add git commit
開(kāi)發(fā)者A完成并提交新功能
開(kāi)發(fā)者A在完成功能后首先從從遠(yuǎn)程獲取Develop分支最新版本并merge到本地圆雁。
git pull origin develop
將Feature分支合并至本地Develop分支忍级。
git checkout develop git merge feature-A
合并成功后推送至遠(yuǎn)程倉(cāng)庫(kù)。
git push origin develop
推送時(shí)可能遇到?jīng)_突解決伪朽,則先
git pull
抓取最新提交再在本地解決沖突后再push轴咱。
開(kāi)發(fā)者A進(jìn)行版本發(fā)布
開(kāi)發(fā)者A完成功能準(zhǔn)備進(jìn)行版本發(fā)布時(shí),基于Develop分支創(chuàng)建Release分支驱负,這個(gè)分支是清理發(fā)布嗦玖、執(zhí)行所有測(cè)試、更新文檔和其它為下個(gè)發(fā)布做準(zhǔn)備操作的地方跃脊,像是一個(gè)專門用于改善發(fā)布的功能分支宇挫。
git checkout -b release-0.1 develop
當(dāng)準(zhǔn)備好發(fā)布時(shí),開(kāi)發(fā)者A將首先發(fā)布分支合并回master分支酪术,并push到服務(wù)器倉(cāng)庫(kù)器瘪。
git checkout master git merge release-0.1 git push
只要有合并到master分支翠储,就應(yīng)該打好Tag
以方便跟蹤。
git tag -a 0.1 -m "Initial public release" master git push --tags
在發(fā)布分支中已經(jīng)提交的更新需要在后面的新功能中也要是可用的橡疼,所以應(yīng)合并至Develop分支援所。之后刪除發(fā)布分支。
git checkout develop git merge release-0.1 git push git branch -d release-0.1
Bug反饋與修復(fù)
當(dāng)發(fā)布后收到Bug反饋后欣除,開(kāi)發(fā)者從master
分支上拉出了一個(gè)維護(hù)分支Hotfix住拭,提交修改以解決問(wèn)題,然后直接合并回master分支:
git checkout -b hotfix master
/*Fix the bug*/
git checkout master
git merge hotfix
git push
與發(fā)布分支一樣历帚,維護(hù)分支中新加這些重要修改需要包含到develop分支中滔岳。
git checkout develop
git merge hotfix
git push
git branch -d hotfix