2886

最近,我被要求cherry-pick提交。

那么在 git 中挑选提交是什么意思呢?你怎么做呢?

4

12 回答 12

3509

Git 中的 Cherry Picking 意味着从一个分支中选择一个提交并将其应用到另一个分支上。

这与其他方式形成对比,例如merge通常rebase将许多提交应用到另一个分支。

  1. 确保您位于要将提交应用到的分支上。

     git switch master
    
  2. 执行以下操作:

     git cherry-pick <commit-hash>
    

注意:

  1. 如果您从公共分支中挑选,您应该考虑使用

     git cherry-pick -x <commit-hash>
    

    这将生成一个标准化的提交消息。这样,您(和您的同事)仍然可以跟踪提交的来源,并且可以避免将来发生合并冲突。

  2. 如果您在提交中附加了注释,则它们不会遵循樱桃选择。要将它们也带过来,您必须使用:

     git notes copy <from> <to>
    

附加链接:

于 2012-02-18T07:29:42.237 回答
407

这段话摘自:Git 的版本控制

使用 git cherry-pick 命令 git cherry-pick commit 应用由命名提交在当前分支上引入的更改。它将引入一个新的、不同的提交。严格来说,使用 git cherry-pick 不会改变存储库中的现有历史;相反,它增加了历史。与通过应用差异的过程引入更改的其他 Git 操作一样,您可能需要解决冲突以完全应用来自给定提交的更改。命令 git cherry-pick 通常用于将特定提交从存储库中的一个分支引入到不同的分支。一个常见的用途是将提交从维护分支转发或反向移植到开发分支。

$ git checkout rel_2.3
$ git cherry-pick dev~2 # commit F, below

前: 前

后: 后

另外,这里有一个非常好的视频教程:Youtube: Introduction to Git cherry-pick

于 2015-05-13T15:06:34.483 回答
182

Git 中的樱桃采摘旨在将一些提交从一个分支应用到另一个分支。如果你可以这样做。犯了一个错误并将更改提交到错误的分支,但不想合并整个分支。你可以只是例如。恢复提交并在另一个分支上挑选它。

要使用它,您只需要git cherry-pick hash,hash来自其他分支的提交哈希在哪里。

有关完整程序,请参阅:http ://technosophos.com/2009/12/04/git-cherry-picking-move-small-code-patches-across-branches.html

于 2012-02-18T07:29:18.783 回答
113

情况的简短示例,当您需要樱桃采摘时

考虑以下场景。你有两个分支。

a) release1 - 此分支将发给您的客户,但仍有一些错误需要修复。

b) master - 经典的 master 分支,例如,您可以在其中为 release2 添加功能。

现在:你在release1中修复了一些东西。当然,您也需要在master中进行此修复。这是樱桃采摘的典型用例。因此,在这种情况下,cherry pick 意味着您从release1分支进行提交并将其包含到分支中。

于 2018-12-11T13:00:53.043 回答
103

我准备了cherry-pick的分步插图——以及这些插图的动画(接近尾声)。

  1. 在挑选之前
    (我们将从分支中挑选提交): Lfeature在此处输入图像描述

  1. 启动命令git cherry-pick feature~2
    feature~2是之前的第二次提交
    feature,即提交L): 在此处输入图像描述

  1. 执行命令 ( git cherry-pick feature~2) 后: 在此处输入图像描述

同样的动画: 在此处输入图像描述


笔记:

从用户的角度来看,提交L'是提交的确切副本(提交 = 快照) 。 L

从技术上讲(内部),它是一个新的、不同的提交(因为例如L包含指向K(作为其父级)的指针,而L'包含指向 的指针E)。

于 2019-09-17T02:04:47.737 回答
66

cherry-pick 是一个 Git 功能。如果有人想将一个分支中的特定提交提交到目标分支,则使用cherry-pick。
git cherry-pick 步骤如下。

  1. 结帐(切换到)目标分支。
  2. git cherry-pick <commit id>
    

    这里提交 id 是另一个分支的活动 id。例如。

    git cherry-pick 9772dd546a3609b06f84b680340fb84c5463264f
    
  3. 推送到目标分支

访问https://git-scm.com/docs/git-cherry-pick

于 2016-08-24T09:39:59.967 回答
26

您可以认为樱桃采摘类似于变基,或者更确切地说,它是像变基一样管理的。通过这个,我的意思是它需要一个现有的提交并重新生成它,作为起点,你当前所在的分支的负责人。

Arebase接受具有父 X 的提交并重新生成提交,就好像它实际上具有父 Y 一样,这正是 acherry-pick所做的。

Cherry pick 更多的是关于如何选择提交。使用pull(rebase),git 会在拉到分支的内容之上隐式地重新生成本地提交,但在cherry-pick您显式选择一些提交时,并在当前分支之上隐式地重新生成它(它们)。

因此,您执行此操作的方式有所不同,但在幕后它们是非常相似的操作 - 提交的再生。

于 2017-01-31T22:19:17.317 回答
18

它将对您当前的分支应用特定的提交。

这表示 :

  • 将添加此提交添加的所有文件
  • 此提交删除的所有文件都将被删除
  • 此提交修改的所有文件都将被合并。这意味着来自提交的整个文件,而不仅仅是来自此提交的更改

例如:考虑提交 A

added newFileA
modified main:
+ import './newFileA'

提交 B

added newFileB
modified main:
+ import './newFileB'

如果你在另一个分支上挑选提交 B,你最终会得到:

/newFileB
/main :
   import './newFileA'
   import './newFileB'

由于提交 B包含newFileBmain,但没有newFileA,因此会导致错误,因此请谨慎使用。

于 2019-11-12T15:56:17.480 回答
16

这有点像复制(从某处)和粘贴(到某处),但针对特定的提交。

例如,如果您想进行热修复,则可以使用该cherry-pick功能。

cherry-pick在开发分支中执行您的操作,然后merge提交到发布分支。同样,cherry-pick从发布分支到 master。瞧

于 2016-10-07T11:55:51.050 回答
12

当您与开发人员团队一起开发项目时,管理多个 git 分支之间的更改可能成为一项复杂的任务。有时您不想将整个分支合并到另一个分支中,而只需要选择一个或两个特定的提交。这个过程被称为“樱桃采摘”。

找到一篇关于樱桃采摘的精彩文章,查看详细信息:https ://www.previousnext.com.au/blog/intro-cherry-picking-git

于 2019-01-21T08:30:49.263 回答
8

如果你想在没有提交 ID 的情况下合并,你可以使用这个命令

git cherry-pick master~2 master~0

上面的命令会将 master 的最后三个提交从 1 合并到 3

如果您想为单个提交执行此操作,只需删除最后一个选项

git cherry-pick master~2

这样,您将合并 master 末尾的第三次提交。

于 2019-03-19T12:38:35.940 回答
1

摘自官方文档:

给定一个或多个现有提交,应用每个引入的更改,并为每个提交记录一个新的提交。这要求您的工作树是干净的(不修改 HEAD 提交)。

当如何应用更改不明显时,会发生以下情况:

  1. 当前分支和 HEAD 指针停留在最后一次成功提交上。

  2. CHERRY_PICK_HEAD ref 设置为指向引入了难以应用的更改的提交。

  3. 干净地应用更改的路径在索引文件和工作树中都会更新。

  4. 对于冲突的路径,索引文件最多记录三个版本,如 git-merge 的“TRUE MERGE”部分所述。工作树文件将包含由通常的冲突标记 <<<<<<< 和 >>>>>> 括起来的冲突描述。

没有进行其他修改。

阅读更多...

于 2020-03-21T08:01:10.423 回答