什么是遴选
使用遴选(cherry-pick)命令,Git 可以让你将任何分支中的个别提交合并到你当前的 Git HEAD 分支中。
当执行 git merge 或者 git rebase 时,一个分支的所有提交都会被合并。cherry-pick 命令允许你选择单个提交进行整合。
使用 cherry-pick 命令
在 cherry-pick 命令的最简单形式中,你只需使用 SHA 标识符来表示你想整合到当前 HEAD 分支的提交。
要获得提交的哈希值,可以使用 git log 命令:
git log --oneline
当你知道了提交的哈希值后,你就可以使用 cherry-pick 命令。
git cherry-pick <commit sha>
这将会把指定的修改合并到当前已签出的分支上。
如果你想做进一步的修改,也可以让 Git 将提交的变更内容添加到你的工作副本中。
git cherry-pick <commit sha> --no-commit
如果你想同时选择多个提交,请将它们的提交哈希值用空格隔开:
git cherry-pick hash1 hash3
当遴选提交时,你不能使用 git pull 命令,因为它能获取一个仓库的提交并自动合并到另一个仓库。cherry-pick 是一个专门不这么做的工具;另一方面,你可以使用 git fetch,它可以获取提交,但不应用它们。毫无疑问,git pull 很方便,但它不精确。
代码冲突
如果操作过程中发生代码冲突,Cherry pick 会停下来,让用户决定如何继续操作。
--continue
用户解决代码冲突后,第一步将修改的文件重新加入暂存区(git add .),第二步使用下面的命令,让 Cherry pick 过程继续执行。
git cherry-pick --continue
--abort
发生代码冲突后,放弃合并,回到操作前的样子。
git cherry-pick --abort
--quit
发生代码冲突后,退出 Cherry pick,但是不回到操作前的样子。
避免使用遴选的原因
在开发者社区中,通常不鼓励所以遴选。主要原因是它会造成重复提交,而你也失去了跟踪你的提交历史的能力。
如果你不按顺序地遴选了大量的提交,这些提交会被记录在你的分支中,这可能会在 Git 分支中导致不理想的结果。
遴选是一个强大的命令,如果没有正确理解可能发生的情况,它可能会导致问题。不过,当你搞砸了,提交到错误的分支时,它可能会救你一命(至少是你当天的工作)。