GitLab 合并请求选项说明

本文档用通俗易懂的方式解释 GitLab Merge Request 的各种配置选项

📋 目录


🔀 合并方法 (Merge Method)

1. Merge commit(合并提交)

工作方式:每次合并都会创建一个新的合并提交

提交历史示例

主分支: A --- B --- C ----------- G (合并提交)
                     \         /
功能分支:              D - E - F

特点

  • ✅ 完整保留所有历史记录
  • ✅ 可以清楚看到哪些提交是从分支合并来的
  • ❌ 历史记录可能比较复杂

适用场景

  • 大型项目需要完整历史追溯
  • 需要明确区分不同功能模块的开发历史

2. Merge commit with semi-linear history(半线性历史合并)

工作方式:要求先 rebase 到最新代码,然后创建合并提交

提交历史示例

主分支: A --- B --- C --------------- G (合并提交)
                         \         /
功能分支:                  D' - E' - F' (已更新到最新)

特点

  • ✅ 保持相对清晰的历史
  • ✅ 避免交叉合并造成的混乱
  • ⚠️ 有冲突时需要手动 rebase

适用场景

  • 推荐用于团队协作
  • 多人同时开发不同功能
  • 需要保持主分支历史清晰

3. Fast-forward merge(快进合并)

工作方式:不创建合并提交,直接把分支提交接到主分支后面

提交历史示例

主分支: A --- B --- C --- D --- E --- F (线性延伸)

特点

  • ✅ 最简洁的提交历史
  • ✅ 没有额外的合并提交
  • ❌ 无法看出哪些是合并来的
  • ⚠️ 必须先 rebase 到最新

适用场景

  • 个人项目或小型团队
  • 追求极简的提交历史
  • 线性开发流程

⚙️ 合并选项 (Merge Options)

1. 自动解决过时的讨论

说明:当代码被修改后,相关的评论讨论会自动标记为已解决

示例场景

代码审查者:这里有个拼写错误 "usre" → "user"
    ↓
你修改了代码
    ↓
系统自动将讨论标记为 ✅ 已解决

推荐:✅ 开启,减少手动操作


2. 显示创建 MR 的命令行链接

说明:当你在命令行 push 代码时,会显示创建 MR 的快捷链接

示例

$ git push origin feature-login
...
remote:
remote: To create a merge request for feature-login, visit:
remote:   https://gitlab.com/your-project/-/merge_requests/new?merge_request[source_branch]=feature-login
remote:

推荐:✅ 开启,提高工作效率


3. 默认启用"删除源分支"选项

说明:MR 合并后,自动删除功能分支

示例

合并前:main, feature-login, feature-logout
    ↓
合并 feature-login 后
    ↓
合并后:main, feature-logout (feature-login 已删除)

推荐:✅ 开启,保持仓库整洁

注意:受保护的分支不会被删除


4. Squash commits(压缩提交)

说明:将功能分支的多个提交压缩成一个提交

示例场景

原始提交(10个零散提交)

- feat: 添加登录功能
- fix: 修复bug
- fix: 再修复一次
- style: 格式化代码
- docs: 补充注释
- fix: 修复拼写错误
- test: 添加测试
- fix: 修复测试
- refactor: 优化代码
- chore: 更新依赖

压缩后(1个清晰提交)

