服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - 编程技术 - 什么是 Git 遴选(cherry-pick)?

什么是 Git 遴选(cherry-pick)?

2021-04-14 23:26Linux中国Rajeev Bera 编程技术

当你和一群程序员一起工作时,无论项目大小,处理多个 Git 分支之间的变更都会变得很困难。有时,你不想将整个 Git 分支合并到另一个分支,而是想选择并移动几个特定的提交。这个过程被称为 “遴选cherry-pick”。本文将介绍“

什么是 Git 遴选(cherry-pick)?

了解 git cherry-pick 命令是什么,为什么用以及如何使用。

当你和一群程序员一起工作时,无论项目大小,处理多个 Git 分支之间的变更都会变得很困难。有时,你不想将整个 Git 分支合并到另一个分支,而是想选择并移动几个特定的提交。这个过程被称为 “遴选cherry-pick”。4

本文将介绍“遴选”是什么、为何使用以及如何使用。

那么让我们开始吧。

什么是遴选?

 

使用遴选(cherry-pick)命令,Git 可以让你将任何分支中的个别提交合并到你当前的 Git HEAD 分支中。

当执行 git merge 或者 git rebase 时,一个分支的所有提交都会被合并。cherry-pick 命令允许你选择单个提交进行整合。

遴选的好处

 

下面的情况可能会让你更容易理解遴选功能。

想象一下,你正在为即将到来的每周冲刺实现新功能。当你的代码准备好了,你会把它推送到远程分支,准备进行测试。

然而,客户并不是对所有修改都满意,要求你只呈现某些修改。因为客户还没有批准下次发布的所有修改,所以 git rebase 不会有预期的结果。为什么会这样?因为 git rebase 或者 git merge 会把上一个冲刺的每一个调整都纳入其中。

遴选就是答案!因为它只关注在提交中添加的变更,所以遴选只会带入批准的变更,而不添加其他的提交。

还有其他几个原因可以使用遴选:

  • 这对于 bug 修复是必不可少的,因为 bug 是出现在开发分支中对应的提交的。
  • 你可以通过使用 git cherry-pick 来避免不必要的工作,而不用使用其他选项例如 git diff 来应用特定变更。
  • 如果因为不同 Git 分支的版本不兼容而无法将整个分支联合起来,那么它是一个很有用的工具。

使用 cherry-pick 命令

 

在 cherry-pick 命令的最简单形式中,你只需使用 SHA 标识符来表示你想整合到当前 HEAD 分支的提交。

要获得提交的哈希值,可以使用 git log 命令:

  1. $ git log --oneline

当你知道了提交的哈希值后,你就可以使用 cherry-pick 命令。

语法是:

  1. $ git cherry-pick <commit sha>

例如:

  1. $ git cherry-pick 65be1e5

这将会把指定的修改合并到当前已签出的分支上。

如果你想做进一步的修改,也可以让 Git 将提交的变更内容添加到你的工作副本中。

语法是:

  1. $ git cherry-pick <commit sha> --no-commit

例如:

  1. $ git cherry-pick 65be1e5 --no-commit

如果你想同时选择多个提交,请将它们的提交哈希值用空格隔开:

  1. $ git cherry-pick hash1 hash3

当遴选提交时,你不能使用 git pull 命令,因为它能获取一个仓库的提交自动合并到另一个仓库。cherry-pick 是一个专门不这么做的工具;另一方面,你可以使用 git fetch,它可以获取提交,但不应用它们。毫无疑问,git pull 很方便,但它不精确。

自己尝试

 

要尝试这个过程,启动终端并生成一个示例项目:

  1. $ mkdir fruit.git
  2. $ cd fruit.git
  3. $ git init .

创建一些数据并提交:

  1. $ echo "Kiwifruit" > fruit.txt
  2. $ git add fruit.txt
  3. $ git commit -m 'First commit'

现在,通过创建一个项目的复刻来代表一个远程开发者:

  1. $ mkdir ~/fruit.fork
  2. $ cd !$
  3. $ echo "Strawberry" >> fruit.txt
  4. $ git add fruit.txt
  5. $ git commit -m 'Added a fruit"

这是一个有效的提交。现在,创建一个不好的提交,代表你不想合并到你的项目中的东西:

  1. $ echo "Rhubarb" >> fruit.txt
  2. $ git add fruit.txt
  3. $ git commit -m 'Added a vegetable that tastes like a fruit"

