樱桃挑选Git意味着什么?

时间:2012-02-18 07:20:48

标签: git cherry-pick git-cherry-pick

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

那么在git中挑选一个提交意味着什么呢?你是怎么做到的?

11 个答案:

答案 0 :(得分:2239)

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

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

  1. 确保您在要应用提交的分支上。

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

    git cherry-pick <commit-hash>
    
  3. N.B:

    1. 如果你从公共分支机构挑选,你应该考虑使用

      git cherry-pick -x <commit-hash>
      

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

    2. 如果您在提交中附有说明,则不会遵循樱桃选择。要把它们带过来,你必须使用:

      git notes copy <from> <to>
      
    3. 其他链接:

答案 1 :(得分:253)

此引用取自; Version Control with Git (真的好书,如果你对git感兴趣,我鼓励你买它)

编辑:由于这个答案仍然得到了印象,我想在动作视频教程中添加一个非常好的答案:

Youtube: Introduction to Git cherry-pick

  

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

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

之前: before

后: after

答案 2 :(得分:140)

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

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

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

答案 3 :(得分:44)

在需要摘樱桃的情况下的简短示例

  

请考虑以下情形。您有两个分支。

     

a)版本1 -该分支将转到您的客户,但是有   还有一些错误需要修复。

     

b)母版-经典母版分支,您可以在其中添加   release2的功能。

现在:您已修复 release1 中的某些内容。当然,您也需要 master 中的此修补程序。这是樱桃采摘的典型用例。因此,在这种情况下选择樱桃意味着您从 release1 分支进行提交,并将其包括在 master 分支中。

答案 4 :(得分:18)

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

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

Cherry pick更多地是关于如何选择提交。使用pull(rebase),git会隐式重新生成您的本地提交,而不是基于提取到您的分支的内容,但是使用cherry-pick您明确选择一些提交,并在顶部隐式重新生成它们(它们)你当前的分支。

所以你这样做的方式各不相同,但在幕后他们是非常相似的操作 - 提交的再生。

答案 5 :(得分:17)

我准备了分步的插图,例如 cherry-pick -以及这些插图的动画(即将结束)。

  1. 摘樱桃之前
    (我们将对分支L中的提交feature进行摘取): enter image description here

  1. 启动命令git cherry-pick feature~2
    feature~2是在
    之前的第二个 nd 提交。 feature,即提交L): enter image description here

  1. 执行命令(git cherry-pick feature~2)后: enter image description here

同一个动画: enter image description here


注意:

从用户的角度来看,提交L'(提交=快照)提交L的确切副本。
从技术上(内部)来说,这是一个新的,不同的提交(因为例如L包含指向K的指针,而L'包含指向E的指针) 。

答案 6 :(得分:8)

有点像Copy(从某个地方)和Paste(到某个地方),但是对于特定的提交。

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

在开发分支中执行cherry-pick,在承诺发布分支中执行merge。同样,从发布分支执行cherry-pick到主服务器。瞧

答案 7 :(得分:4)

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

找到了一篇有关采摘樱桃的出色文章,请查看有关深入详细信息:https://www.previousnext.com.au/blog/intro-cherry-picking-git

答案 8 :(得分:2)

如果要合并而没有提交ID,则可以使用此命令

git cherry-pick master~2 master~0

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

如果您要单次提交,只需删除最后一个选项

git cherry-pick master~2

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

答案 9 :(得分:2)

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

这意味着:

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

例如:考虑提交A

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

提交B

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

如果您在另一个分支上 cherry-pick commit B ,您将得到:

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

因为提交B 包含 newFileB main ,但没有 newFileA ,从而导致错误,所以请使用小心。

答案 10 :(得分:1)

摘录自官方文档:

给出一个或多个现有提交,对每个应用更改 介绍,记录每个提交的新提交。这需要你 干净的工作树(HEAD提交没有任何修改)。

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

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

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

  3. 干净地应用更改的路径在 索引文件并在您的工作树中。

  4. 对于冲突的路径,索引文件最多记录三个版本,如 在git-merge的“ TRUE MERGE”部分中进行了介绍。工作中 树文件将包含对冲突的描述,并在括号内 通常的冲突标记<<<<<<<和>>>>>>>。

没有其他修改。

Read more...