首页 > 解决方案 > git cherry-pick 以编程方式从合并中挑选

问题描述

我们正在使用一个类似于 GitHub PR 系统的 git 工具。所以东西被git merge --no-ff编到主人身上。

当发布即将发布时,我们会削减发布分支。任何进一步的错误修复都会首先合并到 master ,然后再cherry-pick编辑到发布分支。我想以编程方式执行此操作。

所以:

commit bla
Merge: aaaa bbbb

我想:

  1. 找出合并包含的提交哈希
  2. git cherry-pick提交哈希

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

标签: git

解决方案


如果您确定您只想选择一个提交,您可以选择合并的第二个父项(即您合并的任何分支的尖端,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 合并回 master 之前将其合并到 bugfix 分支中),这会变得有点复杂。在这种情况下,我建议不要尝试自动执行此操作,这太容易出错了。


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

一个有点不寻常的情况是合并提交与两个以上的父母,称为章鱼合并。如果您将多个分支/提交参数传递给git merge. 很少有人使用这些,它们使解决冲突变得更加乏味和容易出错,我真的只是为了完整起见才提到它们。


推荐阅读