# 合并请求

如果使用 project_full_path,确保 project_full_path 编码过,例子:/api/v3/projects/tencent/code--> /api/v3/projects/tencent%2Fcode (/ 编码 %2F)

MR 状态值(state)说明:
opened:MR 当前是打开的
closed:MR 已经被人为关闭
merged:MR 的代码内容已经正常合并
reopened:MR 从 closed 重新被打开
locked:MR 合并中,锁定

# 新增合并请求

在项目中创建一个合并请求

  • 审批人规则:-1:所有评审人通过,1:单评审通过,2+:多评审通过 (用>=2 的数字代表需要几位必要评审人通过)。

  • 必要审批人规则:-1:所有必要评审人通过,1:单必要评审通过,2+:多必要评审通过 (用>=2 的数字代表需要几位必要评审人通过),0: 不需要必要评审人即可通过。

POST /api/v3/projects/:id/merge_requests

参数:

参数 类型 描述
id integer or string 项目 ID 或 项目全路径 project_full_path
source_branch string 源分支
target_branch string 目标分支
title string 合并请求的标题
assignee_id integer(可选) 负责人 id
description string(可选) 合并请求的描述
target_project_id integer(可选) 目标项目的 id
labels string(可选) 合并请求的标签,多个请用英文逗号分隔
reviewers string(可选) 评审人 id (只能是 id。多个评审人请用英文逗号分隔)
necessary_reviewers string(可选) 必要评审人 id (只能是 id。多个评审人请用英文逗号分隔)
approver_rule integer(可选) 评审人规则
necessary_approver_rule integer(可选) 必要评审人规则
selected_files array of string (可选) 传重点文件路径数组,参数为空时默认所有都是重点文件

返回值:

{
    "id": 25563,
    "title": "merge request title",
    "target_project_id": 12321,
    "target_branch": "master",
    "source_project_id": 12321,
    "source_branch": "branch1",
    "state": "opened",
    "iid": 5,
    "description": "desc",
    "created_at": "2015-03-21T06:26:38+0000",
    "updated_at": "2015-03-21T06:26:38+0000",
    "resolved_at": null,
    "labels": [],
    "assignee": null,
    "author": {
        "id": 1055,
        "name": "jim",
        "username": "jim",
        "state": "active",
        "avatar_url": null
    },
    "milestone": {
        "id": 1103,
        "project_id": 12321,
        "title": "milestone1",
        "state": "active",
        "iid": 1,
        "due_date": null,
        "created_at": "2012-10-15T06:02:45+0000",
        "updated_at": "2012-10-15T06:02:45+0000",
        "description": "milestone1"
    },
    "project_id": 29723,
    "work_in_progress": false,
    "upvotes": 0,
    "downvotes": 0,
    "has_conflicts": false,
    "resolve_conflicts_url": null
}

# 合并合并请求

在项目内合并某个指定的合并请求,目前支持三种合并类型Create a merge commit(merge)Squash and merge(squash)Rebase and merge(rebase)

PUT /api/v3/projects/:id/merge_request/:merge_request_id/merge

参数:

参数 类型 描述
id integer or string 项目 ID 或 项目全路径 project_full_path
merge_request_id integer 合并请求的 id
merge_type string(可选) 合并的类型,默认值是 merge,可选的值包括 (merge/squash/rebase)
merge_commit_message string(可选) 合并合并请求的描述消息

返回值:

{
    "labels": [],
    "id": 13645071,
    "title": "merge request title",
    "target_project_id": 1212143,
    "target_branch": "master",
    "source_project_id": 1212143,
    "source_branch": "branch1",
    "state": "merged",
    "merge_status": "can_be_merged",
    "commit_check_state": null,
    "commit_check_block": false,
    "iid": 1,
    "description": "desc",
    "created_at": "2023-12-25T06:13:12+0000",
    "updated_at": "2023-12-25T06:19:11+0000",
    "resolved_at": "2023-12-25T06:19:11+0000",
    "merge_type": "Merge",
    "assignee": null,
    "author": {
        "id": 305890,
        "username": "git-user1",
        "web_url": "https://git.tencent.com/u/git—user1",
        "name": "git-user1",
        "state": "active",
        "avatar_url": "GONGFENG HOST@@/uploads/user/avatar/305890/thumb_0-0-240-240_70a761e5b96049668a7bebd2c07df92c.jpeg"
    },
    "merge_commit_sha": "2f5eae63cfe7539a30f5e394b540ef777b343444",
    "milestone": null,
    "necessary_reviewers": null,
    "suggestion_reviewers": null,
    "work_in_progress": false,
    "upvotes": 0,
    "downvotes": 0,
    "project_id": 1212143
}

