最近,我被要求cherry-pick
提交。
那么在git中挑选一个提交意味着什么呢?你是怎么做到的?
答案 0 :(得分:2239)
Git中的Cherry选择意味着从一个分支中选择一个提交并将其应用到另一个分支。
这与其他方式形成对比,例如merge
和rebase
通常会将许多提交应用到另一个分支上。
确保您在要应用提交的分支上。
git checkout master
执行以下操作:
git cherry-pick <commit-hash>
N.B:
如果你从公共分支机构挑选,你应该考虑使用
git cherry-pick -x <commit-hash>
这将生成标准化的提交消息。这样,您(和您的同事)仍然可以跟踪提交的来源,并可能在将来避免合并冲突。
如果您在提交中附有说明,则不会遵循樱桃选择。要把它们带过来,你必须使用:
git notes copy <from> <to>
其他链接:
答案 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
之前:
后:
答案 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 -以及这些插图的动画(即将结束)。
注意:
从用户的角度来看,提交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提交没有任何修改)。
当不清楚如何应用更改时,会发生以下情况:
当前分支和HEAD指针停留在最后一次提交 成功制作。
将CHERRY_PICK_HEAD引用设置为指向引入的提交 难以应用的更改。
干净地应用更改的路径在 索引文件并在您的工作树中。
对于冲突的路径,索引文件最多记录三个版本,如 在git-merge的“ TRUE MERGE”部分中进行了介绍。工作中 树文件将包含对冲突的描述,并在括号内 通常的冲突标记<<<<<<<和>>>>>>>。
没有其他修改。