当您与一群程序员一起开发项目时,无论项目大小,处理多个 Git 分支之间的更改可能会变得困难。 有时,您不想将整个 Git 分支合并到另一个分支中,而是想选择并移动几个特定的提交。 此过程称为“cherry-picking”。
本文将介绍 cherry-picking 的作用、原因和方法。
让我们开始吧。
什么是 cherry-pick?
通过 cherry-pick
命令,Git 允许您将选定的单个提交从任何分支合并到您当前的 Git HEAD 分支中。
当执行 git merge
或 git rebase
时,来自分支的所有提交都会被合并。 cherry-pick
命令允许您选择单个提交进行集成。
cherry-pick 的优点
以下情况可能更容易理解 cherry-picking 的工作方式。
假设您正在为即将到来的每周冲刺开发新功能。 当您的代码准备就绪时,您会将其推送到远程分支,以准备进行测试。
但是,客户对所有修改并不满意,并要求您仅提供某些修改。 由于客户尚未批准下一次发布的所有更改,因此 git rebase
将无法创建所需的结果。 为什么? 因为 git rebase
或 git merge
将合并上次冲刺的所有调整。
Cherry-picking 是答案! 因为它只关注提交中添加的更改,所以 cherry-picking 只引入批准的更改,而不添加其他提交。
还有其他几个使用 cherry-picking 的理由
- 对于错误修复至关重要,因为错误是使用其提交在开发分支中设置的。
- 您可以使用
git cherry-pick
而不是其他应用指定提交中的更改的选项(例如,git diff
)来避免不必要的冲突。 - 如果由于各种 Git 分支中的版本不兼容而导致无法进行完整的分支合并,它是一个有用的工具。
使用 cherry-pick 命令
在 cherry-pick
命令的最简单形式中,您可以只使用您想要集成到当前 HEAD 分支中的提交的 SHA 标识符。
要获取提交哈希,您可以使用 git log
命令
$ git log --oneline
知道提交哈希后,您可以使用 cherry-pick
命令。
语法是
$ git cherry-pick <commit sha>
例如
$ git cherry-pick 65be1e5
这会将指定的更改提交到您当前检出的分支。
如果您想进行进一步的修改,您也可以指示 Git 将提交更改添加到您的工作副本中。
语法是
$ git cherry-pick <commit sha> --no-commit
例如
$ git cherry-pick 65be1e5 --no-commit
如果您想同时选择多个提交,请添加它们的提交哈希,并用空格分隔
$ git cherry-pick hash1 hash3
当 cherry-picking 提交时,您不能使用 git pull
命令,因为它会从一个存储库获取并自动合并提交到另一个存储库中。 cherry-pick
命令是您专门用于不执行此操作的工具; 相反,使用 git fetch
,它会获取提交但不应用它们。 毫无疑问,git pull
很方便,但不够精确。
亲自尝试
要尝试该过程,请启动终端并生成一个示例项目
$ mkdir fruit.git
$ cd fruit.git
$ git init .
创建一些数据并提交它
$ echo "Kiwifruit" > fruit.txt
$ git add fruit.txt
$ git commit -m 'First commit'
现在,通过创建您的项目的分支来表示远程开发人员
$ mkdir ~/fruit.fork
$ cd !$
$ echo "Strawberry" >> fruit.txt
$ git add fruit.txt
$ git commit -m 'Added a fruit"
这是一个有效的提交。 现在,创建一个错误的提交来表示您不想合并到您的项目中的内容
$ echo "Rhubarb" >> fruit.txt
$ git add fruit.txt
$ git commit -m 'Added a vegetable that tastes like a fruit"
返回到您的权威存储库并从您的假想开发人员那里获取提交
$ cd ~/fruit.git
$ git remote add dev ~/fruit.fork
$ git fetch dev
remote: Counting objects: 6, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 6 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (6/6), done...
$ git log –oneline dev/master
e858ab2 Added a vegetable that tastes like a fruit
0664292 Added a fruit
b56e0f8 First commit
您已经从您的假想开发人员那里获取了提交,但您尚未将它们合并到您的存储库中。 您想要接受第二个提交,但不接受第三个,因此请使用 cherry-pick
$ git cherry-pick 0664292
第二个提交现在位于您的存储库中
$ cat fruit.txt
Kiwifruit
Strawberry
将您的更改推送到您的远程服务器,您就完成了!
避免 cherry-picking 的原因
在开发人员社区中,通常不鼓励 cherry-picking。 主要原因是它会创建重复的提交,而且您还会失去跟踪提交历史的能力。
如果您不按顺序 cherry-picking 大量提交,这些提交将被记录在您的分支中,并且可能会导致您的 Git 分支中出现不良结果。
Cherry-picking 是一个强大的命令,如果在使用时没有正确理解可能发生的事情,可能会导致问题。 但是,当您搞砸并将提交提交到错误的分支时,它可能会挽救您的生命(或至少是您的日常工作)。
评论已关闭。