git - git cherry-pick 以编程方式从合并中挑选
问题描述
我们正在使用一个类似于 GitHub PR 系统的 git 工具。所以东西被git merge --no-ff
编到主人身上。
当发布即将发布时,我们会削减发布分支。任何进一步的错误修复都会首先合并到 master ,然后再cherry-pick
编辑到发布分支。我想以编程方式执行此操作。
所以:
commit bla
Merge: aaaa bbbb
我想:
- 找出合并包含的提交哈希
git cherry-pick
提交哈希
如何找到包含的合并提交?该行的语法是Merge:
什么?
解决方案
如果您确定您只想选择一个提交,您可以选择合并的第二个父项(即您合并的任何分支的尖端,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
. 很少有人使用这些,它们使解决冲突变得更加乏味和容易出错,我真的只是为了完整起见才提到它们。
推荐阅读
- bash - Bash 将字符附加到与另一个文件中的 IP 地址匹配的行的开头
- r - 在R中选择特定行周围的行
- r - 由线条函数生成的绘图线未显示在闪亮的绘图输出上
- reactjs - this.state.items.map 不是函数。解决方案可能是什么?
- awk - 如何仅在第一次出现匹配的行上进行替换?
- apache-zookeeper - 为什么curator不使用连接池来管理连接
- java - 拆分数千java
- html - 如何在不重复选择器的情况下为具有不同祖先的后代编写 Sass?
- r - 通过迭代保存从电子邮件中提取的附件
- sugarcrm - 如何确保 Sugar 字段验证有足够的时间运行