探索 Git 分支模型以持續傳遞

已完成

撰寫程式碼的目的在於為軟體提供增強功能。

導入太多流程負荷的分支模型無法協助提升客戶取得變更的速度 - 開發分支模型可讓您有足夠緩衝,而不會產生品質不佳的變更。 但系統不會同時導入過多程式,使速度變慢。

網際網路到處都是 Git 的分支策略;雖無對錯之分,但完美的分支策略有益於您的團隊運作!

您會瞭解到一定要搭配使用功能分支和提取要求,以準備好隨時可用的主分支。

準備就緒

接下來要討論我們所建議的準則:

  • 主分支:

    • 主分支是將任何專案發行至生產環境的唯一方法。
    • 主分支應一律處於準備好發行的狀態。
    • 使用分支原則保護主分支。
    • 對主分支所做的任何變更,僅能透過提取要求來傳遞。
    • 使用 Git 標籤來標記主分支中的所有版本。
  • 功能分支:

    • 所有新功能和 Bug 修正均需使用功能分支。
    • 使用功能旗標來管理長時間執行的功能分支。
    • 從功能分支到主分支的變更,僅能透過提取要求來傳遞。
    • 為您的功能命名,反映其用途。
  • 發行分支:

    • 從穩定功能分支建立專用發行分支,以準備部署。
    • 請確定發行分支經過徹底的測試與穩定工作。
    • 在部署之前,將錯誤修正和必要的變更套用至發行分支。
    • 為發行分支中的發行加上標籤,以標記重大里程碑。

    分支清單:

    bugfix/description
    features/feature-name
    features/feature-area/feature-name
    hotfix/description
    users/username/description
    users/username/workitem
    
  • 提取要求:

    • 使用提取要求來檢閱並合併程式碼。
    • 自動執行您在提取要求中檢查和驗證的內容。
    • 追蹤提取要求完成持續時間並設定目標,減少所需的時間。

我們會使用在先前練習中建立的 myWebApp。 請參閱描述如何在本機使用 Git

此種搭配會使用取自市集的三個趨勢延伸模組:

  • Azure CLI:適用於 Azure 的命令列介面。
  • Azure DevOps CLI:這是 Azure CLI 的延伸模組,可與 Azure DevOps,以及 Azure DevOps Server 搭配使用,專為能夠順暢地與 Git、CI 管線和敏捷式工具進行整合。 透過 Azure DevOps CLI,您可以參與專案,而無須離開命令列。 CLI 會在 Windows、Linux 和 Mac 上執行。
  • Git 提取要求合併衝突:Microsoft DevLabs 所建立的這個開放原始碼延伸模組,可讓您檢閱並解決網路上的提取要求合併衝突。 在 Git 提取要求可完成前,必須解決與目標分支的任何衝突。 透過此延伸模組,您可以在提取要求合併期間於網頁上解決這些衝突,而不用在本機複製中執行合併和解決衝突。

Azure DevOps CLI 支援以 JSON、JSONC、YAML、YAMLC、資料表、TSV 和無格式傳回查詢結果。 您可以設定命令來設定喜好設定。

如何執行此動作

重要

您需要在第一個學習路徑中建立專案:描述在本機使用 Git

  1. 將主分支複製到本機存放庫之後,請建立新的功能分支 myFeature-1:

    myWebApp

    git checkout -b feature/myFeature-1
    

    輸出:

    切換至新的分支「feature/myFeature-1」。

  2. 執行 Git 分支命令以查看所有分支。 顯示星號的分支是「目前簽出」分支:

    myWebApp

    git branch
    

    輸出:

    feature/myFeature-1

    main

  3. 在 feature/myFeature-1 分支中變更 Program.cs 檔案:

    myWebApp

    notepad Program.cs
    
  4. 在本機暫存變更並認可,然後將分支發佈至遠端存放庫:

    myWebApp

    git status
    

    輸出:

    分支 feature/myFeature-1 變更未暫存以供提交:(使用 「git add <file>...」更新將認可的內容) (使用 「git checkout -- <file>...」捨棄工作目錄中的變更) 已修改:Program.cs.

    myWebApp

    git add .
    git commit -m "Feature 1 added to Program.cs"
    

    輸出:

    [feature/myFeature-1 70f67b2] 功能 1 已新增至變更的 program.cs 1 檔案,1 個插入 (+)。

    myWebApp

    git push -u origin feature/myFeature-1
    

    輸出:

    使用多達 8 個執行緒的差異壓縮。 正在壓縮物件:100% (3/3),已完成。 寫入物件:100% (3/3),348 個位元組 | 348.00 KiB/秒,已完成。 總計 3 (差異 2),重複使用 0 (差異 0) 遠端:分析物件... (3/3) (10 毫秒) 遠端:儲存 packfile...已完成 (44 毫秒) 遠端:儲存索引...已完成 (62 毫秒) - https://dev.azure.com/organization/teamproject/\_git/MyWebApp * [新分支] feature/myFeature-1 -> feature/myFeature-1 分支 feature/myFeature-1 設定為從來源追蹤遠端分支 feature/myFeature-1。

    遠端會顯示變更的歷程記錄:

    變更遠端歷程記錄的螢幕擷取畫面。

  5. 為組織和專案設定 Azure DevOps CLI。 取代組織專案名稱

    az devops configure --defaults organization=https://dev.azure.com/organization project="project name"
    
  6. 使用 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 自動完成,而且可將來源分支合併到目標分支。

    注意

    如需 az repos pr create 參數的詳細資訊,請參閱建立提取要求以檢閱和合併程式碼

    小組會共同檢閱程式碼變更,並核准該提取要求:

    提取要求的螢幕擷取畫面,且該提取要求具有已核准及完成的程式碼。

    主分支已準備好發行。 小組會標記具有發行數字的主分支:

    建立標籤範例的螢幕擷取畫面。

  7. 開始在功能 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/head/feature/myFeature-2。

    myWebApp

    git checkout feature/myFeature-2
    

    輸出:

    切換至新的分支「feature/myFeature-2」分支 feature/myFeature-2 設定為從來源追蹤遠端分支 feature/myFeature-2。

  8. 在 feature-1 中變更的程式碼中變更相同的批註行,藉此修改 Program.cs。

    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();
    
  9. 在本機認可變更、推送至遠端存放庫,然後提出提取要求,將 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」。

  10. 透過在 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();
    
  11. 在本機暫存並認可變更,然後將變更推送至遠端存放庫:

    myWebApp

    git add .
    git commit -m "Adding FOF changes."
    git push -u origin fof/bug-1
    

    輸出:

    - https://dev.azure.com/**organization**/**teamproject**/\_git/MyWebApp * [新的分支] fof/bug-1 - fof/bug-1 Branch fof/bug-1 設定從來源追蹤遠端分支 fof/bug-1。

  12. 變更推出至生產環境後,使用 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 分支在主分支前有一項變更,而主分支後有兩項變更:

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

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

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

  13. Git 提取要求合併衝突解決延伸模組,可讓您直接在瀏覽器中解決合併衝突。 瀏覽至 [衝突] 索引標籤,然後按一下 Program.cs 來解決合併衝突:

    Git 提取要求合併衝突解決方法延伸模組的螢幕擷取畫面。

    使用者介面可讓您取得來源、目標、新增自訂變更、檢閱並提交合併。 合併變更後,提取要求即完成。

此時,您可以根據 fof/bug-1 分支中實作的重要錯誤修正,建立發行分支,並合併至主要分支。 使用 git 簽出命令,從主要分支建立專用發行分支。

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)。

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

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