解決合併衝突
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 合併 會 執行快速轉寄 或 無快速向前 合併。 無快速向前合併也稱為 三向 合併或 true 合併。 Git rebase 是另一種合併類型。 下圖顯示這些合併類型。
針對 Git 合併,如果目標分支的提示存在於來源分支內,預設合併類型將會是快速向前合併。 否則,預設合併類型會是無快速向前合併。
如果目標分支的提示與來源分支不同,則快轉合併永遠不能發生合併衝突,因為 Git 不會套用快速轉送合併。 根據預設,Git 會盡可能使用快速轉寄合併。 例如,Git 會在本機分支上套用快速轉送合併,而您只藉由從遠端對應分支提取來進行更新。
無快速向前合併會產生新的目標分支「合併認可」,以整合來源分支變更與目標分支變更。 適用的變更是在兩個分支通用的最後一次認可之後進行的變更。 在上圖中,認可 C 是兩個分支中最後一個常見的認可。 如果任何來源分支變更與任何目標分支變更衝突,則 Git 會提示您解決合併衝突。 合併認可 (L) 包含整合式來源分支和目標分支變更。 來源和目標分支秘訣 (K 和 E) 是合併認可的父代。 在分支的認可歷程記錄中,合併認可是合併作業的實用標記,並清楚地顯示哪些分支已合併。
Git rebase 會重新設定目標分支的認可歷程記錄,使其包含所有來源分支認可,後面接著自上次一般認可之後的所有目標分支認可。 在上圖中,認可 C 是兩個分支中最後一個常見的認可。 另一個檢視方法是,重新基底會在來源分支歷程記錄上方重新執行目標分支中的變更。 如果任何來源分支變更與任何目標分支變更衝突,則 Git 會提示您解決合併衝突。 如同快速向前合併,重新基底不會建立合併認可。 值得注意的是,重新基底會變更現有目標分支認可的順序,這不是其他合併策略的情況。 在上圖中,commit K' 包含與 K 相同的變更,但有新的認可標識碼,因為它會連結回認可 E,而不是 C。
Git 合併和重新基底只會修改目標分支,來源分支會保持不變。 當您遇到一或多個合併衝突時,您必須加以解決,才能完成合併或重新基底。 或者,您可以取消合併/重新基底作業,並將目標分支傳回其先前的狀態。
如需合併選項和策略的詳細資訊,請參閱 Git 參考手冊 和 Git 合併策略。
解決合併衝突的時機
Git 合併和 Git rebase 在 Git 工作流程中廣泛使用。 在處理本機功能或 Bugfix 分支時,常見的作法是:
- 定期提取以擷取和合併遠端認可,讓您的本機
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 存放庫] 視窗的 [分支] 窗格中,簽出目標分支。 然後以滑鼠右鍵按兩下來源分支,然後選擇 [將source-branch合併<至 <target-branch>>]。
如果 Git 因衝突而停止合併,Visual Studio 將會通知您。 在該事件中,您可以解決衝突,或取消合併並返回合併前狀態。 [Git 變更] 視窗的 [未合併的變更] 區段會列出合併衝突的檔案。 針對內容中有合併衝突的檔案,按兩下檔案以在合併編輯器中開啟它。
在合併編輯器中 ,[傳入 ] 窗格會顯示來源分支檔案版本、 [目前 ] 窗格會顯示目標分支檔案版本,[ 結果 ] 窗格會顯示結果合併檔案。 若要套用特定的來源或目標分支變更,請選取您要保留之衝突行旁的複選框。 您也可以直接編輯 [結果] 窗格中的合併檔案。 在解決目前檔案中的所有合併衝突之後,選擇 [ 接受合併 ]。 針對內容衝突的每個檔案重複此步驟。
針對在一個分支中編輯並刪除另一個分支的檔案,以滑鼠右鍵按下檔案,然後選取您想要的分支動作。
在 [Git 變更] 視窗中,輸入認可訊息,然後選擇 [認可暫存 ] 以完成合併,在您解決所有檔案的所有合併衝突之後。