要在 macOS 上 cherry-pick 具有依赖关系的提交,首先需要确定先决提交,并在依赖它的提交之前应用它。在“终端”中,检查源分支的历史记录,确认目标分支具有干净的工作区,然后按依赖顺序 cherry-pick 所选的提交 ID。Git 会应用每次提交的更改,并在您当前检出的分支上创建新提交;它不会自动确定目标分支需要哪些更改。Git 的 cherry-pick 文档

具有依赖关系的提交应该使用什么顺序?

请在依赖更改之前应用先决更改。例如,如果提交 a1b2c3 添加了一个函数,而提交 d4e5f6 调用了该函数,请先 pick a1b2c3,然后再 pick d4e5f6。如果第二个提交依赖于第一个提交引入的文件、接口或行为,颠倒它们的顺序可能会导致冲突,或者使目标分支处于损坏的中间状态。

以源分支的父到子顺序作为起点。Git 的工作流指南建议将工作拆分为一致且可以独立工作的逻辑提交;实际的历史记录可能无法达到这种理想状态,因此请检查每个选定提交更改了什么以及依赖于什么。Cherry-pick 是逐个复制提交更改,而合并则是在分支级别引入更改。如果您需要整个分支及其历史记录,请考虑合并是否比逐个挑选提交更合适。Git 工作流文档

在“终端”中检查历史记录

在 Mac 上打开“终端”,切换到代码仓库文件夹,并检查当前状态。将引号中的路径替换为您代码仓库的实际路径;加引号允许文件夹名称中包含空格。

cd "/path/to/your/repository"
git status --short --branch
git log --graph --oneline --decorate --all

第一个命令会更改“终端”的工作目录。git status 显示检出的分支和所有本地更改。图形视图有助于您查看源分支上有哪些提交以及它们的顺序。macOS “终端”默认使用 zsh,上述命令使用的是它支持的通用 shell 语法。Apple 的“终端”使用手册

如果所需的分支是远程跟踪分支,且其最新状态在本地不存在,请在检查之前先进行 fetch:

git fetch origin
git log --reverse --oneline origin/feature-name

将 origin/feature-name 替换为实际的远程分支名称。--reverse 选项按从旧到新的顺序显示提交。对于庞大的历史记录,可以将日志范围缩小到已知公共基底之后的提交,例如 git log --reverse --oneline base-commit..origin/feature-name。阅读生成的提交主题,然后使用 git show COMMIT_ID 检查候选更改。提交范围便于审查,但不要以为范围参数本身就能保证您所需的自定义依赖顺序:显式的提交 ID 能确保目标顺序清晰明确。

按先决顺序进行 Cherry-Pick

在开始之前,请提交或安全地暂存本地更改。常规的 cherry-pick 操作需要干净的工作区,并且在应用任何内容之前,您应确认目标分支。将示例 ID 替换为实际的完整或缩写提交 ID,并按从先决到依赖的顺序排列:

git switch destination-branch
git status --short --branch
git cherry-pick a1b2c3 d4e5f6

Git 会按提供的顺序为每个选定的更改创建新提交。请仔细检查输出:如果某项更改已通过其他途径合并,或者目标分支发生偏离,Git 可能会报告空更改或因冲突而暂停。之后,使用 git log --oneline -n 5 和 git status 检查生成的历史记录和工作区。在确认结果之前,请运行项目相关的检查;顺利完成 cherry-pick 仅意味着 Git 应用了更改,并不意味着功能的表现符合预期。

如果提交发生冲突

当挑选遇到冲突时,Git 会暂停在该提交处。检查受影响的文件,并通过将预期的源更改与目标分支的当前内容相结合来解决每个冲突。使用 git add 暂存已解决冲突的文件,然后继续序列:

git add "path/to/resolved-file"
git cherry-pick --continue

使用 git cherry-pick --abort 取消当前序列并返回到开始前的状态。仅当您确定应忽略当前提交的更改时,才使用 git cherry-pick --skip;后续提交可能依赖于它,因此跳过可能导致这些更改失败或失去意义。Git 文档将 continue、skip 和 abort 列为针对正在进行的操作的控制命令。Git cherry-pick 序列器子命令

对于合并提交(merge commit),在选择它之前请先暂停:由于合并提交有多个父提交,Git 需要指定一个主线(mainline)父提交。同样,如果后续提交在没有较长早期更改链的情况下无法理解,仅选择少数几个可能无法产生连贯的结果。请检查依赖关系,并选择能够保留这些依赖关系的最简完整序列。

参考来源