共用方式為


使用重訂基底來套用變更

Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019

Visual Studio 2019 |Visual Studio 2022

Git 會自動在 分支 上維護 開發歷史,藉由將每個新的 提交 連結至其前一個提交。 當您 合併 一個分支到另一個分支時,歷程記錄可能會變得不那麼簡單。 例如,no-fast-forward 合併 通過建立一個具有多個前置提交的合併提交,來合併不同的開發分支。 相反地,Git rebase 會結合不同的開發分支,而不會建立合併提交,這會導致較簡單的提交歷程記錄,但會失去有關合併的資訊。 您在選擇 合併類型 時,可能會考慮是要保留合併記錄還是簡化提交記錄。

本文討論何時使用 rebase 而非無快速向前合併,並提供下列工作的程式:

  • 重新設定本機分支的基底
  • 在變基之後強制推送本地分支
  • 互動式變基以合併本地提交

如需 Git 工作流程的概觀,請參閱 Azure Repos Git 教學課程

先決條件

類別 需求
專案存取 專案的成員。
許可 - 在私人項目中檢視程式碼:至少 基本 權限。
- 複製或貢獻私人專案中的程式碼:作為 貢獻者 安全群組的成員或在專案中具有相應的許可權。
- 設定分支或存放庫許可權:管理分支或存放庫的許可權 許可權。
- 變更預設分支:編輯原則 存放庫的許可權。
- 匯入存放庫:專案管理員成員 安全組或 Git 專案層級 建立存放庫 許可權設定為 允許。 如需詳細資訊,請參閱 設定 Git 存放庫許可權
服務 啟用 Repos
工具 選擇性。 使用 az repos 命令:Azure DevOps CLI

備註

在公用專案中,具有 項目關係人 存取權的使用者具有 Azure Repos 的完整存取權,包括檢視、複製及參與程式代碼。

類別 需求
專案存取 專案的成員。
許可 - 查看程式碼:至少 基本 權限。
- 複製程式碼或貢獻程式碼:屬於 參與者安全組 的成員或具有專案中的對應許可權。
服務 啟用 Repos

重新設定本地分支的基底

Git rebase 將來源分支的提交整合到您目前的本地分支(目標分支)。 來源分支保持不變。 如需比較,Git rebase 和其他合併類型會顯示在下圖中。

圖表顯示使用 Git rebase 時提交的前後變化。

Git rebase 會重新排序目標分支的提交歷史,使其包含所有來源分支的提交,然後再接上自上次共同提交之後的所有目標分支提交。 另一種看法是,rebase 就是將目標分支中的變更回放到來源分支的歷程記錄之上。 值得注意的是,Git rebase 會變更現有目標分支的提交順序,而這在其他合併策略中不是如此。 在上圖中,commit K' 包含與 K 相同的變更,但有新的提交 ID,因為它指向提交 E,而不是 C。

在重新基底期間,如果來源分支變更與目標分支變更衝突,Git 會提示您 解決合併衝突。 您可以在變基期間,以與合併期間解決合併衝突相同的方式來解決合併衝突。

Rebase 與 no-fast-forward 合併

Git rebase 會產生較簡單但較不精確的提交歷史,而不是 不快轉 合併,也稱為 三向真實 合併。 當您想要在提交歷史記錄中保留合併記錄時,請使用禁止快進(no-fast-forward)合併。

如果您是負責功能或錯誤修正分支的唯一人員,請考慮使用 rebase 將最近的 main 分支工作定期整合到其中。 該策略有助於確保您隨時瞭解其他人最近的工作,並及時解決任何出現的合併衝突。 藉由變基,您將在最新的 main 分支工作之上實作新功能,這有助於維持線性的提交歷史。

如需瞭解有關 Git rebase 及何時使用的更多資訊,請參閱 rebase 與 merge

Rebase 和 force-push 準則

如果您重新建置先前 推送的本機分支,然後再次執行預設 Git push 命令,推送將會失敗。 預設的 Git push 命令會套用快轉合併,以將本地分支整合到遠端分支。 該命令會在變基後失敗,因為變基會改變本地目標分支中現有提交的順序,因此它不再符合其遠端對應分支的歷史記錄。 在此情境下,強制推送 會成功,因為它覆寫了遠端分支。

