什么是 Git Cherry-picking?

了解 git cherry-pick 命令的作用、原因和方法。
78 位读者喜欢这篇文章。

当您与一群程序员一起开发项目时,无论项目大小,处理多个 Git 分支之间的更改可能会变得困难。 有时,您不想将整个 Git 分支合并到另一个分支中,而是想选择并移动几个特定的提交。 此过程称为“cherry-picking”。

本文将介绍 cherry-picking 的作用、原因和方法。

让我们开始吧。

什么是 cherry-pick?

通过 cherry-pick 命令,Git 允许您将选定的单个提交从任何分支合并到您当前的 Git HEAD 分支中。

当执行 git mergegit rebase 时,来自分支的所有提交都会被合并。 cherry-pick 命令允许您选择单个提交进行集成。

cherry-pick 的优点

以下情况可能更容易理解 cherry-picking 的工作方式。

假设您正在为即将到来的每周冲刺开发新功能。 当您的代码准备就绪时,您会将其推送到远程分支,以准备进行测试。

但是,客户对所有修改并不满意,并要求您仅提供某些修改。 由于客户尚未批准下一次发布的所有更改,因此 git rebase 将无法创建所需的结果。 为什么? 因为 git rebasegit 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 是一个强大的命令,如果在使用时没有正确理解可能发生的事情,可能会导致问题。 但是,当您搞砸并将提交提交到错误的分支时,它可能会挽救您的生命(或至少是您的日常工作)。

接下来阅读什么
标签
User profile image.
我是一位技术爱好者。 我喜欢在有机会时为各种项目做出贡献。 您可以在我的网站 aCompiler 上找到我
Seth Kenlon
Seth Kenlon 是一位 UNIX 极客、自由文化倡导者、独立多媒体艺术家和 D&D 爱好者。 他曾在电影和计算行业工作,而且经常同时进行。

评论已关闭。

Creative Commons License本作品已根据 Creative Commons Attribution-Share Alike 4.0 International License 获得许可。
© . All rights reserved.