主頁 > 軟體工程 > 專案中的Git使用規范

專案中的Git使用規范

2020-12-29 08:28:00 軟體工程

專案中的 Git 使用規范

https://jaeger.itscoder.com/ 文章來源,本地記錄防丟失

介紹

祖師爺 Linus 在創造了偉大的 Linux 之后,又創造了應用最廣泛的代碼管理工具 —— Git,極大地提高了程式員的生產力, 現如今大部分專案都在使用 Git 作為代碼管理工具,不論是在代碼管理、版本控制以及團隊協作上,Git 相比其他版本控制軟體都有著無可比擬的優勢,

雖然 Git 是個優秀的工具,但是在專案中是否能夠正確合理地使用,是否能夠發揮其最大的優勢,就我自己這幾年的作業經歷來看,對于大部分團隊這個問題的答案是否定的,

大部分程式員對 Git 的使用基本上都停留在 git add、git commit、git push、git pull 這幾個指令上,而且大部分團隊也沒有 Git 規范,提交資訊充斥著大量的 “fix”、“update”,分支管理也很混亂,代碼提交哪個分支上也沒具體的規定,導致在團隊協作程序中經常出現代碼合并后誰的代碼不見了,修過的 bug 在新版本又出現了……

我們可能面臨的問題

試想遇到以下這些問題,你會采取怎樣的方式去解決:

  • 需要線上某個歷史版本的原始碼,直接在 develop 分支根據提交記錄和時間找對應的節點?
  • 線上版本出現嚴重 bug 需要緊急修復發版本,而你的專案就一個分支,上個版本發布之后已經有大量改動了,怎么辦?
  • 某個提交改動了部分代碼,涉及到 10 幾個檔案,現在這個改動不需要了,此時要一個個找出這些檔案然后再改回去么?
  • 出現了一個 bug,之前好像處理過,但是現在忘了當初怎么處理的了,在一堆寫著 “fix bug”、“update” 的提交記錄中,如何找到當初那筆的提交?
  • 某個功能本來準備發布的,現在突然決定這個版本不上了,現在要一處處找到之前的代碼,然后再改回去?
  • ……

以上這些問題在我們的專案中都是會或多或少出現的,部分問題可能涉及到的是對 Git 的功能是否熟悉的問題,大部分問題則是涉及到一個專案的 Git 使用規范問題,如果有一個很好的規范,在專案中合理地使用 Git,很多問題壓根就不是問題,

Git規范的必要性

既然認同需要一份 Git 規范,那么這個規范需要規范哪些內容,解決哪些問題,又帶來哪些好處呢?個人認為有以下幾點:

  1. 分支管理

    • 代碼提交在應該提交的分支
    • 隨時可以切換到線上穩定版本代碼
    • 多個版本的開發作業同時進行
  2. 提交記錄的可讀性

    • 準確的提交描述,具備可檢索性
    • 合理的提交范圍,避免一個功能就一筆提交
    • 分支間的合并保有提交歷史,且合并后結果清晰明了
    • 避免出現過多的分叉
  3. 團隊協作

    • 明確每個分支的功用,做到對應的分支執行對應的操作
    • 合理的提交,每次提交有明確的改動范圍和規范的提交資訊
    • 使用 Git 管理版本迭代、緊急線上 bug fix、功能開發等任務

以上就是一份 Git 規范的作用和使命,

接下來結合 Git-Flow 和個人實際的專案經驗,總結了一份專案中使用 Git 的規范,其中大部分內容都是對 Git-Flow 進行一個解讀和擴展,告訴大家為什么這么做以及怎么做, 這里也推薦一下 Git-Flow 相關的內容:

A successful Git branching model ? nvie.com

這是一份 2010 年提出來的分支管理規范,距今已過去 8 年了,但是其作業流程至今還是適用的,也衍生出很多優秀的開發流程,

以下就是 Git-Flow 的經典流程圖:

git-flow

如果你熟悉 Git-Flow,那么你對上圖中的各種分支和線應該都能夠理解,如果你之前沒了解過相關的知識,那你可能會有點懵,不過在讀完本文之后再看這張圖,應該就能夠理解了,

分支管理規范

1. 分支說明和操作
  • master 分支

    • 主分支,永遠處于穩定狀態,對應當前線上版本
    • 以 tag 標記一個版本,因此在 master 分支上看到的每一個 tag 都應該對應一個線上版本
    • 不允許在該分支直接提交代碼
  • develop 分支

    • 開發分支,包含了專案最新的功能和代碼,所有開發都依賴 develop 分支進行
    • 小的改動可以直接在 develop 分支進行,改動較多時切出新的 feature 分支進行