# 获取合并请求中的提交

获取项目中某个指定合并请求的提交列表(最多返回 120 个提交)

GET /api/v3/projects/:id/merge_request/:merge_request_id/commits

参数:

参数 类型 描述
id integer or string 项目 ID 或 项目全路径 project_full_path
merge_request_id string 合并请求的 ID
page integer(可选) 分页(默认值:1
per_page integer(可选) 每页的项目数, (default: 120, max: 120)

返回值:


[
    {
        "id": "34a677f562eaaeb8a54afe08d65b74165604adda",
        "short_id": "34a677f5",
        "title": null,
        "author_name": "git_user1",
        "author_email": "git_user1@tencent.com",
        "created_at": "2015-10-17T07:24:07+0000",
        "message": "fix"
    },
    {
        "id": "1dfbb3a9d7fcb9a9709f21712f501e9d5835137a",
        "short_id": "1dfbb3a9",
        "title": "branch",
        "author_name": "git_user1",
        "author_email": "git_user1@tencent.com",
        "created_at": "2015-10-18T08:39:49+0000",
        "message": "branch"
    }
]

# 添加合并请求的评论

在指定的合并请求下添加评论

POST /api/v3/projects/:id/merge_request/:merge_request_id/comments

参数:

参数 类型 描述
id integer or string 项目 ID 或 项目全路径 project_full_path
merge_request_id integer 合并请求的 id
note string 评论内容

返回值:

{
    "id": 3564,
    "parent_id": null,
    "body": "note test",
    "attachment": null,
    "author": {
        "id": 11323,
        "username": "git—user1",
        "web_url": "https://git.tencent.com/u/git—user1",
        "name": "git—user1",
        "state": "active",
        "avatar_url": "git.tencent.com/uploads/user/avatar/11323/a75ba2738c7a409cab1d15dd993149aa.jpg"
    },
    "created_at": "2013-03-21T07:38:27+0000",
    "system": false,
    "risk": 0,
    "resolve_state": 0,
    "line_code": null,
    "commit_id": null,
    "file_path": null,
    "note_position": null
}

# 获取合并请求评论列表

获取项目内某个指定合并请求的评论列表

GET /api/v3/projects/:id/merge_request/:merge_request_id/comments

参数:

参数 类型 描述
id integer or string 项目 ID 或 项目全路径 project_full_path
merge_request_id integer 合并请求的 id
page integer 分页(默认值:1
per_page integer 默认页面大小(默认值: 20,最大值: 100

返回值:

[
    {
        "id": 2356,
        "parent_id": null,
        "body": "note test",
        "attachment": null,
        "author": {
            "id": 11323,
            "username": "git—user1",
            "web_url": "https://git.tencent.com/u/git—user1",
            "name": "git—user1",
            "state": "active",
            "avatar_url": "git.tencent.com/uploads/user/avatar/11323/a75ba2738c7a409cab1d15dd993149aa.jpg"
    },
        "created_at": "2013-01-31T06:12:09+0000",
        "system": false,
         "risk": 0,
        "resolve_state": 0,
        "line_code": "8ec9a00bfd09b3190ac6b22251dbb1aa95a0579d_2_1",
        "commit_id": null,
        "file_path": "README.md",
        "note_position": {
            "origin_position": {
                "note_id": 1994887,
                "left_line_num": null,
                "right_line_num": 1,
                "base_commit_sha": "4005aa9208694462804d22ed314127afda8e3098",
                "start_commit_sha": "71a4e53e47ad4b6b20e6ddb13e493c669c4d631d",
                "head_commit_sha": "98886e92114d016d01c8d2b669b6affbaae8d1f1",
                "new_path": "README.md",
                "old_path": "README.md"
            },
            "outdate_position": null,
            "latest_position": {
                "note_id": 1994887,
                "left_line_num": null,
                "right_line_num": 1,
                "base_commit_sha": "4005aa9208694462804d22ed314127afda8e3098",
                "start_commit_sha": "71a4e53e47ad4b6b20e6ddb13e493c669c4d631d",
                "head_commit_sha": "98886e92114d016d01c8d2b669b6affbaae8d1f1",
                "new_path": "README.md",
                "old_path": "README.md"
            }
        },
        "comments": []
    }
]

# 更新合并请求

在项目内更新某个指定的合并请求

PUT /api/v3/projects/:id/merge_request/:merge_request_id

参数:

参数 类型 描述
id integer or string 项目 ID 或 项目全路径 project_full_path
merge_request_id integer 合并请求的 id
target_branch string(可选) 目标分支
assignee_id integer(可选) 负责人 id
title string(可选) 合并请求的标题
state_event string(可选) 新的状态,可选值:(close 或 reopen)
description string(可选) 合并请求的描述
labels string(可选) 合并请求的标签,多个请用英文逗号分隔

返回值:

{
    "id": 38546,
    "title": "merge request update",
    "target_project_id": 12321,
    "target_branch": "master",
    "source_project_id": 12321,
    "source_branch": "branch1",
    "state": "closed",
    "iid": 9,
    "description": "desc",
    "created_at": "2013-01-30T08:24:46+0000",
    "updated_at": "2013-03-21T08:34:44+0000",
    "labels": [],
    "assignee": null,
    "author": {
        "id": 11323,
        "name": "git_user1",
        "username": "git_user1",
        "state": "active",
        "avatar_url": null
    },
    "milestone": {
        "id": 1103,
        "project_id": 12321,
        "title": "milestone1",
        "state": "active",
        "iid": 1,
        "due_date": null,
        "created_at": "2012-11-13T08:06:31+0000",
        "updated_at": "2012-11-13T08:06:31+0000",
        "description": "milestone1"
    },
    "project_id": 29723,
    "work_in_progress": false,
    "upvotes": 0,
    "downvotes": 0
}

# 获取合并请求列表

查询项目的合并请求列表

GET /api/v3/projects/:id/merge_requests
GET /api/v3/projects/:id/merge_requests?state=opened
GET /api/v3/projects/:id/merge_requests?iid=42

参数:

参数 类型 描述
id integer or string 项目 ID 或 项目全路径 project_full_path
iid integer(可选) 项目里面的合并请求 id 编号
iids[] array of integer(可选) 合并请求的编号,使用时需转义.
如:iids[]=1&iids[]=2 --> iids%5B%5D=1&iids%5B%5D=2
state string(可选) 合并请求状态,可选值:merged, opened, reopenedclosed,不填写返回所有的合并请求
source_branch string (可选) 源分支名,指定之后返回列表会根据此源分支名称进行过滤
target_branch string (可选) 目标分支名,指定之后返回列表会根据此目标分支名称进行过滤
order_by string(可选) 排序字段,允许按 created_at, updated_at resolve_at排序(默认 created_at
sort string(可选) 排序方式,允许 asc or desc(默认 desc
page integer 分页(默认值:1,最大值: 100
per_page integer 默认页面大小(默认值: 20,最大值: 100
created_after yyyy-MM-dd'T'HH:mm:ssZ(可选) 返回给定时间及之后创建的 MR;例如 2019-03-25T00:10:19+0000 或 2019-03-25T00:10:19+0800,时间参数必须转码,如“2019-03-25T00:10:19%2B0800”)
created_before yyyy-MM-dd'T'HH:mm:ssZ(可选) 返回给定时间及之前创建的 MR;例如 2019-03-25T00:10:19+0000 或 2019-03-25T00:10:19+0800,时间参数必须转码,如“2019-03-25T00:10:19%2B0800”)
updated_after yyyy-MM-dd'T'HH:mm:ssZ(可选) 返回给定时间及之后更新的 MR;例如 2019-03-25T00:10:19+0000 或 2019-03-25T00:10:19+0800,时间参数必须转码,如“2019-03-25T00:10:19%2B0800”)
updated_before yyyy-MM-dd'T'HH:mm:ssZ(可选) 返回给定时间及之前更新的 MR;例如 2019-03-25T00:10:19+0000 或 2019-03-25T00:10:19+0800,时间参数必须转码,如“2019-03-25T00:10:19%2B0800”)

返回值:

[
    {
        "id": 2556,
        "title": "merge request title",
        "target_project_id": 12321,
        "target_branch": "master",
        "source_project_id": 12321,
        "source_branch": "branch1",
        "state": "opened",
        "iid": 9,
        "description": "desc",
        "created_at": "2013-01-19T07:02:50+0000",
        "updated_at": "2013-01-19T07:02:50+0000",
        "resolved_at": null,
        "assignee": {
            "id": 333,
            "username": "git_user2",
            "web_url": "https://git.tencent.com/u/git_user2",
            "name": "git_user2",
            "state": "active",
            "avatar_url": null
        },
        "author": {
            "id": 11323,
            "username": "git_user1",
            "web_url": "https://git.tencent.com/u/git_user1",
            "name": "git_user1",
            "state": "active",
            "avatar_url": "git.tencent.com/uploads/user/avatar/11323/a75ba2738c7a409cab1d15dd993149aa.jpg"
        },
        "milestone": null,
        "necessary_reviewers": [{
            "id": 11323,
            "username": "git_user1",
            "web_url": "git.tencent.com/u/git_user1",
            "name": "git_user1",
            "state": "active",
            "avatar_url": "git.tencent.com/assets/images/avatar/no_user_avatar.png",
            "type": "necessary",
            "review_state": "approved",
            "created_at": "2019-07-29T09:37:33+0000",
            "updated_at": "2019-07-29T09:57:43+0000"
        }],
        "suggestion_reviewers": [{
            "id": 11323,
            "username": "git_user1",
            "web_url": "git.tencent.com/u/git_user1",
            "name": "git_user1",
            "state": "active",
            "avatar_url": "git.tencent.com/assets/images/avatar/no_user_avatar.png",
            "type": "suggestion",
            "review_state": "approved",
            "created_at": "2019-07-29T09:37:33+0000",
            "updated_at": "2019-07-29T09:57:43+0000"
        }],
        "project_id": 4559,
        "work_in_progress": false,
        "upvotes": 0,
        "downvotes": 0
    },
    {
        "id": 2535,
        "title": "merge request title",
        "target_project_id": 7,
        "target_branch": "master",
        "source_project_id": 7,
        "source_branch": "branch1",
        "state": "opened",
        "iid": 10,
        "description": "desc",
        "created_at": "2013-01-30T08:24:46+0000",
        "updated_at": "2013-03-21T06:04:50+0000",
        "resolved_at": null,
        "assignee": null,
        "author": {
            "id": 11323,
            "username": "git_user1",
            "web_url": "https://git.tencent.com/u/git_user1",
            "name": "git_user1",
            "state": "active",
            "avatar_url": "git.tencent.com/uploads/user/avatar/11323/a75ba2738c7a409cab1d15dd993149aa.jpg"
        },
        "milestone": null,
        "project_id": 4559,
        "work_in_progress": false,
        "upvotes": 0,
        "downvotes": 0
    }
]

# 查询合并请求的代码变更

显示某个指定合并请求的详情,包含的文件及修改

GET /api/v3/projects/:id/merge_request/:merge_request_id/changes

参数:

参数 类型 描述
id integer or string 项目 ID 或 项目全路径 project_full_path
merge_request_id integer 合并请求的 id

返回值:

{
    "id": 26534,
    "title": "merge request title",
    "target_project_id": 12321,
    "target_branch": "master",
    "source_project_id": 12321,
    "source_branch": "branch1",
    "state": "opened",
    "iid": 11323,
    "description": "desc",
    "created_at": "2013-03-21T06:26:38+0000",
    "updated_at": "2013-03-21T06:26:38+0000",
    "resolved_at": null,
    "labels": [],
    "assignee": null,
    "author": {
            "id": 11323,
            "username": "git—user1",
            "web_url": "https://git.tencent.com/u/git—user1",
            "name": "git—user1",
            "state": "active",
            "avatar_url": "git.tencent.com/uploads/user/avatar/11323/a75ba2738c7a409cab1d15dd993149aa.jpg"
    },
    "milestone": {
        "id": 1103,
        "project_id": 4559,
        "title": "milestone1",
        "state": "active",
        "iid": 1,
        "due_date": null,
        "created_at": "2012-11-15T08:02:31+0000",
        "updated_at": "2012-11-15T08:02:31+0000",
        "description": "milestone1"
    },
    "files": [
        {
            "old_path": "/dev/null",
            "new_path": "test",
            "a_mode": 0,
            "b_mode": 33188,
            "diff": "@@ -0,0 +1 @@\n+hello, world\n\\ No newline at end of file\n",
            "new_file": true,
            "renamed_file": false,
            "deleted_file": false,
            "is_too_large": false,
            "is_collapse": false,
            "additions":1,
            "deletions":2
        }
    ],
    "project_id": 4559,
    "work_in_progress": false,
    "upvotes": 0,
    "downvotes": 0
}

# 查询项目合并请求 (根据 id)

查询项目下某个指定合并请求

GET /api/v3/projects/:id/merge_request/:merge_request_id

参数:

参数 类型 描述
id integer or string 项目 ID 或 项目全路径 project_full_path
merge_request_id integer 合并请求的 id

返回值:

{
    "id": 235,
    "title": "merge request title",
    "target_project_id": 12321,
    "target_branch": "master",
    "source_project_id": 12321,
    "source_branch": "branch1",
    "state": "opened",
    "iid": 9,
    "description": "desc",
    "created_at": "2013-01-30T08:24:46+0000",
    "updated_at": "2013-03-21T08:34:44+0000",
    "resolved_at": null,
    "labels": [],
    "assignee": null,
    "author": {
            "id": 11323,
            "username": "git—user1",
            "web_url": "https://git.tencent.com/u/git—user1",
            "name": "git—user1",
            "state": "active",
            "avatar_url": "git.tencent.com/uploads/user/avatar/11323/a75ba2738c7a409cab1d15dd993149aa.jpg"
    },
    "milestone": null,
    "project_id": 45595,
    "work_in_progress": false,
    "upvotes": 0,
    "downvotes": 0
}

# 查询项目合并请求 (根据 iid)

查询项目下某个指定合并请求

GET /api/v3/projects/:id/merge_request/iid/:merge_request_iid

参数:

参数 类型 描述
id integer or string 项目 ID 或 项目全路径 project_full_path
merge_request_iid integer 合并请求在项目中的编号 iid

返回值:

{
    "id": 235,
    "title": "merge request title",
    "target_project_id": 12321,
    "target_branch": "master",
    "source_project_id": 12321,
    "source_branch": "branch1",
    "state": "opened",
    "iid": 9,
    "description": "desc",
    "created_at": "2013-01-30T08:24:46+0000",
    "updated_at": "2013-03-21T08:34:44+0000",
    "resolved_at": null,
    "labels": [],
    "assignee": null,
    "author": {
            "id": 11323,
            "username": "git—user1",
            "web_url": "https://git.tencent.com/u/git—user1",
            "name": "git—user1",
            "state": "active",
            "avatar_url": "git.tencent.com/uploads/user/avatar/11323/a75ba2738c7a409cab1d15dd993149aa.jpg"
    },
    "milestone": null,
    "project_id": 45595,
    "work_in_progress": false,
    "upvotes": 0,
    "downvotes": 0
}

# 查询项目合并请求是否有冲突

查询项目下某个指定合并请求是否有冲突

GET /api/v3/projects/:id/merge_request/:merge_request_id/merge_conflict_check

参数:

参数 类型 描述
id integer or string 项目 ID 或 项目全路径 project_full_path
merge_request_id integer 合并请求的 id

返回值:

{
    "has_conflicts": true,
    "base_commit": "48a29c1b4c9df2bc7fa8f3c2acf7978562863dfc",
    "target_commit": "0eb9f8c1302ba40835bec8050e7dbed6e4d560ec",
    "conflict_files": [
        "test.txt"
    ]
}

# 查询项目 commit 间是否有冲突

查询项目下两个 commit 是否有冲突

GET /api/v3/projects/:id/merge_request/commit_conflict_check

参数:

参数 类型 描述
id integer or string 项目 ID 或 项目全路径 project_full_path
base_commit String 起始 commit 的 SHA 值 (只支持 40 位的 commit 值)
target_commit String 目标 commit 的 SHA 值 (只支持 40 位的 commit 值)

返回值:

{
    "has_conflicts": true,
    "base_commit": "48a29c1b4c9df2bc7fa8f3c2acf7978562863dfc",
    "target_commit": "0eb9f8c1302ba40835bec8050e7dbed6e4d560ec",
    "conflict_files": [
        "test.txt",
        "test1.txt"
    ],
    "resolve_conflicts_url": null
}

# 查询用户是否订阅请求合并

在项目里查询是否订阅了某个指定合并请求

GET /api/v3/projects/:id/merge_request/:merge_request_id/subscribe

参数:

参数 类型 描述
id integer or string 项目 ID 或 项目全路径 project_full_path
merge_request_id integer 请求合并的 id

返回值:

true or false

# 订阅请求合并

在项目内订阅某个指定的合并请求

PUT /api/v3/projects/:id/merge_request/:merge_request_id/subscribe

参数:

参数 类型 描述
id integer or string 项目 ID 或 项目全路径 project_full_path
merge_request_id integer 合并请求的 id

返回值:

200 或状态码

# 取消订阅合并请求

在项目内取消订阅某个指定的合并请求

PUT /api/v3/projects/:id/merge_request/:merge_request_id/unsubscribe

参数:

参数 类型 描述
id integer or string 项目 ID 或 项目全路径 project_full_path
merge_request_id integer 合并请求的 id

返回值:

200 或状态码

# 下载 MR 差异文件集

下载指定合并请求的差异文件集

仅支持下载 open 状态的合并请求

GET /api/v3/projects/:id/merge_request/:merge_request_id/changed_files

参数:

参数 类型 描述
id integer or string 项目 ID 或 项目全路径 project_full_path
merge_request_id integer 合并请求的 id

返回值

文件流

# 产生 MR 预合并点

提前生成从源分支到目标分支的合并点,此合并点不影响 MR 状态,仅用于 Pre-Merge 检查或者代码评审

注意

  • 仅支持 open 状态的合并请求
  • 在获得 id(commit_id) 后,命令行可通过git fetch origin <commit_id> && git checkout FETCH_HEAD检出到工作区
PUT /api/v3/projects/:id/merge_request/iid/:merge_request_iid/create_pre_merge_commit

参数:

参数 类型 描述
id integer or string 项目 ID 或 项目全路径 project_full_path
merge_request_iid integer 合并请求的 iid

返回值

{
  "id": "6269835cafdd89e6d8b8d4a4e3738c79206c1d06",
  "message": "Pre-Merge for merge request !1\n\nmerge master (11a63fa0) with dev (556c115d)\n\nConflicts:\n* README.md",
  "parent_ids": [
    "11a63fa022906668338166ce7f2e7bf35d502285",
    "556c115d64e7fb4be1c8b35c4ae32116712babe3"
  ],
  "authored_date": "2012-06-07T07:38:33+0000",
  "author_name": "git_user1",
  "author_email": "git_user1@tencent.com",
  "committed_date": "2012-06-07T07:38:33+0000",
  "committer_name": "git_user1",
  "committer_email": "git_user1@tencent.com",
  "title": "Pre-Merge for merge request !1",
  "created_at": "2012-06-07T07:38:33+0000",
  "short_id": "6269835c",
  "conflict": true,
  "conflict_files": [
    "README.md"
  ]
}

# 回退合并请求

在项目内回滚某个指定的合并请求

POST /api/v3/projects/:id/merge_request/:merge_request_id/revert

参数:

参数 类型 描述
id integer or string 项目 ID 或 项目全路径 project_full_path
merge_request_id integer 合并请求的 id
target_branch string 回退合并请求的目标分支
create_mr boolean(可选) 回退合并请求是否生成新的合并请求(默认值为 false)

返回值:

200 或相关状态码
lastUpdate: 3/24/2025, 3:18:01 PM