在 Mac 上,解决 cherry-pick 冲突的方法是:在终端或代码编辑器中编辑每个冲突文件,使用 git add 暂存修改完成的文件,然后运行 git cherry-pick --continue。Git 之所以暂停,是因为它无法干净利落地应用某个提交;你的当前分支尚未接收该提交。在继续之前,请仔细审查每个冲突的两侧改动;如果你决定不再继续,请使用 git cherry-pick --abort。Git 的 cherry-pick 文档介绍了这种暂停状态及其后续操作选项。

1. 在项目文件夹中打开终端

通过“聚焦搜索”(Spotlight)或访达(Finder)的“应用程序”>“实用工具”文件夹打开“终端”。在终端中,使用 cd 及路径进入仓库文件夹。对于包含空格的文件夹路径,请用引号将路径括起来,例如 cd "/Users/sam/Work/My Project"。你也可以输入 cd 并留一个空格,将项目文件夹从访达拖入终端窗口,然后按回车键(Return)。Apple 将“终端”描述为 macOS 的命令行界面;在使用默认的 zsh shell 时,其提示符通常以 % 结尾。Apple 的终端使用手册说明了如何打开终端以及如何识别提示符。

在更改文件之前,确认你位于该仓库中,并查看 Git 报告的状态:

git status

如果输出显示 cherry-pick 正在进行中并列出了冲突路径,请继续阅读下文。如果你不确定涉及哪个仓库或提交,请暂停并确认上下文,然后再解决任何问题。不要在第一次 cherry-pick 暂停时启动第二次 cherry-pick。

2. 检查冲突并决定文件应包含的内容

在编辑器中打开每个冲突的文本文件。Git 会在无法自动协调的部分周围插入标记。典型的冲突部分如下所示:

<<<<<<< HEAD
content on the current branch
=======
content from the commit being cherry-picked
>>>>>>> commit subject or identifier

HEAD 是当前分支的版本;另一部分来自正在应用的提交。这些标签描述了此操作的两端,但并未指明哪个版本才是正确的。结合上下文代码、预期的更改以及该提交的目的,决定是保留其中一方还是将两者结合。Git 文档说明了冲突文件会包含标记,且干净应用的路径可能已经更新。Git cherry-pick

编辑文件使其包含预期结果,并删除所有冲突标记行。检查该文件中的每一处冲突,保存文件,并对 git status 列出的所有路径重复此操作。对于二进制文件或预期结果不明确的冲突,切勿凭空猜测:在选择版本前,请咨询该更改的作者或参考项目指南。切忌为了消除冲突而简单地用某一方替换整个文件;这可能会丢弃有效的修改。

3. 暂存已解决的文件并进行审查

解决某个文件的冲突后,通过暂存操作告知 Git 该冲突已解决。请使用 git status 显示的准确路径;包含空格的路径请加上引号:

git add "Sources/Example File.swift"

对每个已解决的路径重复此操作。git add 会暂存文件的当前内容,因此若其中包含无关的修改,请仔细审查所暂存的内容。Git 的 git-add 手册记录了它会将文件内容添加到索引(即用于下一次提交的暂存区)中。Git add

检查是否仍有未解决的冲突,并查看已暂存的冲突解决结果:

git status
git diff --cached

git status 应该不再列出未解决的路径。查看已暂存的 diff,并确认预期的更改已包含在内,同时没有残留冲突标记或意外改动。git diff --cached 会显示已暂存的更改;Git diff 记录了此审查选项。如果发现错误,请重新编辑文件,再次暂存,并重新审查 diff。

4. 继续 Cherry-Pick

当所有冲突都已解决并暂存后,运行:

git cherry-pick --continue

Git 会恢复暂停的操作,并在成功后将 cherry-pick 的更改记录为一个新的提交。如果 Git 打开编辑器以输入提交信息,请使用该编辑器的常规操作保存并关闭。然后检查 git status,并在需要时审查最新的提交:

git status
git log -1 --oneline

对于一系列连续的 cherry-pick 提交,--continue 会继续执行后续操作;后续的提交也可能会因冲突而停下来。以同样的方式解决并暂存该提交的冲突。Git 文档说明了使用 --continue 恢复失败的 cherry-pick,使用 --skip 跳过当前提交。仅当你有意放弃该提交的更改时才使用 --skip,切勿将其作为跳过未解决文件的捷径。Git cherry-pick 选项

如果想改为终止操作

如果你决定不应继续进行 cherry-pick,请运行 git cherry-pick --abort。Git 文档指出,此命令会取消操作并恢复到该序列开始之前的状态。如果你在开始之前有本地工作区改动,请在中止后使用 git status 进行检查;不要在未理解当前状态的情况下使用破坏性的 reset 命令。Git cherry-pick

一个实用的终止准则非常简单:只有当你理解了每个冲突文件的预期内容并审查了暂存结果之后,才继续进行。如果代码的修改意图尚不明确,请保持暂停状态,并在创建提交之前寻求针对该项目的指导。

参考来源