gitflow 規范及工具整理

gitflow 進階規范

git cz

通過工具 git-cz 規范 git commit 提交信息。

使用

$ npm install -g git-cz

git commit 的講究

通過工具使用可以看出 git 本身及 github 社區對 git 提交單位及提交信息是有非常講究的要求的,這或許也是我之前給國外 repo 提 PR 被dis的主要原因??。

優點

可以通過命令快速對 log 進行篩選

$ git log <last release> HEAD --grep feat # 通過 feat 關鍵在查詢功能變更

具體如下:

  • 如何界定何時提交一個 commit,如何定義 commit 提交目標
    • 詳細待我口述
  • 如何書寫 git message
    • message 其實包含三部分: header、body、footer
    • header 包含兩部分: type、subject
<type>[(<scope>)]: <emoji> <subject> // header 部分
[BLANK LINE] //空行
[body] // 長描述
[BLANK LINE] 
[breaking changes] // 
[BLANK LINE]
[footer]

其中,只有 header 為強制 message 必選項。
其中 header 限制為 50 個字符,其他每行不超過72個字符,主要為了美觀,避免換行

  • subject
    • 動詞開頭,第一人稱一般現在時祈使句。比如 change 而不是 changes 或 changed
    • 首字母小寫
    • 結尾不加句號(.)
  • BREAKING CHANGE (不兼容改動)
    當代碼改動與上個版本不兼容時,需要對 BREAKING CHANGE 進行描述,通常會記錄對改動的描述,改動的原因,以及遷移的方法。
  • 關閉 Issue
    當前 commit 針對某個 issue 時,可以填寫 Issue id
#234

阮一峰老師也有一篇文章,和另一篇知乎的文章感興趣可以細看。

husky (自動化神器,git hook 完美輔助)

知乎上有篇文章大概講了下這個神器。
主要能力是通過安裝 husky npm 包及工程根目錄的 package.json 部署 git hook。
hook 管理同 repo 一起,避免尷尬的 git hook 復制粘貼式維護,并且支持 node 腳本。
husky 配置已在單獨feat分支配置完畢,有興趣可以看上面的文章和 github 文檔學習。

  • 使用
$ npm install husky --save-dev // 注意一定要用 --save-dev 安裝到本地,而非 -g 全局

lint-staged

那么問題來了,有了 husky,可以書寫一些提交的校驗腳本,但是卻無法區分校驗的內容是新提交的還是舊的已經有的。

不用怕,既然我們能想到,社區一定會有人遇到同樣的問題。祭出終極殺手锏,lint-staged

這個東東一定要配合著 husky 使用才有效果,一樣,也是為了提供在提交時進行預處理的能力衍生的工具。

  • 使用
$ npm install lint-staged --save-dev // 注意一定要用 --save-dev 安裝到本地,而非 -g 全局

問題及bug處理

  1. 當lint工具誤判或提交文件太多導致出錯時,可在操作后面加上 --no-verify 繞過lint檢查。

參考

github-flow VS gitlab-flow 【三稿】

  • 主干分支開發

  • 特性分支開發

git flow

我們在 Google 上查關鍵詞“branch model”(也就是“分支模型”),有一篇排名比較靠前的文章“A successful Git branching model”,它介紹了 Git Flow 模型。

Git 剛出來的那些年,可參考的模型不多,所以 Git Flow 模型在 2011 年左右被大家當作了推薦的分支模型,至今也還有項目團隊在使用。然而,Git Flow 煩瑣的流程也被許多研發團隊吐槽,大家普遍認為 hotfix 和 release 分支顯得多余,平時都不會去用。

git flow

簡單解釋一下:

master

主干分支,用于保存已經發布的穩定代碼。圖中按時間線該分支已經從 0.1、0.2 發展到了 1.0版本。

develop

開發主干分支,從 master 分支切出,用于平時的集成開發和集成測試,其中的代碼主要用于下一次 relaese 發布,圖中的節點表示的是 1.0 的下一個版本。

feature branches

用于將來要發布的某個發布版本準備的 feature 特性分支,從 develop 分支切出。這個分支的含義非常豐富。舉例:圖中從左往右第一個分支,他的feature特性只是說會在將來某個版本上,但沒有確定,一般以做完的時間為主。而第二個feature分支卻是下個版本主要的特性分支代碼。

release branches

用于做發版的分支,一般承載下個版本的代碼發布,當然可以存在多個。在某個節點要發版時從 develop 切出。切出后這個分支只會為之后版本發布做 bug fix 相關的 commit 提交。在發版結束后,會同時向 develop 分支和 master 進行合并。并在 master 打 tag。release 分支即可刪除。

