git cherry-pick从编程中合并

时间:2019-02-22 12:56:13

标签: git

我们使用的git工具的工作原理类似于GitHub PR系统。因此,东西git merge --no-ff被添加到母版上。

发行版发布时,我们会剪切发行版分支。所有其他错误修复程序将首先合并到母版,然后cherry-pick到发行分支。我想以编程方式执行此操作。

所以:

commit bla
Merge: aaaa bbbb

我想:

  1. 弄清楚合并中包含的提交哈希
  2. git cherry-pick提交哈希

如何找到包含的合并提交? Merge:行的语法是什么?

1 个答案:

答案 0 :(得分:2)

如果您确定只想选择一个提交,则可以选择合并的第二个父级(例如,合并到的分支的尖端,在示例中为bbbb),例如所以:git cherry-pick bla^2(我使用您漂亮的名字来进行合并提交)

如果要尝试选择整个提交范围,则要稍微复杂一点,但是基本上,您必须找到合并分支发散的点,并进行一些设置算法。前者可以使用git merge-base来完成,后者可以使用..语法(A..B的含义:可以从B到达但不能从A到达的任何东西):

git cherry-pick $(git merge-base bla^1 bla^2)..bla^2

但是,如果合并分支中还有其他合并(例如,将master合并到bugfix分支中,然后再合并回master),则情况会变得更加复杂。在这种情况下,我建议您不要尝试自动执行此操作,因为它太容易出错。


编辑:您更新了问题,以询问日志中Merge行的语法。实际上很简单。在数据结构方面,合并提交与普通提交的不同之处在于它具有多个父级(普通提交仅以其紧接的“祖先”作为父级)。在通过git merge和其他高级工具完成的正常合并中,第一个父项(在您的示例中为aaaa)是在合并时位于基础分支尖端的提交,第二个父级(bbbb)是您合并的所有内容的最高提交-因此,我上面的建议bla^2:2指的是第二个父级,即bbbb

一个不寻常的情况是与超过两个父级的合并提交,称为章鱼合并。如果将多个branch / commit参数传递给git merge,则将获得章鱼合并。很少有人用过这些,它们使解决冲突变得更加乏味且容易出错,我只是为了完整起见只提到它们。

相关问题