解决合并冲突

Azure DevOps Services | Azure DevOps Server 2020 | Azure DevOps Server 2019 | TFS 2018

Visual Studio 2022 |Visual Studio 2019 |Visual Studio 2017 |Visual Studio 2015

合并或重新设置基时,你将告诉 Git 将一个分支上所做的更改与对另一个分支所做的更改集成。 通常,Git 会在无需帮助的情况下自动完成合并或重新基地。 但是,如果 Git 发现对一个分支所做的更改与对另一个分支所做的更改发生冲突,则会提示你解决冲突。 如果合并的分支以不同的方式编辑同一文件行,或者当一个分支修改一个文件和另一个分支删除文件时,可能会出现合并冲突。 解决合并冲突的过程适用于 Git 合并和存储库。

可以在 Visual Studio 中或通过命令行和任何文本编辑器解决合并冲突。

有关 Git 工作流的概述,请参阅 Azure Repos Git 教程

本文提供以下任务的过程:

  • 了解合并冲突
  • 解决合并冲突

了解合并冲突

Git 合并或重新base 将源分支中的提交集成到当前本地分支中, (目标分支) 。 Git 合并 执行 快速转发无快速转发 合并。 无快进合并也称为 三向 合并或 true 合并。 Git 存储库 是另一种类型的合并。 下图显示了这些合并类型。

显示使用 Git 合并和 Git 存储库时提交前后的示意图。

对于 Git 合并,如果源分支中存在目标分支的提示,则默认合并类型将是快速转发合并。 否则,默认合并类型将是无快速转发合并。

如果目标分支的提示与源分支不同, 则快速转发 合并永远不能发生合并冲突,因为 Git 不会应用快速转发合并。 默认情况下,Git 尽可能使用快速转发合并。 例如,Git 将在仅通过从远程对应分支拉取来更新的本地分支上应用快速转发合并。

无快进合并生成新的目标分支“合并提交”,用于将源分支更改与目标分支更改集成。 适用的更改是在对两个分支通用的最后一次提交之后进行的更改。 在上图中,提交 C 是两个分支中的最后一个常见提交。 如果任何源分支更改与任何目标分支更改冲突,Git 将提示你解决合并冲突。 合并提交 (L) 包含集成的源分支和目标分支更改。 源和目标分支提示 (K 和 E) 是合并提交的父级。 在分支的 提交历史记录中,合并提交是合并操作的有用标记,并清楚地显示合并了哪些分支。

Git 重新设定 目标分支的提交历史记录,使其包含所有源分支提交,后跟自上次通用提交以来的所有目标分支提交。 在上图中,提交 C 是两个分支中的最后一个常见提交。 另一种查看方法是,在源分支历史记录的顶部重播目标分支中的更改。 如果任何源分支更改与任何目标分支更改冲突,Git 将提示你解决合并冲突。 与快速转发合并一样,存储库不会创建合并提交。 值得注意的是,重新基会更改现有目标分支提交的顺序,而其他合并策略的情况并非如此。 在上图中,提交 K 包含与 K 相同的更改,但具有新的提交 ID,因为它链接回提交 E 而不是 C。

Git 合并和重新基地仅修改目标分支 - 源分支保持不变。 遇到一个或多个合并冲突时,必须解决这些问题才能完成合并或重新基。 或者,可以取消合并/重新基地操作,并将目标分支返回到其以前的状态。

有关合并选项和策略的详细信息,请参阅 Git 参考手册Git 合并策略

何时解决合并冲突

Git 合并 和 Git 存储库Git 工作流中广泛使用。 处理本地功能或 bugfix 分支时,通常做法是:

  1. 定期拉取和合并远程提交,使本地main分支保持最新状态。
  2. 使用存储库或合并将本地 main 分支更新集成到本地功能分支中。
  3. 通过将工作 推送 到相应的远程分支,在本地功能分支上备份工作。
  4. 在功能完成时,创建 拉取请求 ,将远程功能分支合并到远程 main 分支中。

通过经常将远程更改集成到本地存储库中,可以随时了解其他人的最新工作,并及时解决出现的任何合并冲突。

解决合并冲突

解决合并冲突的过程适用于 Git 合并和 Git 存储库。 尽管以下步骤介绍了如何在合并期间解决合并冲突,但可以在重新基期间同样解决合并冲突。

提示

如果源分支是 远程跟踪 分支,请确保在合并之前运行 Git 提取 ,确保分支是最新的。 或者,运行 Git 拉取 命令,该命令将 Git 提取与 Git 合并相结合。

