一個成功的Git分支模型(心得)

成功的Git分支模型

去中心化但仍保持中心化


Main Branch

Main Branch

最主要的兩個分支

  • master (除非重大 bug,則會分出 hotfix 分支)
  • develop (用來在另外分支出 Release, feature)

origin/master 總是代表準備就緒的狀態 (always reflects a production-ready state.)
origin/develop always reflects a state with the latest delivered development changes for the next release

develop branch到達穩定且可被發布的狀態(stable point and is ready to be released) -> 合併到Master -> 標記(Tag)版本號

因此,每次有变化被合并到master分支时,根据定义这就是一次新的产品版本发布。我们趋向于严格遵守该规范,所以理论上来说,每次master有提交时,我们都可以使用一个Git钩子(hook)脚本来自动构建并部署软件至产品环境服务器。


Supporting branche

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

  • Feature branches (由 develop 直接分支,開發新功能)
  • Release branches (由 develop 直接分支,開發下一版 Release)
  • Hotfix branches (由 master 直接分支,馬上修正 bug)

Feature branches

合併feature回develop

規定:

  • 可能的分支來源:develop
  • 必須合併至:develop
  • 分支命名制約(naming convention):任何除master, develop, release-, 或 hotfix-以外的名稱

特點:

  • 只要特性还在开发,该分支就会一直存在
    • 不过它最终会被合并回develop分支(将该特性加入到发布版本中)
    • 被丢弃(如果试验的结果令人失望)

Creating a feature branch (创建一个特性分支)

開始開發新功能的時候,從develop分支創建功能分支。

$ git checkout -b myfeature develop

Incorporating a finished feature on develop (合并完成的特性回develop)

已完成的特性應該被合併回develop分支以将特性加入到下一个发布版本中:

$ git checkout develop
# Switched to branch 'develop'
$ git merge --no-ff myfeature
# Updating ea1b82a..05e9557
# (Summary of changes)
$ git branch -d myfeature
# Deleted branch myfeature (was 05e9557).
$ git push origin develop

git merge --no-ffgit merge的差異

git merge --no-ff & git merge

--no-ff意思為no fast forward

原本會以為說merge會有明顯的分支,出去之後再回來

但是有一個例外狀況是

  • master沒有新的commit
  • develop merge回master

這種情形的合併會和rebase的結果一樣

所以為了要有分支之後在合併回來的狀態

就得下git merge --no-ff

為何選擇git merge --no-ff

這裏我們想要凸顯出,在這個區域中,有feature被合併回來

即便他有多一個merge commit

Release branches

規定:

  • 可能的分支來源:develop
  • 必須合併至:develop and master
  • 分支命名制約(naming convention):release-*

创建一个发布分支

develop分支的状态已经是准备好“下一版本”发布了,我们也决定下个版本是1.2(而不是1.1.6或者2.0)。因此我们创建发布分支,并且为其赋予一个能体现新版本号的名称:
develop ready next version -> Decide version(now 1.2) -> Create Release branch(release-1.2)

$ git checkout -b release-1.2 develop
# Switched to a new branch "release-1.2"
$ ./bump-version.sh 1.2
# Files modified successfully, version bumped to 1.2.
$ git commit -a -m "Bumped version number to 1.2"
# [release-1.2 74d9424] Bumped version number to 1.2
# 1 files changed, 1 insertions(+), 1 deletions(-)

新的发布分支可能存在一段时间,直到该版本明确对外交付。

  • 这段时间内,该分支上可能会有一些bug的修复(而不是在develop分支上)
  • 在该分支上添加新特性是严格禁止的。
  • 新特性必须合并到develop分支,然后等待下一个版本发布。

结束一个发布分支

合併release 回 master -> 標上tag

$ git checkout master
# Switched to branch 'master'
$ git merge --no-ff release-1.2
# Merge made by recursive.
# (Summary of changes)
$ git tag -a 1.2

合併release 回 develop

$ git checkout develop
Switched to branch 'develop'
$ git merge --no-ff release-1.2
Merge made by recursive.
(Summary of changes)

最后一步是删除发布分支,因为我们已不再需要它:

$ git branch -d release-1.2
# Deleted branch release-1.2 (was ff452fe).

Hotfix branches

Hotfix branche

規定:

  • 可能的分支來源:master
  • 必須合併至:develop and master
  • 分支命名制約(naming convention):hotfix-*

動作:

  • 建立hotfix branch -> 修復bug(途中也許由多個commit) -> 合併回master,並標上新tag & 同時合併回develop

例外狀況(如果這時候release分支存在的話):

  • 合併到release分支,而不是develop分支

Source:

a
H1
a
img
hr
li
table
**


``
code
>