探索 Git 分支模型以持續傳遞
成功的軟體交付取決於平衡速度、品質和風險管理的分支策略。 目標是在保持生產穩定性的同時快速交付增強功能。
策略平衡:速度與品質
有效的分支模型必須取得適當的平衡:
- 最大限度地減少流程開銷 ,以加快上市時間。
- 維護品質大門 ,防止缺陷到達生產。
- 啟用並行開發 以實現團隊可擴展性。
- 支援針對嚴重問題快速部署 Hotfix。
雖然存在許多 Git 分支策略,但最有效的方法是將經過驗證的模式與團隊的特定需求相結合。 現代企業團隊通常採用以功能分支和提取請求為中心的 輕量級、基於主幹的開發模型 。
核心原則:隨時準備好主分支
本單元教導您如何使用功能分支 (Branch) 和提取要求來實作可進行持續傳遞的分支模型,以維持一致可部署的主分支 (Branch)。
企業分支策略架構
下列原則為持續交付奠定了堅實的基礎:
主分支穩定性
- 單一真實來源:主要分支是生產版本的唯一途徑。
- 生產整備:主要分支必須一律處於可部署狀態。
- 分支保護:實施全面的分支策略以防止直接提交。
- 受管制的變更:所有修改都專門透過提取要求進行。
- 發行追蹤:使用語意 Git 標籤標記所有生產發行。
功能分支 (Branch) 專業領域
- 隔離開發: 為所有功能和錯誤修復創建專用分支。
- 功能標誌集成: 使用功能切換管理長時間運行的功能,以縮短分支生命週期。
- 策略命名:使用反映商業價值的描述性命名約定。
- 提取要求工作流程:專門透過已檢閱的提取要求合併至主分支。
發行分支策略
- 專用準備:從穩定的功能整合點建立發行分支。
- 品質保證:對發布中的分支進行徹底的測試和穩定化。
- 生產強化:應用最終錯誤修復和性能優化。
- 里程碑追蹤: 標記重要的發布里程碑以實現可追溯性。
適用於 Scale 的命名慣例
# Bug fixes
bugfix/[ticket-id]-description
bugfix/AUTH-123-login-timeout
# Feature development
features/[area]/[feature-name]
features/authentication/oauth-integration
features/api/rate-limiting
# Hotfixes
hotfix/[severity]-description
hotfix/critical-payment-gateway
# Personal branches
users/[username]/[description]
users/john-doe/experimental-caching
提取要求管理
- 強制程式碼審查:直接合併到 main 沒有例外。
- 自動化驗證:整合 CI/CD 流程來確保品質關卡。
- 效能指標:追蹤和最佳化提取請求完成時間。
- 知識共享: 使用審查進行團隊學習和標準執行。
必要條件和設定
企業 Git 工作流程的基本工具
此實務練習會利用 Azure 的完整 DevOps 工具鏈:
- Azure CLI:Azure 服務的雲端原生命令列介面。
- Azure DevOps CLI:用於跨 Windows、Linux 和 macOS 無縫整合 Git、CI/CD 和敏捷工具的特殊擴展。
Azure DevOps CLI 設定
Azure DevOps CLI 提供彈性的輸出格式設定 (JSON、YAML、資料表、TSV) ,以支援各種自動化案例。 使用以下方式配置您偏好的格式:
az devops configure --defaults output=table
實務操作:企業級 Git 工作流程
此全面的演練示範了用於持續交付的企業級 Git 分支,涵蓋功能開發、Hotfix 部署和衝突解決。
步驟 1:功能分支建立與開發
依照企業命名慣例建立功能分支:
myWebApp
git checkout -b feature/myFeature-1
輸出:切換到新分支 'feature/myFeature-1'。
驗證分支內容和工作樹狀結構狀態:
myWebApp
git branch
輸出:✓ feature/myFeature-1
- main*
第 2 步:功能實現和版本控制
實作您的功能變更:
myWebApp
# Edit your source files
code Program.cs # Or your preferred editor
遵循完整的提交生命週期:
myWebApp
git status
輸出:在分支 feature/myFeature-1 上,變更未暫存以提交:
- 已修改:Program.cs*
myWebApp
git add .
git commit -m "feat: implement myFeature-1 with enhanced error handling"
輸出:[feature/myFeature-1 70f67b2] feat:實作具有進階錯誤處理的 myFeature-11 個檔案已變更,1 個插入 (+)
發佈至遠端存放庫:
myWebApp
git push -u origin feature/myFeature-1
輸出:至 https://dev.azure.com/organization/teamproject/_git/MyWebApp
- [新分支 (Branch)] feature/myFeature-1 -> feature/myFeature-1已設定分支 (Branch) feature/myFeature-1 以從原點追蹤遠端分支 (Branch) feature/myFeature-1。
步驟 3:Azure DevOps CLI 設定和提取要求建立
為組織和專案設定 Azure DevOps CLI。 取代組織和專案名稱:
az devops configure --defaults organization=https://dev.azure.com/organization project="project name"
使用 Azure DevOps CLI 建立新的提取要求,以檢閱 feature-1 分支中的變更:
az repos pr create --title "Review Feature-1 before merging to main" --work-items 38 39 `
--description "#Merge feature-1 to main" `
--source-branch feature/myFeature-1 --target-branch main `
--repository myWebApp --open
在建立提取要求後,當要在網頁瀏覽器中開啟提取要求時,請使用 --open 切換開關。
--deletesource-branch該開關可用於在提取請求完成後刪除分支。 此外,請考慮在傳遞所有原則時使用 --auto-complete 自動完成,而且可將來源分支 (Branch) 合併到目標分支 (Branch)。
注意
如需 az repos pr create 參數的詳細資訊,請參閱建立提取要求以檢閱和合併程式碼。
小組會共同檢閱程式碼變更,並核准該提取要求:
主分支已準備好發行。 小組會標記具有發行數字的主分支:
第 4 步:並行功能開發
開始在功能 2 上執行。 從主分支遠端建立分支,並在本機簽出:
myWebApp
git push origin main:refs/heads/feature/myFeature-2
輸出:總計 0 (差異 0),已重複使用 0 (差異 0) - https://dev.azure.com/**organization**/**teamproject**/\_git/MyWebApp * [new branch] origin/HEAD -> refs/heads/feature/myFeature-2.
myWebApp
git checkout feature/myFeature-2
輸出:已切換至新的分支 (Branch) 'feature/myFeature-2' 已設定分支 (Branch) feature/myFeature-2 以從原點追蹤遠端分支 (Branch) feature/myFeature-2。
修改 Program.cs,變更 feature-1 中程式碼的相同註解行:
```
public class Program
{
// Editing the same line (file from feature-2 branch)
public static void Main(string[] args)
{
BuildWebHost(args).Run();
}
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.Build();
```
步驟 5:功能 2 提取要求和 Hotfix 案例
在本機認可變更、推送至遠端存放庫,然後提出提取要求,將 feature/myFeature-2 的變更合併至主分支:
az repos pr create --title "Review Feature-2 before merging to main" --work-items 40 42 `
--description "#Merge feature-2 to main" `
--source-branch feature/myFeature-2 --target-branch main `
--repository myWebApp --open
正式發行前小眾測試版在提取要求時,在生產環境中針對 feature-1 版本回報重大錯誤。 若要調查問題,您必須偵錯目前部署在生產環境中的程式碼版本。 若要調查問題,請使用 release_feature1 標籤建立新的 fof 分支:
myWebApp
git checkout -b fof/bug-1 release_feature1
輸出:切換到新分支 'fof/bug-1'。
步驟 6:關鍵 Hotfix 實作
透過在 feature-1 中變更的同一行程式碼來修改 Program.cs:
public class Program
{
// Editing the same line (file from feature-FOF branch)
public static void Main(string[] args)
{
BuildWebHost(args).Run();
}
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.Build();
在本機暫存並認可變更,然後將變更推送至遠端存放庫:
myWebApp
git add .
git commit -m "Adding FOF changes."
git push -u origin fof/bug-1
輸出:- https://dev.azure.com/**organization**/**teamproject**/\_git/MyWebApp * [new branch] fof/bug-1 - fof/bug-1 已從原點設定分支 (Branch) fof/bug-1 以追蹤遠端分支 (Branch) fof/bug-1。
步驟 7:Hotfix 整合和衝突解決
變更推出至生產環境後,使用 release_bug-1 標籤標記 fof\bug-1 分支,然後引發提取要求,將 fof/bug-1 的變更合併回主分支:
az repos pr create --title "Review Bug-1 before merging to main" --work-items 100 `
--description "#Merge Bug-1 to main" `
--source-branch fof/Bug-1 --target-branch main `
--repository myWebApp --open
作為提取要求的一部分,該分支會遭刪除。 不過,您仍然可以使用此標籤參考整個歷程記錄。
有了重大錯誤修正程式,讓我們檢閱功能 2 提取要求。
分支頁面清楚指出功能 /myFeature-2 分支在主分支前有一項變更,而主分支後有兩項變更:
如果您嘗試核准提取要求,您會看到錯誤訊息通知您合併衝突:
解決合併衝突
若要解決合併衝突,您可以使用 Azure DevOps Web 介面,或使用 Git 命令在本機解決它們。 如需本地解決,請先使用 main 的最新變更來更新您的功能分支:
```CMD
git checkout feature/myFeature-2
git fetch origin
git merge origin/main
```
在您偏好的編輯器中解決衝突,然後完成合併:
```CMD
git add .
git commit -m "Resolve merge conflicts between feature-2 and main"
git push origin feature/myFeature-2
```
解決衝突後,拉取請求就可以順利完成。
此時,您可以根據 fof/bug-1 分支 (Branch) 中實作的重要 BUG 修正,建立發行分支 (Branch),並合併至主分支。 使用 git checkout 命令,從 main 分支建立專用的發行分支。
git checkout -b release/v1.1 main
此命令會根據主分支建立名為 release/v1.1 的新分支。
在發行流程期間達到重要里程碑時,請使用 Git 標籤在發行分支中標記發行。 標籤可作為標記,表示特定版本的軟體。
git tag -a v1.1 -m "Release version 1.1"
此命令會建立名為 v1.1 的標籤,以在發行分支中標示版本 1.1。
運作方式
我們已瞭解 Git 分支模型如何藉由為每個功能建立分支,讓您能夠彈性地平行處理功能。
提取要求工作流程可讓您使用分支原則來檢閱程式碼變更。
Git 標籤是記錄里程碑的好方法,例如發行的程式碼版本;標籤可讓您以標籤建立分支。
我們已從舊版標籤建立分支,以修正生產環境中的重要錯誤 (bug)。
入口網站中的分支檢視可讓您在主分支前輕鬆識別分支。 此外,如果有任何進行中的提取要求嘗試合併至主分支,而無須解決合併衝突,它即會強制合併衝突。
精簡的分支模型可讓您建立短期存在的分支,並更快地將品質變更推送至生產環境。