樱桃挑选Git意味着什么?

Rah*_*hul 2117 git cherry-pick git-cherry-pick

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

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

Phi*_*rie 2568

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

这与其他方式如对比度mergerebase通常应用于许多提交到另一个分支.

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

    git checkout master
    
    Run Code Online (Sandbox Code Playgroud)
  2. 执行以下操作:

    git cherry-pick <commit-hash>
    
    Run Code Online (Sandbox Code Playgroud)

注意:

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

    git cherry-pick -x <commit-hash>
    
    Run Code Online (Sandbox Code Playgroud)

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

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

    git notes copy <from> <to>
    
    Run Code Online (Sandbox Code Playgroud)

其他链接:

  • 如果你从公共分支中挑选,你应该考虑使用`git cherry-pick -x <commit-hash>`.这将生成标准化的提交消息.这样,您(和您的同事)仍然可以跟踪提交的来源,并可能避免将来发生合并冲突. (222认同)
  • 仅供参考:提交在语义上包含当时工作树的所有文件(以及先前提交的提交哈希),因此您不会将整个提交应用于另一个提交,而是提交对先前提交所做的更改. "cherry-pick commit在当前分支上应用由命名提交引入的更改""大多数ppl倾向于将提交视为更改(如svn is iirc),但事实并非如此,每次提交都指向完整的工作树.虽然这在这种情况下没有区别,但它可以帮助理解为什么git像它一样工作. (44认同)
  • 请注意,如果您在提交中附加了注释,则不会遵循樱桃选择.你必须使用`git notes copy <from> <to>`将它们带到一起. (10认同)
  • git push是对master进行更改的最后一步 (5认同)
  • @Zitrax 注释与提交消息不同吗?我的单个“gitcherry-pick”命令也能够带来我的提交消息。你在谈论别的事情吗?我根本不需要运行“gitnotes”命令来完成它。 (3认同)
  • `-x` 选项的用途:记录提交时,在原始提交消息中附加一行“(cherry pick from commit …​)”,以指示此更改是从哪个提交中挑选出来的。https://git-scm.com/docs/git-cherry-pick (3认同)
  • 樱桃采摘真的有必要吗?混合复位或软复位不会做类似的工作吗? (2认同)

Teo*_*ahi 287

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

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

Youtube:Git樱桃挑选简介

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

$ git checkout rel_2.3
$ git cherry-pick dev~2 # commit F, above
Run Code Online (Sandbox Code Playgroud)

之前: 之前

后: 后

  • 当在某个分支(b1)上采取樱桃挑选的提交,然后交付给主人.如果分支b1(最初从中提取提交)也尝试传递给master.冲突怎么样?这是照顾或如何工作? (10认同)
  • 应该强调的是:在给定的例子中,*仅*差值(F-E)应用于Z.这是一个狭窄的情况.Cherry-pick可用于应用多个提交的差异,例如,两个非相邻提交之间的所有差异.例如,从上面,(F-E),(E-D),(D-C)和(C-B).这相当于应用差异(F - B). (9认同)
  • @j2emanue 换句话说,cherry-pick 只会更改最后一次提交。如果您提交 3 次不同的时间,并且如果您选择最后一个,则第一次和第二次提交不会发生更改。合并命令将接受您的所有更改并应用于您的目标(主)分支。 (3认同)
  • @parasrish是的,他们已经处理过你之前的合并了.所以你从(b1)分支改变了a,b,c,d.你樱桃只选了"c".然后在将来从(b1)合并到master之后,由于"c"更改相同,它只会合并a,b,d并保持"c"更改.但是如果您回滚合并,那么您将返回包含"c"的更改.您需要单独回滚它们. (2认同)
  • 此外,如果所选的Commit(示例中的F)具有多个前一个前任,会发生什么? (2认同)
  • @ThomasBitonti我认为很清楚只有差异(F - E)应用于Z。字母表示提交,单个提交应用于Z。您也可以在命令中清楚地看到它。OP还询问“什么是樱桃采摘”,而不是如何应用“多个樱桃采摘”。此外,从单个提交中应用樱桃选择并不是一个狭隘的案例,它几乎是一个广泛的案例场景。 (2认同)

Tad*_*eck 153

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

要使用它,您只需要git cherry-pick hash,hash其他分支的提交哈希.

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


Dan*_*ník 82

情况的简短例子,当你需要樱桃挑选

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

a)release1 - 这个分支将交给您的客户,但仍有一些问题需要修复.

b)master - 经典主分支,您可以在其中添加release2的功能.

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

  • 为什么不使用合并呢? (4认同)
  • 您可能只需要另一种方式。您已修复了master的一个错误,应将其精选为release1。而且它们可能是存储库而不是分支 (2认同)
  • 我会:创建发行版分支,在分支中修复它,在发行版中合并分支,在主版本中合并发行版。 (2认同)

小智 50

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

  1. checkout(切换到)目标分支.
  2. git cherry-pick <commit id>
    
    Run Code Online (Sandbox Code Playgroud)

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

    git cherry-pick 9772dd546a3609b06f84b680340fb84c5463264f
    
    Run Code Online (Sandbox Code Playgroud)
  3. 推到目标分支

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


小智 21

你可以想一下,如果一个樱桃选择与一个rebase类似,或者它的管理就像一个rebase.通过这个,我的意思是它需要一个现有的提交并重新生成它,作为起点,你当前所在分支的负责人.

A rebase接受具有父X的提交并重新生成提交,就好像它实际上具有父Y一样,这正是它的cherry-pick作用.

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

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

  • 功能完成后,我想使用樱桃选择而不是git merge.每个人在完成一项功能时总是会执行git merge feature_branch.为什么不使用cherry-pick命令?你有什么想法吗?如果我能挑选的话,为什么要打扰提交 (3认同)

man*_*elf 17

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

这意味着 :

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

例如:考虑提交 A

added newFileA
modified main:
+ import './newFileA'
Run Code Online (Sandbox Code Playgroud)

提交 B

added newFileB
modified main:
+ import './newFileB'
Run Code Online (Sandbox Code Playgroud)

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

/newFileB
/main :
   import './newFileA'
   import './newFileB'
Run Code Online (Sandbox Code Playgroud)

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

  • 当然是最有趣的答案,因为它谈论的是重要的东西,文件,而不是整个提交。 (6认同)

Mar*_*anD 12

我准备了分步演示的插图,摘樱桃也做了这些动画的插图(接近尾声)。

  1. 在选择樱桃之前
    (我们将对分支中的提交进行樱桃选择): Lfeature在此处输入图片说明

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

  1. 执行命令(git cherry-pick feature~2)后: 在此处输入图片说明

相同的动画: 在此处输入图片说明


注意:

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

  • @PriyankThakkar,是的,**完全是L**,没有别的(正如你从图片/动画中看到的那样)。 (2认同)
  • »提交“L”从用户的角度来看(提交 = 快照)是提交“L”的精确副本。« – 不,它不是同一个快照(除非快照 K 和 E 已经相同) ,只是相同的差异(即E→L' = K→L)。 (2认同)

小智 10

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

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

做你cherry-pick在开发分支,merge即承诺一个发布分支.同样,cherry-pick从发布分支到master.瞧


Wol*_*ack 10

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

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


Bil*_*rov 6

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

git cherry-pick master~2 master~0
Run Code Online (Sandbox Code Playgroud)

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

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

git cherry-pick master~2
Run Code Online (Sandbox Code Playgroud)

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