hotfix branches

一般用于發布后版本的 bug 修復,例如圖中,由于要修復 0.1 的一個bug,從 master 0.1 tag處切出 hotfix分支,修復完成后,將 hotfix 合入 develop 分支和 master 分支,在 master 打tag,并刪除 hotfix 分支。

GitHub Flow

GitHub Flow 是 GitHub 所使用的一種簡單流程。該流程只使用 master 和特性分支,并借助 GitHub 的 pull request 功能。

github flow

在 GitHub Flow 中,master 分支中包含穩定的代碼,它已經或即將被部署到生產環境。任何開發人員都不允許把未測試或未審查的代碼直接提交到 master 分支。對代碼的任何修改,包括 Bug 修復、熱修復、新功能開發等都在單獨的分支中進行。不管是一行代碼的小改動,還是需要幾個星期開發的新功能,都采用同樣的方式來管理。

當需要修改時,從 master 分支創建一個新的分支,所有相關的代碼修改都在新分支中進行。開發人員可以自由地提交代碼和提交到遠程倉庫。

當新分支中的代碼全部完成之后,通過 GitHub 提交一個新的 pull request。團隊中的其他人員會對代碼進行審查,提出相關的修改意見。由持續集成服務器(如 Jenkins)對新分支進行自動化測試。當代碼通過自動化測試和代碼審查之后,該分支的代碼被合并到 master 分支。再從 master 分支部署到生產環境。

GitHub Flow 的好處在于非常簡單實用,開發人員需要注意的事項非常少,很容易形成習慣。當需要修改時,只要從 master 分支創建新分支,完成之后通過 pull request 和相關的代碼審查,合并回 master 分支就可以了。

Gitlab flow

上面提到的 GitHub Flow,適用于特性分支合入 master 后就能馬上部署到線上的這類項目,但并不是所有團隊都使用 GitHub 或使用 pull request 功能,而是使用開源平臺 GitLab,特別是對于公司級別而言,代碼作為資產,不會隨意維護在較公開的 GitHub 上(除非采用企業版)。

GitLab Flow 針對不同的發布場景,在 GitHub Flow(特性分支加 master 分支)的基礎上做了改良,額外衍生出了三個子類模型,如表 2 所示。

表2 Gitlab Flow 的三個分支

圖3 帶生產分支的 GitLab Flow

圖4 帶環境分支的 GitLab Flow

圖5 帶發布分支的 GitLab Flow

GitLab Flow 的特性分支合入 master 用的是“Merge Request”,功能與 GitHub Flow 的“pull request”相同,這里不再贅述。

通過 Git Flow、GitHub Flow 和 GitLab Flow(3 個衍生類別) 這幾個具體模型的介紹,我給你總結一下特性分支開發的優缺點。如表 3 所示。


image

選出最合適的分支策略

上面我跟你講到的分支模型,都是 IT 研發領域比較流行的。雖然有些策略帶上了代碼平臺的標識,如 GitHub Flow,但并不意味著該策略僅限于 GitHub 代碼平臺使用,你完全可以在自己搭建的代碼平臺上使用這些策略。

接下來,我就總體歸納一下什么情況下應該選擇什么樣的分支策略。如表 4 所示。

image

SwiftLint 使用

熱烈慶祝 SwiftLint 加入 lint-staged 豪華午餐 ?? ?? ??
(之后對項目 swift 整理治理后,會考慮集成到編譯腳本中,每次build都會lint檢測)
簡單說一下需要注意的問題。
首先 SwiftLint 使用 lint-staged 集成,對開發人員基本無感知,在代碼提交時會進行 lint操作,并同時進行檢測。

lint 成功

如果你的代碼符合 lint 規則
恭喜,你的提交會正常進入git commit log。

lint 失敗

你會看到如下提示

husky > pre-commit (node v8.9.1)
  ↓ Stashing changes... [skipped]
    → No partially staged files found...
  ? Running linters...
    ↓ Running tasks for *.{png,jpeg,jpg,gif,svg} [skipped]
      → No staged files match *.{png,jpeg,jpg,gif,svg}
    ? Running tasks for *.swift
      ? Pods/SwiftLint/swiftlint lint

? Pods/SwiftLint/swiftlint lint found some errors. Please fix them and try committing again.
?? Line 27: Line should be 120 characters or less: currently 218 characters
?? Line 40: Line should be 120 characters or less: currently 128 characters
?? Line 36: Line should be 120 characters or less: currently 194 characters
...