注: 更好的做法是 develop 分支作為開發的主分支,也不允許直接提交代碼,小改動也應該以 feature 分支提 merge request 合并,目的是保證每個改動都經過了強制代碼 review,降低代碼風險

  • feature 分支

    • 功能分支,開發新功能的分支
    • 開發新的功能或者改動較大的調整,從 develop 分支切換出 feature 分支,分支名稱為 feature/xxx
    • 開發完成后合并回 develop 分支并且洗掉該 feature/xxx 分支
  • release 分支

    • 發布分支,新功能合并到 develop 分支,準備發布新版本時使用的分支
    • 當 develop 分支完成功能合并和部分 bug fix,準備發布新版本時,切出一個 release 分支,來做發布前的準備,分支名約定為release/xxx
    • 發布之前發現的 bug 就直接在這個分支上修復,確定準備發版本就合并到 master 分支,完成發布,同時合并到 develop 分支
  • hotfix 分支

    • hotfix 分支
    • 當線上版本出現 bug 時,從 master 分支切出一個 hotfix/xxx 分支,完成 bug 修復,然后將 hotfix/xxx 合并到 master 和 develop 分支(如果此時存在 release 分支,則應該合并到 release 分支),合并完成后洗掉該 hotfix/xxx 分支

以上就是在專案中應該出現的分支以及每個分支功能的說明, 其中穩定長期存在的分支只有 master 和 develop 分支,別的分支在完成對應的使命之后都會合并到這兩個分支然后被洗掉,簡單總結如下:

  • master 分支: 線上穩定版本分支
  • develop 分支: 開發分支,衍生出 feature 分支和 release 分支
  • release 分支: 發布分支,準備待發布版本的分支,存在多個,版本發布之后洗掉
  • feature 分支: 功能分支,完成特定功能開發的分支,存在多個,功能合并之后洗掉
  • hotfix 分支: 緊急熱修復分支,存在多個,緊急版本發布之后洗掉
2. 分支間操作注意事項

在團隊開發程序中,避免不了和其他人一起協作, 同時也會遇到合并分支等一些操作,這里提交 2 個個人覺得比較好的分支操作規范,

  • 同一分支 git pull 使用 rebase

首先看一張圖:

git-pull-no-rebase

看到這樣的  提交線圖,想從中看出一條清晰的提交線幾乎是不可能的,充滿了 Merge remote-tracking branch 'origin/xxx' into xxx 這樣的提交記錄,同時也將提交線弄成了交錯縱橫的圖,沒有了可讀性,

這里最大的原因就是因為默認的 git pull 使用的是 merge 行為,當你更新代碼時,如果本地存在未推送到遠程的提交,就會產生一個這樣的 merge 提交記錄,因此在同一個分支上更新代碼時推薦使用 git pull --rebase,

下面這張圖展示了默認的 git pull 和 git pull --rebase 的結果差異,使用 git pull --rebase 目的是修整提交線圖,使其形成一條直線,

git-pull-rebase

默認的 git pull 行為是 merge,可以進行如下設定修改默認的 git pull 行為:

    # 為某個分支單獨設定,這里是設定 dev 分支
    git config branch.dev.rebase true
    # 全域設定,所有的分支 git pull 均使用 --rebase
    git config --global pull.rebase true
    git config --global branch.autoSetupRebase always

這里需要說明一下,在我看來使用 git pull --rebase 操作是比較好的,能夠得到一條很清晰的提交直線圖,方便查看提交記錄和 code review,但是由于 rebase 會改變提交歷史,也存在一些不好的影響,這里就不做過多的討論了,有興趣的話可以移步知乎上的討論:在開發程序中使用 git rebase 還是 git merge,優缺點分別是什么?

  • 分支合并使用 --no-ff
    # 例如當前在 develop 分支,需要合并 feature/xxx 分支
    git merge --no-ff feature/xxx

在解釋這個命令之前,先解釋下 Git 中的 fast-forward: 舉例來說,開發一直在 develop 分支進行,此時有個新功能需要開發,新建一個 feature/a 分支,并在其上進行一系列開發和提交,當完成功能開發時,此時回到 develop 分支,此時 develop 分支在創建 feature/a 分支之后沒有產生任何的 commit,那么此時的合并就叫做 fast-forward,

fast-forward 合并的結果如下圖所示,這種 merge 的結果就是一條直線了,無法明確看到切出一個新的 feature 分支,并完成了一個新的功能開發,因此此時比較推薦使用 git merge --no-ff,得到的結果就很明確知道,新的一系列提交是完成了一個新的功能,如果需要對這個功能進行 code review,那么只需要檢視叉的那條線上的提交即可,

git_mwrge_diff

關于以上兩個分支間的操作建議,如果需要了解更多,可以閱讀> 潔癖者用 Git:pull --rebase 和 merge --no-ff 這篇文章,

3. 專案分支操作流程示例

