git 分支合併策略

2020-12-13 前端雨爸

前言

git 依靠分布式版本控制、以及出眾的分支功能受到網際網路開發們的青睞,如果你上過 github 就離不開 git 的相關操作。

我司原來用的是 svn ,經過兩年的時間,全項目都已換成 git ,我現在個人項目也全部用 github 和 gitee 。

但是,隨著需求迭代周期的不斷變化、發布的嚴格管控、線上問題的緊急修復等,開發分支時刻面臨著來自不同需求方的「挑戰」,合併到生產分支有時總會出現不可控的問題。

這些問題對開發人員管控代碼造成了「不小的困擾」。歸根到底就是沒有對 git branch 的開發合併策略有個系統的認識。

借如下這張圖,聊下 git 分支合併策略:

git 分支合併策略

相信有和我們一樣的 git 分支合併問題的同學看過這圖後,已經有了解決方案,可以忽略之後的內容了。當然看暈的同學,可以繼續閱讀下去,我會儘可能說清楚其中的方式。

面臨的問題

首先我們前端只是個幾個人的團隊,分支只有如下兩種:

develop:開發分支product:發布分支以前就像前面說的一樣,隨著團隊的逐日專業化,不能扛著小槍指哪打哪兒,面對各種「約束」,「困難」產生了如下些問題:

在開發資源有限的前提下,面對多個需求,如何管理 develop 分支?線上緊急 bug 的修復(緊急事件對分支的侵入)怎麼維護「相對」穩定的分支,作為發布分支(發布分支的管理)線上發布後,因為某些「不可抗力」的原因,如何快速回滾上個版本(版本回滾)應對策略

開發分支的細化

在項目「墾荒」階段,或者迭代需求有規律,功能「輕量」時,往往一條開發分支就足夠了(畢竟我們以前都那麼幹的),但產品上線後,面對八方的需求就有些捉襟見肘。

比如: A , B 兩個需求,A 預估 5 天,B 預估 10 天,但整個開發時間只有 10 天,勢必 AB 兩個需要不同開發人員同時進行。但更不幸的是,第 5 天時就要把 A 推到生產,一條 develop 分支完全不能應對(總不能 B 需求才完成一半),那怎麼管理 develop 分支?

把 A ,B 兩個需求單獨創建分支,這類分支稱為 feature branch,那我們的 git 代碼提交流程就會變成這樣:

分別在 develop 分支上創建兩條 feature 分支,對應 A,B 需求。這樣三條分支在邏輯上互不幹涉,如果 feature A 完成後即可推到 develop 上安排測試、發布等事項,feature B 可以繼續安心的在屬於它的分支上開發。

創建 bug 分支

面對緊急的線上 bug ,可以單獨切一條臨時的分支做處理,好處就是它對線上或者開發分支做的到「零侵入」。因為直接在 develop 上做 bug 修復,是不可靠的,因為整個團隊的開發分支是不斷在前行的。

創建 bug 分支

不用去關心 develop 的開發情況,從發布分支直接切出一個乾淨的 hotfix分支,用於 bug 的修復,測試無問題後再推到發布分支上線。

穩定的預發布分支

為了防止 product,develop 分支被開發人員在發布前後修改,造成發布代碼功能問題,需要一個手段來「凍結」分支,以使其發布前後穩定。總不希望測試環境一切正常,但發布到線上卻出現意料之外的問題(這樣的事故,也是蠻那個啥的)。

這樣的分支分為 release branch

穩定的預發布分支

一旦把 develop 合併到 release 預發布分支,將把注意力放到 release 上,後續一切發現的問題將基於此分支進行,因為線上發布將以此為可靠穩定的基礎。

為了讓 穩定不口頭上說說,甚至可以將 release 立為保護分支(protect branch),所有的 push 請求將由項目管理人員來負責審核。

版本回退

和緊急 bug 修復類似,但有些不同。如果某些非開發原因(需求部門臨時決定不上新功能等),需要把線上已發布的代碼「撤下來」,但開發分支、或者發布分支都已經經歷多次提交合併,已經難以定位之前的代碼(除非有上次代碼的備份記錄,但這屬於另一個範疇的問題)。需要有一種機制來快速回滾,可能上一次,可能上個月某天的發布。

為實現快速回滾,就要涉及 git 中 tag 的運用。

