前言-約定
$ 開頭- 是指shell命令, 沒有的$ 前綴的是終端的提示信息
Gitflow工作流通過為功能開發(fā)、發(fā)布準(zhǔn)備和維護(hù)分配獨(dú)立的分支,讓發(fā)布迭代過程更流暢。嚴(yán)格的分支模型也為大型項(xiàng)目提供了一些非常必要的結(jié)構(gòu)。
一. 初始化項(xiàng)目
首先要初始化一個(gè)空的git.方式從終端上來區(qū)分,可以分為兩種:
1.1 從線上開始,這里以coding為例。
1.2 建立本地倉庫
$ git clone https://git.coding.net/angke/xxxx.git
Cloning into 'ding'...
warning: You appear to have cloned an empty repository.
1.3.1 建立master分支.初始化項(xiàng)目
$ git checkout -b master
Switched to a new branch 'master'
$ echo "1.這里是項(xiàng)目說明;\n 2.這里是寫開發(fā)規(guī)范" > readme.md
$ git add readme.md
$ git commit -m 'init commit'
$ git push -u origin master
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 258 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://git.coding.net/angke/ding.git
* [new branch] master -> master
Branch master set up to track remote branch master from origin.
1.3.2 在GUI界面。對master分支設(shè)保護(hù)
1.4 建立開發(fā)分支 develop
保證自己在master分支上,執(zhí)行
$ git checkout -b develop
Switched to a new branch 'develop'
1.4.1 現(xiàn)在就可以開始初始化項(xiàng)目了。
移動(dòng)框架源碼到版本庫
$ git status
On branch develop
Untracked files:
(use "git add <file>..." to include in what will be committed)
.env.example
.gitattributes
.gitignore
app/
artisan
bootstrap/
composer.json
composer.lock
config/
database/
package.json
phpunit.xml
public/
resources/
routes/
server.php
storage/
tests/
webpack.mix.js
nothing added to commit but untracked files present (use "git add" to track)
檢查要提交的文件,并同步到中央倉庫(這里是指coding)
$ git add .
$ git commit -m '初始化開發(fā)環(huán)境'
$ git push -u origin develop
到這里開發(fā)環(huán)境的配置就完成了。
二、 開發(fā)功能
開發(fā)功能 。 先進(jìn)入coding 添加對應(yīng)的任務(wù)
然后查看任務(wù)id
被分配到這個(gè)任務(wù)的人的開發(fā)流程
克隆倉庫 -- 僅僅第一次需要
切換到 develop分支
$ git checkout develop
Already on 'develop'
Your branch is up-to-date with 'origin/develop'.
- 建立分支。 格式為 feature-#任務(wù)id
$ git checkout -b feature-#001
.....
開始編碼
coding......
編碼完成
.....
- 開發(fā)完成這個(gè)功能點(diǎn)后
$ git status
On branch feature-#001
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: .env.example
no changes added to commit (use "git add" and/or "git commit -a")
添加并,暫存代碼
$ git add .env.example
$ git commit -m '#1 實(shí)現(xiàn)連接數(shù)據(jù)庫featrue'
[feature-#001 d6cfee8] #1 實(shí)現(xiàn)連接數(shù)據(jù)庫featrue
1 file changed, 3 insertions(+), 3 deletions(-)
接下我們要做的就是把實(shí)現(xiàn)這個(gè)feature的代碼合并回開發(fā)分支,并刪除這個(gè)這個(gè)實(shí)現(xiàn)feature分支了,
# rebase 變基操作 --- 將develop的代碼更新到最新
$ git rebase origin
# 如果有沖突,rebase 將自動(dòng)停止
$ git status #查看沖突文件
$ git add 沖突的文件名 # 手動(dòng)或用工具編輯解決沖突,并告訴git 已經(jīng)解決沖突
$ git rebase --continue #繼續(xù)進(jìn)行變基,如果有沖突,再重復(fù)上面 status add ,直到rebase 成功. 如果出現(xiàn)了錯(cuò)誤操作,
# git rebase --abort 可將代碼還原到邊基操作之前的
#切換分支
$ git checkout develop
Switched to branch 'develop'
Your branch is up-to-date with 'origin/develop'.
#合并修改
$ git merge feature-#001
Updating 11e9ffc..d6cfee8
Fast-forward
.env.example | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
#刪除feature分支
$ git branch -d feature-#001
Deleted branch feature-#001 (was d6cfee8).
#將代碼同步到中央服務(wù)器的開發(fā)分支
$ git push origin develop
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 352 bytes | 0 bytes/s, done.
Total 3 (delta 2), reused 0 (delta 0)
To https://git.coding.net/angke/ding.git
11e9ffc..d6cfee8 develop -> develop
這樣就完成了一個(gè)功能點(diǎn)的開發(fā)。項(xiàng)目中所有的功能點(diǎn),就按照這個(gè)流程重復(fù)。 添加issue ,新建對應(yīng)分支, coding. rebase 合并分支到 develop 分支, 刪除 實(shí)現(xiàn)功能這個(gè)分支, 推送到中央服務(wù)器,每個(gè)功能點(diǎn)都按照這個(gè)流程走。
三、發(fā)布測試版本
直到我們要出一個(gè)版本了,這個(gè)時(shí)候 由 主程
進(jìn)行如下操作
#切換到develop分支
$ git checkout develop
# 創(chuàng)建release分支
$ git checkout -b release-發(fā)布的版本號
對這個(gè)release的版本進(jìn)行部署,并交于這個(gè)測試測試, 這個(gè)版本的代碼,只進(jìn)行bug修正,不再添加新的功能,
如果這個(gè)時(shí)候測試測試出了bug。 那么我們同樣在coding 上添加相應(yīng)的任務(wù),并在客戶端進(jìn)行如下操作
# 切換到release分支
$ git checkout release-發(fā)布的版本號 develop
# 基于當(dāng)前分支,新建并切換到 解決某個(gè)bug的分支, 分支名格式為 issue-#id
$ git checkout issue-#002
....編碼....
# 保存代碼
$ git add 變更的文件
$ git commit -m "#002 修復(fù)了什么bug"
#rebase操作
$ git rebase
# 合并代碼到 release 分支
$ git checkout release-發(fā)布的版本號
$ git merge issue-#002
$ git push
# 合并代碼到 develop 分支
$ git checkout develop
$ git merge issue-#002
$ git push
# 刪除修復(fù)bug分支
$ git branch -d issue-#002
這樣子一直循環(huán),完成這個(gè)候選版本的修正操作。
項(xiàng)目發(fā)布
接下來我們就要進(jìn)行代碼的發(fā)布了
#切換到候選版本
$ git checkout release-0.1
# 切換到master分支
$ git checkout master
# 合并候選版本的代碼到master分支,并打上 tag
$ git checkout release-0.1
$ git tag v0.1
# 同步到中央倉庫
$ git push origin master
# 推送標(biāo)簽
$ git push v0.1:v0.1 # git push 本地tag名:遠(yuǎn)程tag名
# 刪除候選版本分支
$ git branch -d release-0.1
這樣就完成了整個(gè)項(xiàng)目的發(fā)布流程。
四、項(xiàng)目上線以及熱修復(fù)
如果項(xiàng)目運(yùn)行的時(shí)候在線上發(fā)現(xiàn)了bug,我們怎么解決呢,這個(gè)時(shí)候我們就要 基于 master
分支 創(chuàng)建對應(yīng)的 hotfix
分支了。
$ git checkout -b hotfix-issue-#id master #基于master分支,創(chuàng)建一個(gè)熱修復(fù)分支
...coding...
$ git add 變更文件
$ git commit -m 'hotfix issue #id'
# 切換到master分支,并合并代碼
$ git checkout master
$ git merge hotfix-issue-#id
# 將這個(gè) 修復(fù)合并到develop分支上
$ git checkout develop
$ git merge hotfix-issue-#id
# 刪除修復(fù)分支,重建tag, 并推送
$ git branch -d hotfix-issue-#id
$ git tag -d v0.1
# 保證當(dāng)前在master分支上。執(zhí)行下面操作,可以用git branch -a 查看當(dāng)前分支 或者直接執(zhí)行 git checkout master
$ git push origin :v0.1 #刪除服務(wù)器上tag
$ git push origin master
$ git push v0.1:v0.1
這樣就完成了v0.1版本的開發(fā)和發(fā)布以及修復(fù)線上問題的流程。
總結(jié)一下其中幾個(gè)點(diǎn)
- 禁止直接使用
git pull
請用git pull -r
或者git pull --rebase
或者git fetch && git rebase
代替 - 所有的推送操作前,都要先進(jìn)行rebase操作
- 所有更改功能和bug的修復(fù)最后都要合并會(huì)develop
- 所有為了解決和實(shí)現(xiàn)功能點(diǎn)的分支,再合并回develop分支后都要?jiǎng)h除
- master分支只與release分支和hotfix分支直接接觸。
- release分支一旦創(chuàng)建,develop實(shí)現(xiàn)新功能的分支,就不再于release分支合并了
- master分支的每次更新,都要?jiǎng)?chuàng)建一個(gè)tag
- 所有的提交信息操作,都要和 issue進(jìn)行關(guān)聯(lián)