- feat: 添加登录功能 (#123)
  包含完整的功能实现、测试和文档
四种 Squash 选项对比
选项 行为 合并按钮 推荐场景
Do not allow 禁止压缩 复选框隐藏 需要保留完整历史的项目
Allow 允许压缩 复选框显示,默认不勾选 灵活处理,由开发者决定
Encourage 鼓励压缩 复选框显示,默认勾选 推荐 - 团队协作项目
Require 强制压缩 复选框勾选且不可更改 严格要求简洁历史的项目

推荐Encourage - 保持主分支清晰,但允许特殊情况


✅ 合并检查 (Merge Checks)

1. Pipelines must succeed(流水线必须成功)

说明:只有当 CI/CD 流水线全部通过时,才允许合并

示例

CI/CD 流水线:
  ❌ 单元测试失败        → 不能合并
  ❌ 代码规范检查失败    → 不能合并
  ❌ 构建失败            → 不能合并
  ✅ 所有检查通过        → 可以合并

推荐:✅ 强烈推荐开启,防止有问题的代码进入主分支

如何配置 Pipeline 检查

在项目的 .gitlab-ci.yml 文件中配置代码质量检查:

stages:
  - lint # 代码检查阶段
  - build
  - deploy

# ESLint 代码检查
eslint:
  stage: lint
  rules:
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' # 仅在 MR 时运行
  script:
    - pnpm install
    - pnpm run lint
  allow_failure: false # 失败则阻止合并

# Prettier 格式检查
prettier:
  stage: lint
  rules:
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
  script:
    - pnpm install
    - pnpm run format:check
  allow_failure: false

效果:在创建 MR 时,会自动运行这些检查,只有全部通过才能合并

子选项:Skipped pipelines are considered successful

说明:如果流水线被跳过,也视为成功

风险:⚠️ 可能会让未经测试的代码合并进来

推荐:❌ 不建议开启


2. All discussions must be resolved(所有讨论必须解决)

说明:代码审查中的所有评论和讨论都必须解决后才能合并

示例场景

审查者评论:"这个函数的逻辑有问题,建议重构"
    ↓
情况 A:你不回复 → ❌ 无法合并
情况 B:你回复但不点"解决" → ❌ 无法合并
情况 C:你修改代码并点击"解决" → ✅ 可以合并

推荐:✅ 强烈推荐开启,确保代码审查意见被处理


💡 小白推荐配置

适合团队协作的最佳配置

🔀 合并方法:
  选择: Merge commit with semi-linear history
  理由: 保持清晰历史,适合多人协作

⚙️ 合并选项:
  ✅ 自动解决过时的讨论
  ✅ 显示创建 MR 的命令行链接
  ✅ 默认启用"删除源分支"
  ✅ Squash commits: Encourage
     理由: 鼓励压缩但保留灵活性

✅ 合并检查:
  ✅ Pipelines must succeed
     ❌ Skipped pipelines considered successful (不勾选)
  ✅ All discussions must be resolved
  理由: 保证代码质量和审查质量

📚 常见问题

Q1: Rebase 是什么?

A: 把你的提交"移动"到最新的主分支上,避免合并冲突

Q2: 什么时候需要 Squash?

A: 当你的开发过程中有很多"临时提交"、"修复拼写"等零散提交时

Q3: Merge commit 和 Fast-forward 怎么选?

A:

  • 团队协作 → Merge commit with semi-linear history
  • 个人项目 → Fast-forward merge

Q4: 强制要求所有讨论解决会不会太严格?

A: 不会。这能确保代码审查不走过场,提高代码质量


🎯 快速决策树

你的项目类型是?
│
├─ 个人项目/小团队 (< 3人)
│   └─ Fast-forward merge + Allow squash
│
├─ 中小型团队 (3-10人)
│   └─ Merge commit with semi-linear + Encourage squash
│
└─ 大型团队 (> 10人)
    └─ Merge commit with semi-linear + Require squash

所有项目都建议:
✅ Pipelines must succeed
✅ All discussions must be resolved

📦 本项目实战配置

已实现的 CI/CD Pipeline 检查

本项目已配置完整的代码质量检查流水线:

流水线阶段
stages:
  - lint # 代码质量检查(ESLint + Prettier)
  - build # 构建应用
  - docker # 构建 Docker 镜像
  - deploy # 部署到 Kubernetes

# ESLint 代码检查
eslint:
  stage: lint
  rules:
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' # 仅在 MR 时运行
    - if: '$CI_COMMIT_REF_NAME == "dev"'
  cache:
    key:
      files:
        - pnpm-lock.yaml
    paths:
      - node_modules/
  before_script:
    - npm install -g pnpm@10 --registry=https://registry.npmmirror.com/
    - pnpm install --registry=https://registry.npmmirror.com/ --frozen-lockfile
  script:
    - echo "Running ESLint..."
    - pnpm run lint
  allow_failure: false # 检查失败则阻止合并

# Prettier 格式检查
prettier:
  stage: lint
  rules:
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' # 仅在 MR 时运行
    - if: '$CI_COMMIT_REF_NAME == "dev"'
  cache:
    key:
      files:
        - pnpm-lock.yaml
    paths:
      - node_modules/
  before_script:
    - npm install -g pnpm@10 --registry=https://registry.npmmirror.com/
    - pnpm install --registry=https://registry.npmmirror.com/ --frozen-lockfile
  script:
    - echo "Running Prettier check..."
    - pnpm run format:check
  allow_failure: false # 检查失败则阻止合并
代码检查 Jobs

1. ESLint 检查

  • 触发条件:Merge Request 或主要分支(dev/test/staging/master)
  • 检查内容:代码规范、潜在错误、最佳实践
  • 失败策略:allow_failure: false - 检查失败则阻止合并

2. Prettier 检查

  • 触发条件:Merge Request 或主要分支
  • 检查内容:代码格式是否统一
  • 失败策略:allow_failure: false - 检查失败则阻止合并
本地开发命令
# 运行 ESLint 检查
pnpm run lint

# 运行 Prettier 检查(不修复)
pnpm run format:check

# 同时运行 ESLint 和 Prettier 检查
pnpm run lint:check

# 自动修复格式问题
pnpm run format
工作流程示例
开发者提交代码
    ↓
创建 Merge Request
    ↓
自动触发 Pipeline
    ├─ ESLint 检查 ──┐
    └─ Prettier 检查 ─┤
                      ↓
    ✅ 全部通过 → 可以合并
    ❌ 有失败 → 必须修复后才能合并
GitLab 项目设置建议

Settings > Merge requests 中配置:

合并方法: Merge commit with semi-linear history
合并选项:
  ✅ Enable "Delete source branch" option by default
  ✅ Squash commits: Encourage

合并检查:
  ✅ Pipelines must succeed
  ❌ Skipped pipelines are considered successful (不勾选)
  ✅ All discussions must be resolved

这样配置后,每次创建 MR 时都会自动进行代码质量检查,确保代码规范统一。


文档更新时间: 2026年3月2日

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