如何挑选多个提交记录

如何挑选多个提交记录

技术背景

在使用Git进行版本控制时,有时我们并不想合并整个分支,而是只需要其中的部分提交记录。Git 1.7.2 引入了挑选一系列提交记录的功能,让我们可以更灵活地处理提交记录。

实现步骤

挑选从提交 A 到提交 B 的所有提交记录

若要挑选从提交 A 到提交 BA 早于 B)的所有提交记录,可运行:

1
git cherry-pick A^..B

若要忽略 A 本身,可运行:

1
git cherry-pick A..B

注意事项:

  • A 应早于 B,或者 A 应来自另一个分支。
  • 在 Windows 系统中,由于脱字符需要转义,应使用 A^^..B,或者使用双引号 "A^..B"
  • zsh shell 中,由于脱字符是特殊字符,应使用单引号 'A^..B'

挑选单个提交记录

1
git cherry-pick commit

示例:

1
2
3
git cherry-pick my_branch                                 # 按分支名称
git cherry-pick 1e038f108a130831f108329b1083a8139813fabc # 按完整哈希值
git cherry-pick 1e038f10 # 按部分哈希值

挑选多个提交记录

可以一次性挑选任意数量的提交记录,且可以按任意顺序挑选。它们将按指定顺序逐个应用。若出现冲突,需逐个解决,然后使用 git add my_file,完成后使用 git cherry-pick --continue 继续挑选过程。

1
git cherry-pick commit1 commit2 commit3 commit4 commit5

挑选提交记录范围

  • 包含起始提交记录
1
2
3
4
5
git cherry-pick beginning_commit~..ending_commit
# 或(与上述相同)
git cherry-pick beginning_commit~1..ending_commit
# 或(与上述相同)
git cherry-pick beginning_commit^..ending_commit
  • 不包含起始提交记录
1
git cherry-pick beginning_commit..ending_commit

注:commit~commit~1commit^ 都表示 “commit 的前一个提交记录”。

挑选同行的一系列提交记录到自己的分支

当同行的分支 peer_branch 是从自己分支 my_branch 的早期版本分叉出来时:

1
2
3
4
5
6
git fetch origin peer_branch  # 从远程获取他们的最新更改
git checkout my_branch # 确保你在自己的分支上
# 挑选他们的提交记录范围
git cherry-pick my_branch...origin/peer_branch
git log # 查看刚刚挑选的提交记录
git push # 将更改推送到远程

核心代码

从提交 ID 到分支顶端挑选提交记录

1
git cherry-pick commit_id^..branch_name

按顺序挑选从分支 bf 的所有提交记录

1
git rev-list --reverse b..f | xargs -n 1 git cherry-pick

通过标准输入管道输入提交记录的 SHA 列表进行挑选

1
git rev-list --reverse ..main -- path/ | git cherry-pick --stdin 

最佳实践

简单的单提交记录挑选示例

从 “dev” 分支获取一个名为 “Remove Last Name field” 的提交记录,并提交到 “hotfix1” 分支:

1
2
3
4
5
6
7
8
9
10
11
12
# 切换到 "dev" 分支
git checkout dev
# 获取提交 ID
git log --oneline
# 切换到 "hotfix1" 分支
git checkout hotfix1
# 从 "dev" 分支获取提交记录到 "hotfix1" 分支
git cherry-pick 1e2e3e4e1
# 验证更改是否正确
gitk
# 推送到 "hotfix1" 分支
git push

批量挑选多个提交记录

1
git cherry-pick 1e2e3e4e1 1e2e3e4e2 1e2e3e4e3

常见问题

冲突问题

在挑选提交记录时,如果出现冲突,需要手动解决冲突。解决冲突后,使用 git add my_file 将解决冲突的文件添加到暂存区,然后使用 git cherry-pick --continue 继续挑选过程。

语法问题

在不同的系统和 shell 中,某些字符(如脱字符 ^)可能需要特殊处理。例如,在 Windows 系统中,可能需要使用 A^^..B"A^..B";在 zsh shell 中,可能需要使用 'A^..B'


如何挑选多个提交记录
https://119291.xyz/posts/how-to-cherry-pick-multiple-commits/
作者
ww
发布于
2025年5月29日
许可协议