一、基本概念
1. 倉庫(Repository)
-
源倉庫(線上版本庫)
在項(xiàng)目的開始,項(xiàng)目的發(fā)起者構(gòu)建起一個(gè)項(xiàng)目的最原始的倉庫,稱為origin。 源倉庫的有兩個(gè)作用: - 匯總參與該項(xiàng)目的各個(gè)開發(fā)者的代碼 - 存放趨于穩(wěn)定和可發(fā)布的代碼 源倉庫應(yīng)該是受保護(hù)的违崇,開發(fā)者不應(yīng)該直接對其進(jìn)行開發(fā)工作拍嵌。只有項(xiàng)目管理者能對其進(jìn)行較高權(quán)限的操作。
-
開發(fā)者倉庫(本地倉庫)
任何開發(fā)者都不會(huì)對源倉庫進(jìn)行直接的操作巩趁,源倉庫建立以后,每個(gè)開發(fā)者需要做的事情就是把源倉庫的“復(fù)制”一份淳附,作為自己日常開發(fā)的倉庫议慰。這個(gè)復(fù)制是gitlab上面的fork。每個(gè)開發(fā)者所fork的倉庫是完全獨(dú)立的奴曙,互不干擾别凹,甚至與源倉庫都無關(guān)。每個(gè)開發(fā)者倉庫相當(dāng)于一個(gè)源倉庫實(shí)體的影像洽糟,開發(fā)者在這個(gè)影像中進(jìn)行編碼炉菲,提交到自己的倉庫中,這樣就可以輕易地實(shí)現(xiàn)團(tuán)隊(duì)成員之間的并行開發(fā)工作坤溃。而開發(fā)工作完成以后拍霜,開發(fā)者可以向源倉庫發(fā)送pull request,請求管理員把自己的代碼合并到源倉庫中薪介,這樣就實(shí)現(xiàn)了**分布式開發(fā)工作****和集中式的管理**祠饺。
2. 分支(Branch)
master branch:主分支
master:主分支從項(xiàng)目一開始便存在,它用于存放經(jīng)過測試汁政,已經(jīng)完全穩(wěn)定代碼道偷;在項(xiàng)目開發(fā)以后的任何時(shí)刻當(dāng)中,master存放的代碼應(yīng)該是可作為產(chǎn)品供用戶使用的代碼记劈。所以勺鸦,應(yīng)該隨時(shí)保持master倉庫代碼的清潔和穩(wěn)定,確保入庫之前是通過完全測試和代碼reivew的目木。master分支是所有分支中最不活躍的换途,大概每個(gè)月或每兩個(gè)月更新一次,每一次master更新的時(shí)候都應(yīng)該用git打上tag刽射,來說明產(chǎn)品有新版本發(fā)布军拟。develop branch:開發(fā)分支
develop:開發(fā)分支,一開始從master分支中分離出來柄冲,用于開發(fā)者存放基本穩(wěn)定代碼。每個(gè)開發(fā)者的倉庫相當(dāng)于源倉庫的一個(gè)鏡像忠蝗,每個(gè)開發(fā)者自己的倉庫上也有master和develop现横。開發(fā)者把功能做好以后,是存放到自己的develop中,當(dāng)測試完以后戒祠,可以向管理者發(fā)起一個(gè)pull request,請求把自己倉庫的develop分支合并到源倉庫的develop中骇两。所有開發(fā)者開發(fā)好的功能會(huì)在源倉庫的develop分支中進(jìn)行匯總,當(dāng)develop中的代碼經(jīng)過不斷的測試姜盈,已經(jīng)逐漸趨于穩(wěn)定了低千,接近產(chǎn)品目標(biāo)了。這時(shí)候馏颂,就可以把develop分支合并到master分支中示血,發(fā)布一個(gè)新版本。
注:任何人不應(yīng)該向master直接進(jìn)行無意義的合并救拉、提交操作难审。正常情況下,master只應(yīng)該接受develop的合并亿絮,也就是說告喊,master所有代碼更新應(yīng)該源于合并develop的代碼。feature branch:功能分支
feature:功能性分支派昧,是用于開發(fā)項(xiàng)目的功能的分支黔姜,是開發(fā)者主要戰(zhàn)斗陣地。開發(fā)者在本地倉庫從develop分支分出功能分支蒂萎,在該分支上進(jìn)行功能的開發(fā)秆吵,開發(fā)完成以后再合并到develop分支上,這時(shí)候功能性分支已經(jīng)完成任務(wù)岖是,可以刪除帮毁。功能性分支的命名一般為feature-*,*為需要開發(fā)的功能的名稱豺撑。
二烈疚、如何操作(僅做舉例說明用)
Step 1:源倉庫的構(gòu)建
這一步通常由項(xiàng)目發(fā)起人(項(xiàng)目管理員)來操作,源倉庫為devops/cmdb,并初始化兩個(gè)分支master和develop.
Step 2:開發(fā)者fork源倉庫
源倉庫建立以后聪轿,每個(gè)開發(fā)就可以去復(fù)制一份源倉庫到自己的gitlab賬號中爷肝,然后作為自己開發(fā)所用的倉庫。假設(shè)我是一個(gè)項(xiàng)目中的開發(fā)者陆错,我就到devops/cmdb項(xiàng)目主頁上去fork.
Step 3:把自己開發(fā)者倉庫clone到本地
>>> git clone git@10.125.211.3:wangyichen/cmdb.git
Step 4:構(gòu)建功能分支進(jìn)行開發(fā)
假設(shè)現(xiàn)在要開發(fā)一個(gè)“資產(chǎn)收集”功能:
#首先切換到devlop分支
>>> git checkout develop
#分出一個(gè)功能性分支
>>> git checkout -b feature-gather_facts
#假設(shè)寫好了功能,gather_facts.py就是我們開發(fā)的功能
>>> touch gather_facts.py
#測試沒問題灯抛,提交更改
>>> git add.
>>> git commit -m "add gather facts feature "
#'finish gather_facts feature',現(xiàn)在我們功能開發(fā)完畢音瓷,切換回develop
>>> git checkout develop
#把完成的功能合并到develop分支
>>> git merge --no-ff feature-gather_facts
#刪除功能性分支
>>> git branch -d feature-discuss
#把develop提交到自己的遠(yuǎn)程倉庫中
>>> git push origin develop
此時(shí)对嚼,上自己gitlab的項(xiàng)目主頁中develop分支中查看,已經(jīng)有g(shù)ather_facts.py這個(gè)文件了:
Step 5:向管理員提交pull request
在完成了“資產(chǎn)收集”功能(當(dāng)然绳慎,也可能對自己的develop進(jìn)行了多次合并纵竖,完成了多個(gè)功能),經(jīng)過測試以后漠烧,覺得沒問題,就可以發(fā)起Merge Request請求,讓管理員把自己倉庫的develop分支合并到源倉庫的develop分支中靡砌。
Step 6 管理員測試已脓、合并
管理員登陸gitlab,看到了開發(fā)者對源倉庫發(fā)起的pull request通殃。管理員需要做的事情就是:
對****開發(fā)者****的代碼進(jìn)行review度液。
-
在他的本地測試新建一個(gè)測試分支,測試開發(fā)者的代碼:
# 進(jìn)入管理員本地的develop分支git checkout develop
# 從develop分支中分出一個(gè)叫manager-develop的測試分支測試開發(fā)者的代碼
>>> git checkout -b manager-develop
# 把開發(fā)者的代碼pull到測試分支中画舌,進(jìn)行測試
>>> git pull git@10.125.211.3:wangyichen/cmdb.git develop
#判斷是否同意合并到源倉庫的develop中堕担,如果經(jīng)過測試沒問題,可以把開發(fā)者的代碼合并到源倉庫的develop中:
>>> git checkout develop
>>> git merge --no-ff manager-develop
>>> git push origin develop
注:管理員一直在操作的倉庫是源倉庫骗炉。以上照宝,就是一個(gè)git和gitlab協(xié)同工作流的基本步驟。