合并方法

您为项目选择的合并方法决定了合并请求中的更改如何合并到现有分支中。

配置项目的合并方法

  1. 在顶部栏上,选择 菜单 > 项目 并找到您的项目。
  2. 在左侧边栏中,选择 设置 > 合并请求
  3. 合并方法 部分,选择您想要的合并方法。
  4. 选择 保存修改

合并提交

此设置是默认设置,即使使用压缩,也总是创建一个单独的合并提交。使用此合并方法生成的示例提交图:

gitGraph commit id: "Init" branch mr-branch-1 commit checkout main commit branch mr-branch-2 commit checkout mr-branch-1 commit checkout main branch squash-mr commit id: "Squashed commits" checkout main merge squash-mr merge mr-branch-1 commit merge mr-branch-2
  • 对于常规合并,它相当于命令 git merge --no-ff <source-branch>
  • 对于压缩合并,它会在正常合并之前压缩源分支中的所有提交,执行类似于以下的操作:

    git checkout `git merge-base <source-branch> <target-branch>`
    git merge --squash <source-branch>
    SOURCE_SHA=`git rev-parse HEAD`
    git checkout <target-branch>
    git merge --no-ff $SOURCE_SHA
    

合并提交与半线性历史记录

每次合并都会创建一个合并提交,但只有在可以进行快进合并时才会合并分支,这确保了如果合并请求构建成功,则目标分支构建在合并后也成功。使用此合并方法生成的示例提交图:

gitGraph commit id: "Init" branch mr-branch-1 commit commit checkout main merge mr-branch-1 branch mr-branch-2 commit commit checkout main merge mr-branch-2 commit branch squash-mr commit id: "Squashed commits" checkout main merge squash-mr

当您访问选择了“合并提交与半线性历史记录”方法的合并请求页面时,仅当可以进行快进合并时,您可以接受它。 当无法进行快进合并时,用户可以选择变基,请参阅(半)线性合并方法中的变基

此方法等效于合并提交方法中的相同 Git 命令。但是,如果您的源分支基于目标分支的过时版本(例如 main),则必须重新定位源分支。 这种合并方法创建了一个看起来更清晰的历史记录,同时仍然使您能够查看每个分支的开始和合并位置。

快进式合并

有时,工作流程规则可能会要求一个干净的提交历史,而不需要合并提交。在这种情况下,快进式合并是合适的。使用快进式合并请求,您可以保留线性 Git 历史记录,以及在不创建合并提交的情况下接受合并请求的方式。使用此合并方法生成的示例提交图:

gitGraph commit id: "Init" commit id: "Merge mr-branch-1" commit id: "Merge mr-branch-2" commit id: "Commit on main" commit id: "Merge squash-mr"

此方法等效于常规合并的 git merge --ff <source-branch>,以及压缩合并的 git merge --squash <source-branch>

当快进式合并(--ff-only)设置已启用,不创建合并提交并且所有合并都是快进的,这意味着只有当分支可以快进时才允许合并。 当无法进行快进合并时,用户可以选择变基,请参阅(半)线性合并方法中变基

note使用快进式合并策略的项目无法按部署日期过滤合并请求,因为没有创建合并提交。

当您访问选择了“快进式合并”方法的合并请求页面时,仅当可以进行快进合并时,您可以接受它。

Fast-forward merge request

(半)线性合并方法中的变基

在以下合并方法中,您只能在源分支与目标分支保持同步时进行合并:

  • 合并提交与半线性历史记录。
  • 快进式合并。

如果无法进行快进式合并但可以进行无冲突的变基,系统为您提供 /rebase 快速操作,以及使用用户界面进行变基

如果目标分支在源分支之前并且不可能进行无冲突的变基,则必须在本地变基源分支,然后才能进行快进式合并。

Fast forward merge rebase locally

在压缩之前可能需要重新设置 base,即使压缩本身可以被认为等同于重新设置 base。

没有 CI/CD 流水线的变基

  • 引入于 14.7 版本,功能标志为 rebase_without_ci_ui。默认禁用。
  • 一般可用于 15.3 版本,功能标志 rebase_without_ci_ui 已删除。

要在不触发 CI/CD 流水线的情况下重新调整合并请求的分支,请从合并请求报告部分选择 没有流水线的变基。 当无法进行快进合并但可以进行无冲突的变基时,此选项可用。

在没有 CI/CD 流水线的情况下进行变基,可以在需要频繁变基的半线性工作流程的项目中节省资源。

相关话题