理解git cherry-pick

9

从svn的背景来看:我很少分支,因为切换速度缓慢,将分支合并回主干需要一个小时以上。有时,如果我需要在网站上热修复问题,我会在主干中进行更改(与之前的更改或新功能一起),然后转到该文件并只运行“svn up path/to/filename”,它将仅更新该文件,修复问题但节省其他文件。

从概念上讲,在git中似乎不可能(也不必要)这样做;是结构化的暂存和分组提交允许挑选吗?因此,我可能会更改站点的特定区域,并将其作为一组提交,而不是像svn那样工作,一天内触摸整个批次并立即提交整个批次?

1个回答

11

在这种情况下,您可能想要做的是为您的热修复创建一个新分支,该分支从将需要修复的所有分支的共同祖先分支中分支出来。例如,假设您有几个维护的版本与您当前的开发:

- X - o - o - o - o - o - o - o - o - o (master)
   \                       \
    o - o - o (release A)   o - o (release B)
如果你需要制作一个既适用于主分支又适用于两个发行版的热修复,那么请从标有X的提交开始创建一个分支。提交你的修复,然后将该分支合并到所有三个分支中。
虽然你可以使用cherry-pick命令,但是这里有一个关于何时使用cherry-pick的好经验法则:不要使用它。唯一需要使用cherry-pick的情况是你管理分支的方式出了问题。在这种情况下,可能意味着你在主分支上进行了修复而没有从早期版本分支中正确地创建分支,导致其他人已经拉取了主分支的更新,因此你无法更改它。你需要使用cherry-pick来将修改应用到两个发行版分支。但是,当然,你应该首先正确地管理你的分支,这样就不需要使用cherry-pick了。(是的,有时候仍然会发生这种情况;生活就是如此。)

这太棒了。我刚刚尝试了一些“git branch foo old-merge-sha1”的操作,真是太神奇了。 - Hans
在创建“FeatureA”分支后,再为主题(s)从“FeatureA”分支出一个分支,当它们准备好时将其合并到FeatureA中,但在整个FeatureA准备好之前不要触碰master,当您将FeatureA合并到master时才会触碰master。目前(在svn中),如果我正在处理需要几周时间并且需要热修复的内容,我会按照我在问题描述中所述的方式进行操作(svn up path/to/filename),然后继续进行。Git分支似乎是一个“经常合并”的建议,但是如果我不希望在准备好之前触碰主干/主线,这样我就可以自由地更新网站,该怎么办呢? - Hans
2
@Hans:在合并之前,你不需要合并。通常情况下,主分支是当前稳定的分支,所以如果你想要移动一个部分但是稳定的功能,那么你可以这样做,但是一般来说,你应该只合并完整的东西。而且,很可能有几个不同类型的稳定分支——一个用于给定版本(用于您的网站),一个用于当前稳定测试,一个用于不稳定测试……只需确保始终按正确方向合并(主题->功能->主分支或不稳定->稳定)。 - Cascabel
2
@Hans:你可能会发现Junio Hamano关于分支/合并哲学的文章很有帮助:http://gitster.livejournal.com/42247.html,你也可能会喜欢这篇关于“分支模型”的文章http://nvie.com/git-model。 - Cascabel
你应该将这个“挑拣(cherry-pick)的经验法则:不要”用粗体突出。 - cregox

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接