解決合併衝突
Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019
Visual Studio 2019 |Visual Studio 2022
當您 合併或重新基底時,您會告訴 Git 整合一個分支上所做的變更,以及對另一個分支所做的變更。 Git 通常會自動完成合併或重新基底,而不需要您的協助。 不過,如果 Git 發現某個分支上所做的變更與另一個分支上的變更發生衝突,則會提示您解決衝突。 當合併的分支以不同的方式編輯相同的檔案行,或當某個分支修改檔案,而另一個分支刪除它時,就會發生合併衝突。 解決合併衝突的程式同時適用於 Git 合併和重新基底。
您可以在 Visual Studio 中解決合併衝突,或使用命令行和任何文字編輯器。
如需 Git 工作流程的概觀,請參閱 Azure Repos Git 教學課程。
先決條件
類別 | 需求 |
---|---|
專案存取 | 專案的成員。 |
許可 | - 在私人項目中檢視程式碼:至少 基本 權限。 - 複製或貢獻私人專案中的程式碼:作為 貢獻者 安全群組的成員或在專案中具有相應的許可權。 - 設定分支或存放庫許可權:管理分支或存放庫的許可權 許可權。 - 變更預設分支:編輯原則 存放庫的許可權。 - 匯入存放庫:專案管理員成員 安全組或 Git 專案層級 建立存放庫 許可權設定為 允許。 如需詳細資訊,請參閱 設定 Git 存放庫許可權。 |
服務 | 啟用 Repos。 |
工具 | 選擇性。 使用 az repos 命令:Azure DevOps CLI。 |
備註
在公用專案中,具有 項目關係人 存取權的使用者具有 Azure Repos 的完整存取權,包括檢視、複製及參與程式代碼。
瞭解合併衝突
Git 合併或重整基底(rebase)會將來源分支的提交整合到您目前的本機分支(目標分支)。 Git 合併 會執行 快轉 或 非快轉 合併。 no-fast-forward 合併也稱為 三向合併 或 true 合併。 Git 變基 是另一種合併方式。 下圖顯示這些合併類型。
針對 Git 合併,如果目標分支的尖端存在於來源分支內,預設合併類型將會是快進合併。 否則,預設合併類型會是無快速向前合併。
快速轉寄 合併永遠不能發生合併衝突,因為如果目標分支的提示與來源分支不同,Git 將不會套用快速向前合併。 根據預設,Git 會盡可能使用快速前進合併。 例如,Git 會在本機分支上套用快速轉送合併,而您只藉由從遠端對應分支提取來進行更新。
no-fast-forward 合併會產生新的目標分支「合併提交」,用來整合來源分支的變更與目標分支的變更。 相關的變更是在兩個分支共同的最後一次提交記錄之後進行的變更。 在上圖所示中,commit C 是兩個分支中最後一個共同提交。 如果任何來源分支變更與任何目標分支變更衝突,則 Git 會提示您解決合併衝突。 合併提交(L)包含整合的來源分支和目標分支的變更。 來源和目標分支末端(K 和 E)是合併提交的父代。 在您的分支 的提交歷程記錄中,合併提交是合併操作的實用標記,並清楚顯示出哪些分支已被合併。
Git 重新基底 重新設定目標分支的認可歷程記錄,使其包含所有來源分支認可,後面接著自上次一般認可之後的所有目標分支認可。 在上圖中,commit C 是兩個分支中最後的共同 commit。 另一種看法是,rebase 就是將目標分支中的變更回放到來源分支的歷程記錄之上。 如果任何來源分支變更與任何目標分支變更衝突,則 Git 會提示您解決合併衝突。 如同快進合併,變基不會建立合併提交。 值得注意的是,rebase 會改變現有目標分支提交的順序,這不是其他合併策略的情況。 在上圖中,commit K' 包含與 K 相同的變更,但有新的提交 ID,因為它指向提交 E,而不是 C。
Git 合併和重新基底只會修改目標分支,來源分支會保持不變。 當您遇到一或多個合併衝突時,您必須加以解決,才能完成合併或重新基底。 或者,您可以取消合併/重新基底作業,並將目標分支傳回其先前的狀態。
如需合併選項和策略的詳細資訊,請參閱 Git 參考手冊 和 Git 合併策略。
解決合併衝突的時機
Git 合併 和 Git 變基 在 Git 工作流程中廣泛使用。 在處理在地功能或修復分支時,這是常見的作法:
- 定期 拉取 來抓取和合併遠端提交,讓您的本機
main
分支與其遠端對應保持同步更新。 - 使用變基或合併,將本機
main
分支更新整合到您的本機功能分支。 - 將 推送至對應的遠端分支,以備份您在本機功能分支上的工作。
- 在功能完成時,建立 提取要求,將您的遠端功能分支合併至遠端
main
分支。
藉由經常將遠端變更整合到本機存放庫,您可以隨時瞭解其他人最近的工作,並及時解決任何出現的合併衝突。
解決合併衝突
解決合併衝突的流程同時適用於 Git 合併和 Git 重置基底。 雖然下列步驟描述如何在合併中解決合併衝突,但您也可以在再基底化時解決合併衝突。
Visual Studio 2022 提供 Git 版本控制體驗,方法是使用 Git 功能表、Git 變更,以及透過 方案總管 中的操作功能表。 Visual Studio 2019 16.8 版也提供 Team Explorer Git 使用者介面。 如需詳細資訊,請參閱 Visual Studio 2019 - Team Explorer 索引標籤。
在 [Git 存放庫] 視窗的 [分支] 窗格中,檢出目標分支。 然後在來源分支上按下滑鼠右鍵,然後選擇 [將來源分支 <> 合併至 <target-branch>。
如果 Git 因衝突而停止合併,Visual Studio 將會通知您。 在該事件中,您可以解決衝突,或取消合併並返回合併前狀態。 未合併的變更 區段位於 Git 變更 視窗的 中,列出有合併衝突的檔案。 針對內容中有合併衝突的檔案,按兩下檔案以在合併編輯器中開啟它。
在合併編輯器中,[傳入] 窗格會顯示來源分支檔案版本、[目前] 窗格會顯示目標分支檔案版本,而 [結果] 窗格會顯示結果合併檔案。 若要套用特定的來源或目標分支變更,請選取您要保留之衝突行旁的複選框。 您也可以直接在 結果 窗格中編輯合併檔案。 在解決目前檔案中的所有合併衝突之後,選擇 接受合併。 針對內容衝突的每個檔案重複此步驟。
針對在一個分支中編輯並在另一個分支中刪除的檔案,以滑鼠右鍵按下該檔案,然後選擇您想執行的分支操作。
在 [Git 變更] 視窗中,輸入認可訊息,然後選擇 [認可分段 完成合併— 解決所有檔案的所有合併衝突之後。