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

使用 Git 挑选变更

  • Tier: Free, Premium, Ultimate
  • Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated

使用 git cherry-pick 将特定提交的变更应用到当前工作分支。使用此命令可以:

  • 将默认分支的错误修复回退到之前的发布分支。
  • 将变更从 fork 分支复制到上游仓库。
  • 应用特定变更而不合并整个分支。

你也可以使用 GitLab UI 来挑选变更。更多信息,请参阅 挑选变更

请谨慎使用 git cherry-pick,因为它可能会创建重复的提交,并可能使你的项目历史变得复杂。

挑选单个提交

要将另一个分支中的单个提交挑选到当前工作分支:

  1. 切换到你想要挑选变更的目标分支:

    git checkout your_branch
  2. 确定你想要挑选的提交的 Secure Hash Algorithm (SHA)。要找到这个值,可以查看提交历史或使用 git log 命令。例如:

    $ git log
    
    commit 0000011111222223333344444555556666677777
    Merge: 88888999999 aaaaabbbbbb
    Author: user@example.com
    Date:   Tue Aug 31 21:19:41 2021 +0000
  3. 使用 git cherry-pick 命令。将 <commit_sha> 替换为你识别出的提交的 SHA:

    git cherry-pick <commit_sha>

Git 会将指定提交的变更应用到你的当前工作分支。如果有冲突,会显示通知。然后你可以解决冲突并继续挑选过程。

挑选多个提交

要将另一个分支中的多个提交挑选到当前工作分支:

  1. 切换到你想要挑选变更的目标分支:

    git checkout your_branch
  2. 确定你想要挑选的提交的 Secure Hash Algorithm (SHA)。要找到这个值,可以查看提交历史或使用 git log 命令。例如:

    $ git log
    
    commit 0000011111222223333344444555556666677777
    Merge: 88888999999 aaaaabbbbbb
    Author: user@example.com
    Date:   Tue Aug 31 21:19:41 2021 +0000
  3. 对每个提交使用 git cherry-pick 命令,将 <commit_sha> 替换为提交的 SHA:

    git cherry-pick <commit_sha_1>
    git cherry-pick <commit_sha_2>
    ...

或者,你可以使用 .. 符号来挑选一个范围内的提交:

git cherry-pick <start_commit_sha>..<end_commit_sha>

这会将 <start_commit_sha><end_commit_sha> 之间的所有提交应用到你的当前工作分支。

挑选合并提交

挑选合并提交会将合并提交的变更应用到你的当前工作分支。

要将另一个分支中的合并提交挑选到当前工作分支:

  1. 切换到你想要挑选变更的目标分支:

    git checkout your_branch
  2. 确定你想要挑选的提交的 Secure Hash Algorithm (SHA)。要找到这个值,可以查看提交历史或使用 git log 命令。例如:

    $ git log
    
    commit 0000011111222223333344444555556666677777
    Merge: 88888999999 aaaaabbbbbb
    Author: user@example.com
    Date:   Tue Aug 31 21:19:41 2021 +0000
  3. 使用带有 -m 选项的 git cherry-pick 命令,以及你想要用作主线的父提交的索引。将 <commit_sha> 替换为合并提交的 SHA,将 <parent_index> 替换为父提交的索引。索引从 1 开始。例如:

    git cherry-pick -m 1 <merge-commit-hash>

这会配置 Git 使用第一个父提交作为主线。要使用第二个父提交作为主线,请使用 -m 2

相关主题

故障排除

如果在挑选过程中遇到冲突:

  1. 手动解决受影响文件中的冲突。

  2. 暂存已解决的文件:

    git add <resolved_file>
  3. 继续挑选过程:

    git cherry-pick --continue

要中止挑选过程并返回到之前的状态,请使用以下命令:

git cherry-pick --abort

这会撤销在挑选过程中所做的任何更改。