Visual Studio 2019 版本 16.8 及更高版本提供 Git 版本控制体验,同时维护 团队资源管理器 Git 用户界面。 若要使用 团队资源管理器,请从菜单栏中取消选中 “工具>选项>预览功能>”新增 Git 用户体验 。 可以从任一接口互换使用 Git 功能。 下面,我们并行比较了如何在 Git 合并期间解决合并冲突。

Visual Studio Git

  1. “Git 存储库”窗口的“分支”窗格中,签出目标分支。 然后右键单击源分支,然后选择“将源分支合并<到 <target-branch>>”。

Visual Studio 2019 Git 存储库窗口中分支上下文菜单中“合并”选项的屏幕截图。

  1. 如果 Git 因冲突而停止合并,Visual Studio 将通知你。 在这种情况下,可以解决冲突,也可以取消合并并返回到合并前状态。 “Git 更改”窗口的“未合并更改”部分列出了合并冲突的文件。 对于内容中存在合并冲突的文件,请双击该文件,在合并编辑器中将其打开。

Visual Studio 2019 的 Git 更改窗口中包含合并冲突的文件的屏幕截图。

  1. 在合并编辑器中, 传入 窗格显示源分支文件版本、 “当前 ”窗格显示目标分支文件版本,“ 结果 ”窗格显示生成的合并文件。 若要应用特定的源或目标分支更改,请选择要保留的冲突行旁边的复选框 () 。 还可以直接在 “结果 ”窗格中编辑合并文件。 解决当前文件中的所有合并冲突后,选择 “接受合并 ”。 对包含内容冲突的每个文件重复此步骤。

Visual Studio 2019 中合并编辑器的屏幕截图。

  1. 对于在一个分支中编辑并删除另一个分支的文件,请右键单击该文件并选择所需的分支操作。

Visual Studio 2019 Git 更改窗口中冲突文件的上下文菜单的屏幕截图。

  1. 在“Git 更改”窗口中,输入提交消息,然后选择 “提交暂存 ”以完成合并 -- 解决所有文件的合并冲突后。

Visual Studio 2019 的 Git 更改窗口中提交消息和提交暂存按钮的屏幕截图。

Visual Studio 团队资源管理器

  1. 团队资源管理器“分支”视图中,签出目标分支。 然后右键单击源分支,然后选择 “合并发件人”。

Visual Studio 2019 中团队资源管理器分支视图中分支合并选项的屏幕截图。

  1. 验证合并选项,然后单击“ 合并”。

Visual Studio 2019 中团队资源管理器分支视图中合并详细信息的屏幕截图。

  1. 如果 Git 因冲突而停止合并,Visual Studio 将通知你。 在这种情况下,可以解决冲突,也可以取消合并并返回到合并前状态。 若要解决冲突,请选择 “冲突 ”以打开 “解决冲突” 视图。

Visual Studio 2019 中团队资源管理器分支视图中合并冲突消息的屏幕截图。

  1. “解决冲突”视图列出了合并冲突的文件。 从列表中选择一个文件以查看该文件的解析选项。

Visual Studio 2019 中团队资源管理器“解决冲突”视图中“冲突”列表的屏幕截图。

  1. 对于内容中存在合并冲突的文件,请选择 “合并 ”以在合并编辑器中将其打开。

Visual Studio 2019 中团队资源管理器的“解决冲突”视图中“合并”按钮的屏幕截图。

  1. 在合并编辑器中, “源 ”窗格显示源分支文件版本、 “目标 ”窗格显示目标分支文件版本,“ 结果 ”窗格显示生成的合并文件。 若要应用特定的源或目标分支更改,请选择要保留的冲突行旁边的复选框 () 。 还可以直接在 “结果 ”窗格中编辑合并文件。 解决当前文件中的所有合并冲突后,选择 “接受合并 ”。 对包含内容冲突的每个文件重复此步骤。

Visual Studio 2019 中团队资源管理器的合并编辑器的屏幕截图。

  1. 对于在一个分支中编辑并删除另一个分支的文件,请选择所需的分支操作。

Visual Studio 2019 中团队资源管理器的“解决冲突”视图中冲突文件的合并选项的屏幕截图。

  1. “解决冲突 ”视图中,在解决所有文件的合并冲突后,选择 “提交合并 ”。

Visual Studio 2019 中团队资源管理器的“解决冲突”视图中“提交合并”按钮的屏幕截图。

  1. 团队资源管理器“更改”视图中,输入提交消息,然后选择“提交暂存”以完成合并。

Visual Studio 2019 中团队资源管理器的“更改”视图中“提交暂存”按钮的屏幕截图。

后续步骤