這部分內容結合日常專案的開發流程,涉及到開發新功能、分支合并、發布新版本以及發布緊急修復版本等操作,展示常用的命令和操作,

3.1. 切到 develop 分支,更新 develop 最新代碼

git checkout develop
git pull --rebase

3.2. 新建 feature 分支,開發新功能

git checkout -b feature/xxx
...
git add <files>
git commit -m "feat(xxx): commit a"
git commit -m "feat(xxx): commit b"
# 其他提交
...

如果此時 develop 分支有一筆提交,影響到你的 feature 開發,可以 rebase develop 分支,前提是 該 feature 分支只有你自己一個在開發,如果多人都在該分支,需要進行協調:

# 切換到 develop 分支并更新 develop 分支代碼
git checkout develop
git pull --rebase

# 切回 feature 分支
git checkout feature/xxx
git rebase develop

# 如果需要提交到遠端,且之前已經提交到遠端,此時需要強推(強推需慎重!)
git push --force

上述場景也可以通過 git cherry-pick 來實作,有興趣的可以去了解一下這個指令,

3.3. 完成 feature 分支,合并到 develop 分支

# 切到 develop 分支,更新下代碼
git check develop
git pull --rebase

# 合并 feature 分支
git merge feature/xxx --no-ff

# 洗掉 feature 分支
git branch -d feature/xxx

# 推到遠端
git push origin develop

3.4. 當某個版本所有的 feature 分支均合并到 develop 分支,就可以切出 release 分支,準備發布新版本,提交測驗并進行 bug fix

# 當前在 develop 分支
git checkout -b release/xxx

# 在 release/xxx 分支進行 bug fix
git commit -m "fix(xxx): xxxxx"
...

3.5. 所有 bug 修復完成,準備發布新版本

# master 分支合并 release 分支并添加 tag
git checkout master
git merge --no-ff release/xxx --no-ff
# 添加版本標記,這里可以使用版本發布日期或者具體的版本號
git tag 1.0.0

# develop 分支合并 release 分支
git checkout develop
git merge --no-ff release/xxx

# 洗掉 release 分支
git branch -d release/xxx

至此,一個新版本發布完成,

3.6. 線上出現 bug,需要緊急發布修復版本

# 當前在 master 分支
git checkout master

# 切出 hotfix 分支
git checkout -b hotfix/xxx

... 進行 bug fix 提交

# master 分支合并 hotfix 分支并添加 tag(緊急版本)
git checkout master
git merge --no-ff hotfix/xxx --no-ff
# 添加版本標記,這里可以使用版本發布日期或者具體的版本號
git tag 1.0.1

# develop 分支合并 hotfix 分支(如果此時存在 release 分支的話,應當合并到 release 分支)
git checkout develop
git merge --no-ff hotfix/xxx

# 洗掉 hotfix 分支
git branch -d hotfix/xxx

至此,緊急版本發布完成,

提交資訊規范

提交資訊規范部分參考 Angular.js commit messgae,

git commit 格式 如下:

<type>(<scope>): <subject>

各個部分的說明如下:

  • type 型別,提交的類別

    • feat: 新功能
    • fix: 修復 bug
    • docs: 檔案變動
    • style: 格式調整,對代碼實際運行沒有改動,例如添加空行、格式化等
    • refactor: bug 修復和添加新功能之外的代碼改動
    • perf: 提升性能的改動
    • test: 添加或修正測驗代碼
    • chore: 構建程序或輔助工具和庫(如檔案生成)的更改
  • scope 修改范圍

主要是這次修改涉及到的部分,簡單概括,例如 login、train-order

  • subject 修改的描述

具體的修改描述資訊

  • 范例
feat(detail): 詳情頁修改樣式
fix(login): 登錄頁面錯誤處理
test(list): 串列頁添加測驗代碼

這里對提交規范加幾點說明:

  1. type + scope 能夠控制每筆提交改動的檔案盡可能少且集中,避免一次很多檔案改動或者多個改動合成一筆,
  2. subject 對于大部分國內專案而已,如果團隊整體英文不是較高水平,比較推薦使用中文,方便閱讀和檢索,
  3. 避免重復的提交資訊,如果發現上一筆提交沒改完整,可以使用 git commit --amend 指令追加改動,盡量避免重復的提交資訊,

參考資料

  • Angular.js commit messgae
  • Git - Book
  • A successful Git branching model ? nvie.com
  • oh-my-zsh 中的 git 插件,git 命令簡寫 Plugin:git · robbyrussell/oh-my-zsh Wiki
  • Git 開發流程

轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/241815.html

標籤:其他

上一篇:敏捷式開發管理——基于Teambiton平臺落地

