git分支管理與使用規(guī)范
分支管理
flow
- git flow
- github flow
- gitlab flow
- fn flow
分支與開發(fā)定義
主要分支
-
master
線上分支, 一直存在
-
develop
常規(guī)開發(fā)分支, 一直存在
-
masterfix
線上bug修改分支, 一直存在
輔助分支
-
feature/*
功能開發(fā)分支, 從develop分支而來, 然后合并入develop, 最終刪除.
-
release/*
上線分支, 從develop分支而來, 然后合并入master, 并應(yīng)用到develop, 最終刪除.
-
hotfix/*
線上bug修改分支, 從masterfix分支而來, 然后合并入masterfix, 最終刪除.
如何使用各種分支
init
一個項目初始有master分支, 需要新建立一個develop分支和masterfix分支.
git br -b develop
git push origin develop
git br -b masterfix
git push origin masterfix
feature
常規(guī)功能開發(fā)需要從develop分支checkout出feature分支.
git checkout -b feature/GET-1008-添加用戶查詢列表 [develop]
開發(fā)完畢后合并回develop分支
git checkout develop
git pull // 先更新develop
git merge feature/GET-1008-添加用戶查詢列表 --no-ff
git push origin develop
git branch -d feature/GET-1008-添加用戶查詢列表
Release
開發(fā)完畢, 準備發(fā)布:
git checkout -b release/1.0.0 [develop]
然后在發(fā)布分支上處理一些發(fā)布操作, 比如更改版本號, 上線前測試, 問題修改等等. 當(dāng)分支可以進行上線發(fā)布后:
git checkout master
git merge release/1.0.0 --no-ff
git tag -a 1.0.0
至此release完成, 但是需要將在release分支上的修改應(yīng)用到develop上.
git checkout develop
git merge release/1.0.0 --no-ff
git branch -d release/1.0.0
然后, 我們可以激活masterfix分支, 同步一下已經(jīng)上線的master分支, 為修改將要出現(xiàn)的線上bug做準備
git checkout masterfix
git merge master // 在正常情況下, 這里一定是fast-faward
hotfix
當(dāng)出現(xiàn)bug時, 我們需要從master或者是masterfix分支上分出hotfix分支來修改bug.
git checkout -b hotfix/修改空指針 masterfix
修改完畢后
git checkout masterfix
git merge hotfix/修改空指針 --no-ff
期間可以進行多次hotfix, 最后當(dāng)masterfix測試后沒有問題, 準備上線:
git checkout master
git merge masterfix --no-ff
在master上打下當(dāng)前上線的tag
git tag -a 1.0.1
同樣, 這些修改要應(yīng)用到develop分支上
git checkout develop
git merge masterfix --no-ff
分支與環(huán)境對應(yīng)?
- master -- online
- release -- off
- develop -- ci
- masterfix -- online-bug-fix
- feature -- local, dev
總結(jié)
使用規(guī)范
鼓勵開分支
鼓勵本地開分支開發(fā), 獨立功能獨立分支.
將分支上提交合并
分支上開發(fā)的commit建議合并為一個commit, 這樣易讀, 方便主分支管理.
一種最簡單直接的方法
git reset [分支開始處]
git commit -m "..."
另一種方法, 在feature分支上執(zhí)行
git rebase -i develop // 將feature分支的修改應(yīng)用到develop上
// 后續(xù)操作
http://www.ruanyifeng.com/blog/2015/08/git-use-process.html
保留分支信息
在不同分支合并時使用 --no-ff
參數(shù)生成merge commit
commit e562022b423f7bf29f77927dea4d13cb05230681
Merge: d88f815 799b7f8
Author: 楊曉辰 <yangxiaochen@yangxiaochendemacbook-pro.local>
Date: Tue May 31 17:10:41 2016 +0800
Merge branch 'feature/welcome' into develop
commit 799b7f87b99d5f5c49acf2edd8a6a363ff44f29f
Author: 楊曉辰 <yangxiaochen@yangxiaochendemacbook-pro.local>
Date: Tue May 31 17:10:11 2016 +0800
也修改auth
commit 18e7893f1583559003f7a4bb41fd03b937b3ed42
Author: 楊曉辰 <yangxiaochen@yangxiaochendemacbook-pro.local>
Date: Tue May 31 17:08:04 2016 +0800
修改 auth
減少以及消除無意義的分支內(nèi)merge
同一分支更新時要避免產(chǎn)生無意義的merge
如果是一個人使用git-flow, 你會發(fā)現(xiàn)你所有的commit以及commit log都是有意義的. 你所有的更改, feature合并都是有明確記錄的.
但是在多人使用下, 大家各自在本地開發(fā), 往develop分支上merge, 那么就會出現(xiàn)每個人的develop分支不一致. 那么當(dāng)一個人把自己的develop分支push到遠端時, 其他人pull的時候就會出現(xiàn)分支合并, 產(chǎn)生 "Merge branch 'develop' of remote into develop" 的類似commit.
很多時候, 合并時沒有沖突, 自動完成. 這種merge產(chǎn)生的commit是沒有意義的, 而且會讓分支看起來混亂.
按照以下規(guī)則可以減少甚至消除這種無意義的commit:
- 本地在往develop分支進行合并時, **
先在develop上執(zhí)行g(shù)it pull
**, 當(dāng)你沒有在本地對develop分支有commit時, 執(zhí)行git pull
是會發(fā)生Fast-forward合并的, 這種默認并不產(chǎn)生commit. - 將feature合并到develop上.
- push develop. 將你的修改提交到遠端.
多數(shù)時候, 如果多個人分開執(zhí)行以上操作, 是不會有問題的.
如果多個人同時進行以上操作, 那么在進行第三步的時候, 是push不上去的, 需要先pull, 那么又會產(chǎn)生所謂的無意義commit, 該怎么辦呢:
這時不要用git pull
來拉取更改, 改為使用:
git pull --rebase
這個命令會將遠端代develop拉下來, 然后從本地develop上跟遠端develop分叉的地方開始, 將本地的commit一個個應(yīng)用到遠端develop的末端, 使之成為一條直線, 從而沒有了merge commit.
關(guān)于沖突, rebase的時候也會有沖突:
比如遠端 a->b->c
你的 a->b->d
進行rebase之后 a->b->c->e
, 其中e
的更改內(nèi)容和log就是你的d
, 如果有沖突, 沖突的修改也是提現(xiàn)在e
中
沖突提交
修改完沖突, 我們會進行commit提交沖突修改. 不要使用git commit -m
, 請直接使用git commit
, git會識別你這是一個沖突提交.
常用操作
回滾
git reset --hard [version] // 丟棄版本后的所有修改
git reset [version] // 保留版本后的所有已提交修改
git reset --soft [version] // 保留版本后的所有已提交修改到commit stage
補充提交
git commit --amend
提交tag到服務(wù)器
git push origin --tags
日志與diff
sourcetree // 軟件