Help us learn about your current experience with the documentation. Take the survey.

合并冲突

  • Tier: Free, Premium, Ultimate
  • Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated

当合并请求中的源分支和目标分支对同一行代码进行了不同的修改时,就会发生合并冲突。在大多数情况下,GitLab 可以自动合并这些更改,但当冲突出现时,你必须决定保留哪些更改。

由于合并冲突而被阻塞的合并请求

要解决带有冲突的合并请求,你必须:

  • 创建一个合并提交。
  • 通过变基(rebase)解决冲突。

GitLab 通过在源分支中创建一个合并提交来解决冲突,而不将其合并到目标分支。然后你可以审查和测试这个合并提交,确保它不包含意外更改且不会破坏你的构建。

了解冲突块

当 Git 检测到需要你做出决策的冲突时,它会使用冲突标记来标记冲突块的开始和结束:

  • <<<<<<< HEAD 标记冲突块的开始。
  • 显示你的更改。
  • ======= 标记你的更改的结束。
  • 显示目标分支的最新更改。
  • >>>>>>> 标记冲突的结束。

要解决冲突,请删除:

  1. 你不想保留的冲突行版本。
  2. 三个冲突标记:开始标记、结束标记,以及两个版本之间的 ======= 行。

可以在用户界面中解决的冲突

如果冲突文件满足以下条件,你可以在 GitLab UI 中解决合并冲突:

  • 是非二进制文本文件。
  • 添加冲突标记后大小小于 200 KB。
  • 使用 UTF-8 兼容编码。
  • 不包含冲突标记。
  • 在两个分支中存在于相同路径下。

如果文件不满足这些条件,你必须手动解决冲突。

冲突解决方法

GitLab 在用户界面中显示可解决的冲突,你也可以使用以下方法解决冲突:

  • 交互模式:最适合只需要选择保留哪一行版本的冲突。
  • 行内编辑器:适合需要手动编辑来融合更改的复杂冲突。
  • 命令行:为复杂冲突提供完全控制。更多信息,请参阅从命令行解决冲突

交互模式

交互模式将目标分支与你的选定更改合并到源分支中。

使用交互模式解决合并冲突:

  1. 在左侧边栏,选择搜索或跳转并找到你的项目。

  2. 选择代码 > 合并请求并找到该合并请求。

  3. 选择概览,然后滚动到合并请求报告部分。

  4. 找到合并冲突消息,然后选择解决冲突。 GitLab 显示带有合并冲突的文件列表。冲突的行会被高亮显示。

  5. 对于每个冲突,选择使用我们的使用他们的来标记你想要保留的冲突行版本。这个决策被称为"解决冲突"。

  6. 当你解决了所有冲突后,输入提交消息

  7. 选择提交到源分支

行内编辑器

一些合并冲突更加复杂,你必须手动编辑行来解决它们。

合并冲突解决编辑器可以帮助你在 GitLab 中解决这些冲突:

  1. 在左侧边栏,选择搜索或跳转并找到你的项目。

  2. 选择代码 > 合并请求并找到该合并请求。

  3. 选择概览,然后滚动到合并请求报告部分。

  4. 找到合并冲突消息,然后选择解决冲突。 GitLab 显示带有合并冲突的文件列表。

  5. 找到要手动编辑的文件,然后滚动到冲突块。

  6. 在该文件的标题中,选择行内编辑以打开编辑器。在此示例中,冲突块从第 1350 行开始,到第 1356 行结束:

    合并冲突编辑器

  7. 解决冲突后,输入提交消息

  8. 选择提交到源分支

变基

如果你的合并请求卡在"正在检查自动合并能力"消息,你可以:

要排查 CI/CD 管道问题,请参阅调试 CI/CD 管道

在 GitLab UI 中进行变基

要从 GitLab UI 触发变基,使用 /rebase 快速操作,或合并请求组件中的变基选项。

先决条件:

  • 不存在合并冲突。
  • 你必须对源项目拥有至少 开发者角色
  • 如果合并请求位于 fork 中,该 fork 必须允许来自上游项目成员的提交 allow_collaboration.md

要从 GitLab UI 对合并请求的分支进行变基:

  1. 在左侧边栏,选择搜索或跳转并找到你的项目。
  2. 选择代码 > 合并请求并找到该合并请求。
  3. 选择以下任一方式:
    • 概览选项卡上,滚动到合并请求组件并选择变基源分支
    • 在评论中,输入 /rebase 并选择评论

GitLab 会安排然后运行分支相对于默认分支的变基。 GitLab 将完成的变基显示为系统备注。

如果你为通过 GitLab UI 创建的提交配置了提交签名,Web 提交会在通过 UI 进行变基时失去其提交签名。

相关主题