题 樱桃挑选git是什么意思?


最近,我被要求樱桃选择提交。但我不知道这意味着什么。那是什么呢 cherry picking git中的提交是什么意思?你怎么做呢?


1366
2018-02-18 07:20


起源


而不是合并,从分支到目标分支(例如:master)的樱桃挑选重新提交更容易。 - Levent Divilioglu


答案:


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

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

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

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

    git cherry-pick <commit-hash>
    

N.B:

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

    git cherry-pick -x <commit-hash>
    

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

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

    git notes copy <from> <to>
    

其他链接:


1637
2018-02-18 07:29



如果你从公共分支机构挑选,你应该考虑使用 git cherry-pick -x <commit-hash>。这将生成标准化的提交消息。这样,您(和您的同事)仍然可以跟踪提交的来源,并可能避免将来发生合并冲突。 - MBober
樱桃采摘真的有必要吗?混合复位或软复位不会做类似的工作吗? - Nav
请注意,如果您在提交中附加了注释,则不会遵循樱桃选择。你必须使用 git notes copy <from> <to> 把他们带过去。 - Zitrax
git push是对master进行更改的最后一步 - feel good and programming
仅供参考:提交在语义上包含当时工作树的所有文件(以及先前提交的提交哈希),因此您不是将整个提交应用于另一个提交,而是提交对先前提交所做的更改 "cherry-pick commit applies the changes introduced by the named commit on the current branch" 大多数人都倾向于认为提交是变更(比如svn是iirc),但事实并非如此,每次提交都指的是完整的工作树。虽然这在这种情况下没有区别,但它可以帮助理解为什么git像它一样工作。 - Emile Vrijdags


这句话取自; 使用Git进行版本控制 (真的好书,如果你对git感兴趣,我鼓励你买它)

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

Youtube:Git樱桃挑选简介

使用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


184
2018-05-13 15:06



当在某个分支(b1)上采取樱桃挑选的提交,然后交付给主人。如果分支b1(最初从中提取提交)也尝试传递给master。冲突怎么样?这是照顾或如何工作? - parasrish
@parasrish是的,他们已经处理过你之前的合并了。所以你从(b1)分支改变了a,b,c,d。你樱桃只挑选了“c”。然后将来从(b1)合并到master后,由于“c”更改相同,它只会合并a,b,d并保持“c”更改。但是如果您回滚合并,那么您将返回其中带有“c”的更改。您需要单独回滚它们。 - Teoman shipahi
应该强调的是:在给出的例子中, 只要 差值(F - E)应用于Z.这是一个狭窄的情况。 Cherry-pick可用于应用多个提交的差异,例如,两个非相邻提交之间的所有差异。例如,以上,(F-E),(E-D),(D-C)和(C-B)。这相当于应用差异(F - B)。 - Thomas Bitonti
此外,如果所选的Commit(示例中的F)具有多个前一个前任,会发生什么? - Thomas Bitonti
@ThomasBitonti我认为很明显只有差异(F - E)应用于Z.字母表示提交,单个提交应用于Z.您也可以在命令中清楚地看到它。 OP也询问“什么是樱桃采摘”,而不是如何申请“多个樱桃采摘”。此外,从单一提交应用樱桃选择并不是一个狭窄的情况,它几乎是一个广泛的情况。 - Teoman shipahi


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

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

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


125
2018-02-18 07:29





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

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

    这里commit id是另一个branch.Eg的活动id。

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

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


25
2017-08-24 09:39





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

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

Cherry pick更多地是关于如何选择提交。同 pull (rebase),git隐含地重新生成你的本地提交,除了你的分支,但有 cherry-pick 您明确选择了一些提交,并在当前分支的基础上隐式重新生成它们(它们)。

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


8
2018-01-31 22:19



我发现这是一个非常有用的观点。这意味着原因 cherry-pick 行为与目标分支稍后合并回源分支时的行为方式相同。谢谢你,先生。 - Aluan Haddad
功能完成后,我想使用樱桃选择而不是git merge。每个人在完成一项功能时总是会执行git merge feature_branch。为什么不使用cherry-pick命令?你有什么想法吗?如果我能挑选的话,为什么要打扰提交 - j2emanue


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

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

做你的 cherry-pick 在一个开发分支,和 merge 提交发布分支。同样,做一个 cherry-pick 从发布分支到掌握。瞧


3
2017-10-07 11:55