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

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 仓库有两个分支:developmain。在 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 单个提交

操作步骤:

  1. 在左侧边栏,选择 Search or go to 并找到你的项目。

  2. 选择 Code > Merge requests,并找到你的 merge request。

  3. 滚动到 merge request 报告部分,找到 Merged by 报告。

  4. 在报告的右上角,选择 Cherry-pick

    Cherry-pick merge request

  5. 在对话框中,选择要 cherry-pick 到的项目和分支。

  6. 可选。选择 Start a new merge request with these changes

  7. 选择 Cherry-pick

Cherry-pick 单个提交

你可以从 GitLab 项目中的多个位置 cherry-pick 单个提交。

从项目的提交列表中

要从项目的所有提交列表中 cherry-pick 提交:

  1. 在左侧边栏,选择 Search or go to 并找到你的项目。
  2. 选择 Code > Commits
  3. 选择你想要 cherry-pick 的提交的 title
  4. 在右上角,选择 Options > Cherry-pick
  5. 在 cherry-pick 对话框中,选择要 cherry-pick 到的项目和分支。
  6. 可选。选择 Start a new merge request with these changes
  7. 选择 Cherry-pick

从仓库的文件视图中

当你查看项目 Git 仓库中的某个文件时,可以从影响该文件的先前提交列表中 cherry-pick:

  1. 在左侧边栏,选择 Search or go to 并找到你的项目。
  2. 选择 Code > Repository
  3. 转到提交所更改的文件。在最后一个提交块中,选择 History
  4. 选择你想要 cherry-pick 的提交的 title
  5. 在右上角,选择 Options > Cherry-pick
  6. 在 cherry-pick 对话框中,选择要 cherry-pick 到的项目和分支。
  7. 可选。选择 Start a new merge request with these changes
  8. 选择 Cherry-pick

查看 cherry-pick 提交的系统备注

当你在 GitLab UI 或 API 中 cherry-pick 一个 merge commit 时,GitLab 会向相关的 merge request 线程添加一个 system note。格式为 cherry-pick-commit [USER] 将变更 picked 到分支 [BRANCHNAME],提交为 [SHA] [DATE]

Cherry-pick tracking in merge request timeline

系统备注会交叉链接新提交和现有的 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

相关主题