Cherry-pick 变更
- Tier: Free, Premium, Ultimate
- Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
在 Git 中,cherry-picking 是指从一个分支中提取单个提交,并将其作为最新提交添加到另一个分支。源分支中的其他提交不会添加到目标分支。当你只需要单个提交中的内容,而不需要整个分支的内容时,可以使用 cherry-pick。例如,当你:
- 将默认分支的错误修复回退到之前的发布分支。
- 将变更从 fork 复制到上游仓库。
使用 GitLab UI 来 cherry-pick 单个提交或整个 merge request 的内容,可以从项目或项目的 fork 中进行。
在这个例子中,一个 Git 仓库有两个分支:develop 和 main。在 main 分支的提交 E 之后,从 develop 分支 cherry-pick 了提交 B。在 cherry-pick 之后添加了提交 G:
gitGraph commit id: "A" branch develop commit id:"B" checkout main commit id:"C" checkout develop commit id:"D" checkout main commit id:"E" cherry-pick id:"B" commit id:"G" checkout develop commit id:"H"
从 merge request 中 cherry-pick 所有变更
当一个 merge request 被合并后,你可以 cherry-pick 该 merge request 引入的所有变更。这个 merge request 可以在上游项目中,也可以在下游的 fork 中。
先决条件:
- 你必须拥有项目的角色权限,允许你编辑 merge request 并向仓库添加代码。
- 你的项目必须使用 merge 方法 Merge Commit,该设置在项目的 Settings > Merge requests 中配置。
在 GitLab 16.9 及更高版本中,只有当 fast-forwarded 提交被压缩(squashed)或者 merge request 包含单个提交时,才能从 GitLab UI 中 cherry-pick。你始终可以 cherry-pick 单个提交。
操作步骤:
-
在左侧边栏,选择 Search or go to 并找到你的项目。
-
选择 Code > Merge requests,并找到你的 merge request。
-
滚动到 merge request 报告部分,找到 Merged by 报告。
-
在报告的右上角,选择 Cherry-pick:
-
在对话框中,选择要 cherry-pick 到的项目和分支。
-
可选。选择 Start a new merge request with these changes。
-
选择 Cherry-pick。
Cherry-pick 单个提交
你可以从 GitLab 项目中的多个位置 cherry-pick 单个提交。
从项目的提交列表中
要从项目的所有提交列表中 cherry-pick 提交:
- 在左侧边栏,选择 Search or go to 并找到你的项目。
- 选择 Code > Commits。
- 选择你想要 cherry-pick 的提交的 title。
- 在右上角,选择 Options > Cherry-pick。
- 在 cherry-pick 对话框中,选择要 cherry-pick 到的项目和分支。
- 可选。选择 Start a new merge request with these changes。
- 选择 Cherry-pick。
从仓库的文件视图中
当你查看项目 Git 仓库中的某个文件时,可以从影响该文件的先前提交列表中 cherry-pick:
- 在左侧边栏,选择 Search or go to 并找到你的项目。
- 选择 Code > Repository。
- 转到提交所更改的文件。在最后一个提交块中,选择 History。
- 选择你想要 cherry-pick 的提交的 title。
- 在右上角,选择 Options > Cherry-pick。
- 在 cherry-pick 对话框中,选择要 cherry-pick 到的项目和分支。
- 可选。选择 Start a new merge request with these changes。
- 选择 Cherry-pick。
查看 cherry-pick 提交的系统备注
当你在 GitLab UI 或 API 中 cherry-pick 一个 merge commit 时,GitLab 会向相关的 merge request 线程添加一个 system note。格式为
[USER] 将变更 picked 到分支 [BRANCHNAME],提交为 [SHA] [DATE]:
系统备注会交叉链接新提交和现有的 merge request。每个部署的 关联 merge request 列表 都包含 cherry-pick 的 merge commit。
在 GitLab UI 或 API 之外 cherry-pick 的提交不会添加系统备注。
选择不同的父提交
当你在 GitLab UI 中 cherry-pick 一个 merge commit 时,主线总是第一个父提交。使用命令行来 cherry-pick 不同的主线。更多信息,请参见 使用 Git Cherry-pick a merge commit。