Git 重設基底和強制推送是功能強大的工具,但在決定是否使用時,請記住這些指導方針:

  • 除非您確定沒有人使用共用分支,否則請勿重新建置已推送並與他人共用的本機分支。 重新基底之後,您的本機分支將不再符合遠端分支的歷史記錄。
  • 請勿強制推送至其他人正在使用的遠端分支,因為其遠端分支的本機版本將不再符合更新的遠端分支歷程記錄。
  • 您的團隊應就變基和強推的使用情境達成共識。

小提示

針對協作審查流程,請使用 拉取請求,將新工作合併至遠端存放庫的預設分支。

如何重新基底

Visual Studio 2022 提供 Git 版本控制體驗,方法是使用 Git 功能表、Git 變更,以及透過 方案總管 中的操作功能表。 Visual Studio 2019 16.8 版也提供 Team Explorer Git 使用者介面。 如需詳細資訊,請參閱 Visual Studio 2019 - Team Explorer 索引標籤。

  1. 選擇 [Git > 管理分支],以開啟 [Git 存放庫] 視窗。

    Visual Studio Git 功能表中 [管理分支] 選項的螢幕快照。

  2. 在 [Git 存放庫] 視窗中,以滑鼠右鍵按兩下目標分支,然後選取 [簽出]。

    Visual Studio [Git 存放庫] 視窗中分支內容功能表的 [簽出] 選項的螢幕快照。

  3. 以滑鼠右鍵點擊來源分支,然後選取 [Rebase <target-branch> 合併至 <source-branch>

    Visual Studio Git 存放庫視窗中分支內容功能表的 Rebase 選項的螢幕截圖。

  4. Visual Studio 會在成功重新基底之後顯示確認訊息。

    Visual Studio [Git 存放庫] 視窗中重新基底確認訊息的螢幕快照。

    如果因合併衝突而停止變更基底,Visual Studio 會通知您。 您可以 解決衝突,或取消變基並返回變基前狀態。

    Visual Studio 中 [Git Repository] 視窗的 rebase 衝突訊息螢幕截圖。

在變基之後強制推送本機分支

如果您重新建置先前推送的本機分支,後續的預設 Git 推送將會 失敗。 相反地,您可以強制推送本機分支來覆蓋其遠端對應的分支,使其提交歷史相符。

警告

永遠不要強制推送其他人正在處理的分支。 如需詳細資訊,請參閱 Rebase 和 force push guidelines

若要強制在 Visual Studio 中推送,您必須先啟用強制推送選項:

  1. 移至 Tools>[選項]>原始檔控制>Git 全域設定

  2. 選取 [啟用 push --force-with-lease 選項。

Git 推送 --force-with-lease 旗標比 --force 旗標更安全,因為它不會覆蓋遠端分支中有未整合至您使用強制推送的本機分支的提交。

  1. 在 [Git 變更] 視窗中,選取推送按鈕以提交您的更改。

    Visual Studio [Git 變更] 視窗中向上箭頭按鈕的截圖。

    或者,您可以從 [Git] 功能表中選取 [推送]。

    Visual Studio 中 Git 功能表中 [推送] 選項的螢幕快照。

  2. 如果預設 Git 推送作業失敗,Visual Studio 會啟動 Git-Push 失敗 對話方塊。 選擇 強制推送

    Visual Studio 中 Git 推送失敗對話框的螢幕快照。

  3. Visual Studio 會在成功推送之後顯示確認訊息。

    Visual Studio 中推播確認訊息的螢幕快照。

互動式重訂基礎以合併本地提交

一般而言,當您在本機功能分支中開發新功能時,您將建立多個提交。 當您準備好發佈新功能時,您可能會想將這些提交合併成單一提交,以簡化提交歷程記錄。 您可以使用互動式 rebase 將多個提交 合併 為單一提交。

Visual Studio 2022 不支援互動式重新配置。 請改用 Git 命令行。

備註

Azure DevOps 使用者可以 壓扁合併,以壓縮拉取請求期間主題分支的提交記錄。

後續步驟