tag 顧名思義,給分支當前的狀態打個標。並沒有創建出一個新的節點,只是添加一些「備註」。

如果遇到 B 需求到了上線那天並且發布了,但因為突發情況需要回退到上次版本,所有的分支都做了合併,注意力都放在 B 需求的迭代,單純的根據提交信息來回退代碼是具有風險性的,最可靠的還是找到上次發布的代碼來回滾。此時 tag 標籤就發揮作用,如果上次發版在發布分支打了標籤 1.0,這次就執行如下命令,就輕鬆回退:

git reset --hard 1.0 # 將 HEAD 回退到 tag 1.0 時的代碼狀態git push --force origin master # 覆蓋主線分支

版本回退

總結

理解 git 分支合併策略將對項目代碼的管控更為「自由」,雖然操作會複雜,但這些卻是一定要做的。相信會在遇到上述這些問題時,起到確定性作用。

參考:

[git book](https://git-scm.com/book/en/v2)

關於我

一名工作在一線的前端工程師,樂於實踐、分享前端相關的技術。歡迎評論留言,願與各位交流進步。

相關焦點

  • Git 分支 - 分支的新建與合併
    如果你需要拉取 hotfix 所做的修改,你可以使用 git merge master 命令將 master 分支合併入 iss53 分支,或者你也可以等到 iss53 分支完成其使命,再將其合併回 master 分支。分支的合併假設你已經修正了 #53 問題,並且打算將你的工作合併入 master 分支。
  • git分支的創建、刪除、切換、合併
    先看一下git的命令:1.查看本地分支 git branch ;查看遠程分支 git branch -r ;切換分支 git checkout -b agrochemical origin/agrochemical;
  • git分支概念和分支相關操作
    本文中,蟲蟲將帶你回到git王國,通過實例理解git分支的概念及分支相關的操作,在你閱讀這篇文章後,希望能了解分支是怎麼一回事,知道怎麼靈活使用分支來解決工作中遇到的痛點,而不再是一頭霧水,懵懂不知所措。什麼是分支?
  • Git分支原理命令圖文解析
    1、「Fast forward」(快進)式合併: 如果像上圖所示,我們要把child分支合併進master中,因為child分支所指向的更新在master分支的直接上遊,git會使用「Fast forward」(快進)式合併,直接將master分支指針指向child分支所指向更新,如下圖所示
  • 您必須知道的 Git 分支開發規範,附 Git 常用命令大全!
    master 分支:master 為主分支,也是用於部署生產環境的分支,確保 master 分支穩定性;master 分支一般由 develop 以及 hotfix 分支合併,任何時間都不能直接修改代碼。
  • 一個關於Git合併的教程
    當你在git分支中工作時,你最終必須將該代碼與其他應用程式集成。學習如何使用git merge來實現這一點。將功能分離到不同的分支對於任何嚴肅的開發人員來說都是至關重要的。準備合併假設我們想要將分支修補程序合併 到您的主分支中。在我們開始之前,您如何確保您已準備好合併您的更改?
  • 如何解決git合併衝突
    這篇文章向Git新手展示如何做一些稍微高級但至關重要的事情:解決git合併衝突。什麼是git 合併?所有現代原始碼管理系統都有一個基本特徵:多個開發人員能夠同時在同一項目上工作,而不會相互幹擾。Git通過允許多個開發人員在本地的分支上工作來實現這個特性,然後將他們的代碼推到一個中心位置。
  • Git 分支操作介紹
    在這裡,我們用樹幹比作倉庫的 master 分支,其中 master 代指 」master 分支」,是 Git 倉庫的中心分支或第一個分支。為簡單起見,我們假設 master 是樹幹,其它分支都是從該分支分出的。為何在 Git 倉庫中使用分支使用分支的主要理由為:如果你希望為項目增加新特性,但很可能會影響當前可正常工作的代碼。
  • eclipse GIT本地庫分支操作
    分支是一個重要的知識點,平時我們開發主要結合eclipse,idea來操作,今天這貼主要以eclipse來操作git本地庫分支,主要內容包括新建分支,切換分支,合併分支,衝突解決,重命名分支,刪除分支等;1,新建項目 branchEclipseHelloWorld(默認master主分支)再把該項目初始化成本地庫(具體步驟前面已經講過
  • Git 分支操作介紹 | Linux 中國
    在真實的項目中,代碼庫有多個具有合併代碼權限的所有者)創建分支讓我們回顧本系列上一篇文章[2],看一下在我們的 Demo 目錄中分支是怎樣的。如果你沒有完成上述操作,請按照文章中的指示從 GitHub 克隆代碼並進入 Demo 目錄。
  • 工具系列 | Git 合併時 --no-ff 的作用
    Git 合併時 --no-ff 的作用在許多介紹 Git 工作流的文章裡,都會推薦在合併分支時,加上
  • git的幾種實用操作(合併代碼與暫存-復原工作修改)
    1.git合併遠程倉庫的代碼2.git stash保存當前的修改這兩種情況大家應該都使用比較多,現在大家使用git進行團隊開發代碼的情況比較普遍,所以我們經常需要進行合併代碼;此外,當我們在開發過程中,突然遇到緊急任務插入,我們需要再其他分支進行工作,但是當前分支我們還會再返回繼續修改,這個時候代碼還有bug,不能直接推到伺服器,這個時候就需要我們進行保存當前的狀態
  • 【Git】616- git命令的進階和複習(帶動圖效果)
    pullgit reflog對於merge而言,又有兩個合併策略:fast-forwardno-fast-forward假設bugfix分支是從master分支分叉出來的,以這個圖作為初始分支狀態缺點:一旦刪除分支或者分支指針往前走,會丟掉分支信息(原來這個分支的做了什麼在log中體現不出來)觸發時機:合併 bugfix分支到master分支時,如果master分支的狀態沒有被更改過,這樣的合併被稱為fast-forward(快進)合併
  • 我到底應該用git-merge還是git-rebase呢?
    本文一共3165字,將通俗的解釋git中兩種合併策略——merge和rebase的不同、運用方式和使用的場景,並輔以我在工作中的運用來介紹;什麼是git merge?git merge是我們在git操作中頻繁會用到的一個命令,它主要實現的功能便是為我們進行分支代碼的合併,也就是將兩個或兩個以上的開發歷史合併在一起的操作。
  • 我說小夥子,你死記Git命令,不好使
    diff --cached,將暫存區與當前commit進行比較;git diff dev,將工作區與目標分支的最新commit進行比較;git diff [commitId_1] [commitId_2],將兩個commit進行比較。
  • Git命令的用法小結
    # 在提交行的左側以字符串圖像的方式表示版本變化情況$ git log --graph合併 (merge)把外部的分支的修改,合併入當前分支.# 把其他某個分支,合併入當前分支.># 如果當前分支與某個「遠端分支」綁定,則先把其遠端分支拖動到本地,再合併入當前分支$ git pull# 合併到本端分支的策略是採用rebase(即本端修改在遠端最新版本之上的單線演進)$ git pull origin master --rebase
  • Git命令解析 - merge、rebase
    此外使用一些短期分支,比如用develop分支開發新特性,使用test分支修復bug,測試穩定性,直到代碼質量達到發布要求,再合併到master分支,完成一個版本的開發。不同的開發者團隊可以自由創造適合自己組織形式的分支策略。社區中也存在許多深受歡迎的流程範例,比如經典的gitflow工作流、PR工作流、集中式工作流等等,它們通常適用於不同的合作方式,並不是某種強制規範。
  • Git入門到高級系列2-git高級操作
    合併分支合併分支就是把其他分支的代碼合併到當前的分支中。git會自動將當前分支和要合併的分支找到共同的基點,然後將當前分支的所有變化和要合併分支的變化進行三方合併,並產生一個新的提交,此次提交有兩個父提交。
  • git命令的進階和複習(帶動圖效果)
    pullgit reflog對於merge而言,又有兩個合併策略:fast-forwardno-fast-forward假設bugfix分支是從master分支分叉出來的,以這個圖作為初始分支狀態缺點:一旦刪除分支或者分支指針往前走,會丟掉分支信息(原來這個分支的做了什麼在log中體現不出來)觸發時機:合併 bugfix分支到master分支時,如果master分支的狀態沒有被更改過,這樣的合併被稱為fast-forward(快進)合併
  • git diff在對比分支時的用法
    git diff用來比較文件之間的不同,用法有多種,本文單講對比分支時的用法。