Linting Swift files at paths /Users/chaoyang/Dev/YCMath_New_iOS/b.swift
Linting 'b.swift' (1/1)
Done linting! Found 9 violations, 2 serious in 1 file.
husky > pre-commit hook failed (add --no-verify to bypass)

如何解讀錯誤?

?? Line 27: Line should be 120 characters or less: currently 218 characters

此處是一處錯誤(error),在 b.swift 文件中27行,該行長度超出約定,應該控制在 120 字符以內,現在是 218個,嚴重超標,請立即進行修改。

?? Line 40: Line should be 120 characters or less: currently 128 characters

此處是一處警告(warning),在 b.swift 文件中40行開始。該行長度超出約定,應該控制在 120 字符以內,現在是 128個,請注意。

修復

根據命令行提示修復結束后,需要通過 git add 添加你修改好的文件(沒有特殊要求 git add .即可)。
add 結束后,通過 git commit 進行提交即可通過。

更多教程可點擊SwiftLint 中文說明的規則部分查看。

feat 分支開發及合并流程【初稿】

note

下文可能會涉及到 git rebase 的使用,在不熟悉的情況下請遵守以下黃金法則。
1. develop、master、hotfix等多人共用分支請勿直接提交任何 commit,只用于日常的代碼拉取和合并。
2. 如果某次操作間隔中發生1的情況,請勿使用 rebase 合并線上代碼到本地。
3. rebase 僅限于 1、2、條件滿足時的遠程代碼同步,例如:git rebase origin/develop(分支名)
  1. 抓取線上代碼到本地鏡像

這里需要注意,在代碼合并前推薦對遠程倉庫鏡像進行抓取,方便后續在合并時根據情況自由的選擇合并的方式,選擇不同的方式合并,產生的 git log 和分支合并痕跡也是不同的。

$ git fetch origin develop # 抓取主機名為 origin 下的遠程倉庫的 develop
# 其中 origin 和 develop 為可選參數,用于更精確的數據抓取, zsh 可配置縮寫為 gfod
  1. 合并鏡像分支到本地

a. 這里本地分支主要指純潔的沒有本地提交過的公共分支(master、develop、hotfix等),及其他私有分支(feat/xxx,fix/xxx)。

# 公共分支更新
$ git checkout develop # zsh 縮寫為 gco develop
$ git rebase origin/develop # rebase 合并鏡像分支 origin/develop 到本地 develop , zsh 為 grb origin/develop

# 私有分支更新
$ git checkout feat/xxxx
$ git rebase origin/develop

b. 如果 a 中公共分支不純潔,則采用 git merge 進行分支合并

$ git checkout develop
$ git merge origin/develop # 使用 merge 合并
  1. feat、fix 分支創建及開發
# 基于當前的分支創建私有分支
$ git checkout develop
$ git checkout -b feat/xxxx

開發

這里需要注意規范 commit message 的信息,可使用 git cz 進行控制,后續會講到用法

$ git add .
$ git cz # 根據提示輸入選項
  1. 私有分支合并主干分支
    a. 使用 gitlab 進行 merge request 申請,并勾選 squash commit。

git 提交的一些陋習及解決方案

to be continue...

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,702評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,143評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,553評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,620評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,416評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,940評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,024評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,170評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,709評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,597評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,784評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,291評論 5 357
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,029評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,407評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,663評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,403評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,746評論 2 370

推薦閱讀更多精彩內容

  • Git 規范 所有使用了本規范的項目,必須嚴格規范操作,否則不予以合并代碼、提測、打包上線等后續操作。 基本要求 ...
    zgsddzwj閱讀 13,688評論 1 14
  • 安裝: windows安裝git-- msysgit是windows版的git,下載單獨的.exe按照默認選項安裝...
    alceyp閱讀 704評論 0 0
  • Git 是目前最流行的分布式版本控制系統之一。 版本控制指的是,記錄每次版本變更的內容和時間等細節,保留各版本之間...
    神齊閱讀 1,440評論 0 7
  • 前言 Git使用教程 Git是什么 Git是一個開源的分布式版本控制系統,用于敏捷高效地處理任何或小或大的項目。 ...
    90后的思維閱讀 927評論 0 0
  • 尊重自己的真實存在 當你真心想要一件東西的時候,全宇宙都會聯合起來幫助你。 ——摘自張德芬經典作品《遇見未知的自己...
    淺漠欣閱讀 3,587評論 57 44