返回你的仓库,从你的假想的开发者那里获取提交的内容:

  1. $ cd ~/fruit.git
  2. $ git remote add dev ~/fruit.fork
  3. $ git fetch dev
  4. remote: Counting objects: 6, done.
  5. remote: Compressing objects: 100% (2/2), done.
  6. remote: Total 6 (delta 0), reused 0 (delta 0)
  7. Unpacking objects: 100% (6/6), done...
  1. $ git log oneline dev/master
  2. e858ab2 Added a vegetable that tastes like a fruit
  3. 0664292 Added a fruit
  4. b56e0f8 First commit

你已经从你想象中的开发者那里获取了提交的内容,但你还没有将它们合并到你的版本库中。你想接受第二个提交,但不想接受第三个提交,所以使用 cherry-pick

  1. $ git cherry-pick 0664292

第二次提交现在在你的仓库里了:

  1. $ cat fruit.txt
  2. Kiwifruit
  3. Strawberry

将你的更改推送到远程服务器上,这就完成了!

避免使用遴选的原因

 

在开发者社区中,通常不鼓励所以遴选。主要原因是它会造成重复提交,而你也失去了跟踪你的提交历史的能力。

如果你不按顺序地遴选了大量的提交,这些提交会被记录在你的分支中,这可能会在 Git 分支中导致不理想的结果。

遴选是一个强大的命令,如果没有正确理解可能发生的情况,它可能会导致问题。不过,当你搞砸了,提交到错误的分支时,它可能会救你一命(至少是你当天的工作)。

延伸 · 阅读

精彩推荐
  • 编程技术2021年值得关注的React PDF 库

    2021年值得关注的React PDF 库

    今天,许多网络应用程序为其用户提供内置的PDF浏览选项。然而,选择一个并不容易,因为它们的功能远远超过显示PDF。在这篇文章中,我将评估5个React的...

    TianTianUp5232021-06-21
  • 编程技术让开发效率倍增的 VS Code 插件

    让开发效率倍增的 VS Code 插件

    今天来分享一些提升开发效率的实用 VS Code 插件!Better Comments 扩展可以帮助我们在代码中创建更人性化的注释,有不同形式和颜色的注释供我们选择。 ...

    前端充电宝7132022-04-21
  • 编程技术用户态 Tcpdump 如何实现抓到内核网络包的?

    用户态 Tcpdump 如何实现抓到内核网络包的?

    在网络包的发送和接收过程中,绝大部分的工作都是在内核态完成的。那么问题来了,我们常用的运行在用户态的程序 tcpdump 是那如何实现抓到内核态的包...

    开发内功修炼11612021-09-08
  • 编程技术真正聪明的程序员,总有办法不加班

    真正聪明的程序员,总有办法不加班

    工作效率提升了,就可以少加班了,聪明的程序员,总会有一堆可以提升编码效率的工具?当一种工具满足不了工作需求,就去探索新的,今天纬小创就给...

    今日头条12482021-03-04
  • 编程技术Delphi - Indy idMessage和idSMTP实现邮件的发送

    Delphi - Indy idMessage和idSMTP实现邮件的发送

    这篇文章主要介绍了Delphi - Indy idMessage和idSMTP实现邮件的发送,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下...

    JJ_JeremyWu6592020-09-22
  • 编程技术简单、好懂的Svelte实现原理

    简单、好懂的Svelte实现原理

    本文会围绕一张流程图和两个Demo讲解,正确的食用方式是用电脑打开本文,跟着流程图、Demo一边看、一边敲、一边学...

    魔术师卡颂4822021-11-10
  • 编程技术AIOps,SRE工程师手中的利器

    AIOps,SRE工程师手中的利器

    AIOps开始成为一种极为重要的站点可靠性工程工具。它能够高效吸纳观察数据、参与数据以及来自第三方工具的数据,判断系统运行状态并保证其处于最佳...

    至顶网5972021-03-08
  • 编程技术从Context源码实现谈React性能优化

    从Context源码实现谈React性能优化

    这篇文章主要介绍Context的实现原理,源码层面掌握React组件的render时机,从而写出高性能的React组件,源码层面了解shouldComponentUpdate、React.memo、PureComponen...

    魔术师卡颂5312020-12-20