探索 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 分支在主分支前有一項變更,而主分支後有兩項變更:

分支 (Branch) 頁面的螢幕擷取畫面。功能 /myFeature 兩個分支 (Branch) 在主分支前有一項變更,而主分支後有兩項變更。

如果您嘗試核准提取要求,您會看到錯誤訊息通知您合併衝突:

提取要求中合併衝突的螢幕擷取畫面。

解決合併衝突

若要解決合併衝突,您可以使用 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)。

入口網站中的分支檢視可讓您在主分支前輕鬆識別分支。 此外,如果有任何進行中的提取要求嘗試合併至主分支,而無須解決合併衝突,它即會強制合併衝突。

精簡的分支模型可讓您建立短期存在的分支,並更快地將品質變更推送至生產環境。