下一篇:CODING CI 與 騰訊云 Serverless 強強聯合,助力業務快速上云

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • Git本地庫既關聯GitHub又關聯Gitee

    創建代碼倉庫 使用gitee舉例(github和gitee差不多) 1.在gitee右上角點擊+,選擇新建倉庫 ? 2.選擇填寫倉庫資訊,然后進行創建 ? 3.服務端已經準備好了,本地開始作準備 (1)Git 全域設定 git config --global user.name "成鈺" git c ......

    uj5u.com 2020-09-10 05:04:14 more
  • CODING DevOps 代碼質量實戰系列第二課,相約周三

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。**《DevOps 代碼質量實戰(PHP 版)》**為 CODING DevOps 代碼質量實戰系列的第二課,同時也是本系列的 PHP ......

    uj5u.com 2020-09-10 05:07:43 more
  • 推薦Scrum書籍

    推薦Scrum書籍 直接上干貨,推薦書籍清單如下(推薦有順序的哦) Scrum指南 Scrum精髓 Scrum敏捷軟體開發 Scrum捷徑 硝煙中的Scrum和XP : 我們如何實施Scrum 敏捷軟體開發:Scrum實戰指南 Scrum要素 大規模Scrum:大規模敏捷組織的設計 用戶故事地圖 用 ......

    uj5u.com 2020-09-10 05:07:45 more
  • CODING DevOps 代碼質量實戰系列最后一課,周四發車

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。 **《DevOps 代碼質量實戰(Java 版)》**為 CODING DevOps 代碼質量實戰系列的最后一課,同時也是本系列的 ......

    uj5u.com 2020-09-10 05:07:52 more
  • 敏捷軟體工程實踐書籍

    Scrum轉型想要做好,第一步先了解并真正落實Scrum,那么我推薦的Scrum書籍是要看懂并實踐的。第二步是團隊的工程實踐要做扎實。 下面推薦工程實踐書單: 重構:改善既有代碼的設計 決議極限編程 : 擁抱變化 代碼整潔代碼 程式員的職業素養 修改代碼的藝術 撰寫可讀代碼的藝術 測驗驅動開發 : ......

    uj5u.com 2020-09-10 05:07:55 more
  • Jenkins+svn+nginx實作windows環境自動部署vue前端專案

    前面文章介紹了Jenkins+svn+tomcat實作自動化部署,現在終于有空抽時間出來寫下Jenkins+svn+nginx實作自動部署vue前端專案。 jenkins的安裝和配置已經在前面文章進行介紹,下面介紹實作vue前端專案需要進行的哪些額外的步驟。 注意:在安裝jenkins和nginx的 ......

    uj5u.com 2020-09-10 05:08:49 more
  • CODING DevOps 微服務專案實戰系列第一課,明天等你

    CODING DevOps 微服務專案實戰系列第一課**《DevOps 微服務專案實戰:DevOps 初體驗》**將由 CODING DevOps 開發工程師 王寬老師 向大家介紹 DevOps 的基本理念,并探討為什么現代開發活動需要 DevOps,同時將以 eShopOnContainers 項 ......

    uj5u.com 2020-09-10 05:09:14 more
  • CODING DevOps 微服務專案實戰系列第二課來啦!

    近年來,工程專案的結構越來越復雜,需要接入合適的持續集成流水線形式,才能滿足更多變的需求,那么如何優雅地使用 CI 能力提升生產效率呢?CODING DevOps 微服務專案實戰系列第二課 《DevOps 微服務專案實戰:CI 進階用法》 將由 CODING DevOps 全堆疊工程師 何晨哲老師 向 ......

    uj5u.com 2020-09-10 05:09:33 more
  • CODING DevOps 微服務專案實戰系列最后一課,周四開講!

    隨著軟體工程越來越復雜化,如何在 Kubernetes 集群進行灰度發布成為了生產部署的”必修課“,而如何實作安全可控、自動化的灰度發布也成為了持續部署重點關注的問題。CODING DevOps 微服務專案實戰系列最后一課:**《DevOps 微服務專案實戰:基于 Nginx-ingress 的自動 ......

    uj5u.com 2020-09-10 05:10:00 more
  • CODING 儀表盤功能正式推出,實作作業資料可視化!

    CODING 儀表盤功能現已正式推出!該功能旨在用一張張統計卡片的形式,統計并展示使用 CODING 中所產生的資料。這意味著無需額外的設定,就可以收集歸納寶貴的作業資料并予之量化分析。這些海量的資料皆會以圖表或串列的方式躍然紙上,方便團隊成員隨時查看各專案的進度、狀態和指標,云端協作迎來真正意義上 ......

    uj5u.com 2020-09-10 05:11:01 more
最新发布
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:41:12 more
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:35:34 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:05:44 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:00:18 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:20:31 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:55 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:18:51 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:00 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:17:55 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:12:06 more