用Git挑选一个提交是什么意思?

#0做什么?

1877159 次浏览

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

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

完整过程见:http://technosophos.com/2009/12/04/git-cherry-picking-move-small-code-patches-across-branches.html

樱桃采摘在Git中意味着从一个分支中选择一个提交并将其应用到另一个分支。

这与mergerebase等其他方式形成对比,这些方式通常将许多提交应用于另一个分支。

它也可以樱桃选择多次提交,但合并比采摘樱桃更可取。

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

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

     git cherry-pick <commit-hash>

注:

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

     git cherry-pick -x <commit-hash>

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

  2. 如果你有注释附加到提交,他们不会遵循樱桃选择。要把它们带过来,你必须使用:

     git notes copy <from> <to>

附加链接:

本文摘自:使用Git进行版本控制

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

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

之前:之前

之后:后

另外,这里有一个非常好的动作视频教程:YouTube:介绍Git chiry-选择

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

  1. 签出(切换到)目标分支。
  2. git chury-选择<提交id>

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

    git cherry-pick 9772dd546a3609b06f84b680340fb84c5463264f
  3. push to target branch

Visit https://git-scm.com/docs/git-cherry-pick

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

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

在开发分支中执行cherry-pick,在发布分支中执行merge。同样,从发布分支执行cherry-pick到master。瞧

你可以认为樱桃选择类似于rebase,或者更确切地说,它是像rebase一样管理的。我的意思是,它接受一个现有的提交并以你当前所在分支的头部为起点重新生成它。

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

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

所以你做的方式不同,但在引擎盖下,它们是非常相似的操作-提交的再生。

简短的例子,当你需要樱桃采摘

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

a)发布时间-此分支将发送给您的客户,但有还有一些错误需要修复。

b)大师-经典主分支,例如添加发布功能2.

现在:您在发布时间中修复了一些东西。当然,您在大师中也需要此修复。这是樱桃选择的典型用例。因此,在这种情况下,樱桃选择意味着您从发布时间分支获取提交并将其包含到大师分支中。

当你在一个项目上与开发团队合作时,管理多个git分支之间的更改可能会成为一项复杂的任务。有时你不想将整个分支合并到另一个分支中,只需要选择一两个特定的提交。这个过程称为樱桃挑选。

找到了一篇关于樱桃采摘的好文章,查看深入的细节:https://www.previousnext.com.au/blog/intro-cherry-picking-git

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

git cherry-pick master~2 master~0

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

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

git cherry-pick master~2

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

我准备了一步一步的插图樱桃采摘做了什么-和这些插图的动画(接近尾声)。

  1. 采摘樱桃之前
    (我们将从分支feature执行樱桃采摘的提交L):输入图片描述

  1. 启动命令git cherry-pick feature~2
    feature~2
    之前的2nd提交feature,即提交L):输入图片描述

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

相同的动画:输入图片描述


备注:

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

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

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

这意味着:

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

例如:考虑提交一份

added newFileAmodified main:+ import './newFileA'

提交B

added newFileBmodified main:+ import './newFileB'

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

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

由于提交B包含newFileB主要,但没有新文档,导致bug,所以要谨慎使用。

摘自官方文档:

给定一个或多个现有提交,应用每个更改引入,为每个记录一个新的提交。这需要您要清理的工作树(没有来自HEAD提交的修改)。

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

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

  2. CHERRY_PICK_HEADref设置为指向引入的提交这是一个很难实现的变化。

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

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

没有其他修改。

阅读更多…