如何检测标记的提交被合并到哪个分支

时间:2019-03-14 13:22:17

标签: git continuous-integration git-merge git-tag

作为我的ci流程的一部分,它由git标签触发,我需要使用该标签名称自动更新代码中的某些内容,然后将结果提交回git。

问题是,在成功完成合并请求之后,通常会删除分支,因此该提交的标记现在已完全分离并且不包含在任何分支中,因此“提交回git”并不是那么简单,因为我没有要提交的分支。

默认情况下,我可以提交给master,这通常可以工作,但是在某些极端情况下,我无法预测其行为。

一种更合理的解决方案是(如果可能)找出标记的提交被合并到哪个分支,以便我将其提交回该分支。

有可能吗?

(此外,如果您发现此方法有任何问题和/或有更好的建议,请分享您的想法)

1 个答案:

答案 0 :(得分:0)

您可以获得可以访问该标签的分支机构列表

git for-each-ref --contains my_tag refs/heads

(您可以使用git branch代替git for-each-ref,但是for-each-ref通常更适合在脚本中使用。您可能需要添加--format选项才能获得输出看起来像您想要的方式。)

这可能返回多个分支,您必须决定如何协调。一种策略是查看分支中的一个是否可以与另一个分支连接。例如,如果您有

x -- x -- A <-[my_tag]
            \
         ... M -- x <--(b1)
                   \
                ... M <--(b2)

我们有b1可以到达b2,并且两者都可以到达加标签的提交。如果“我认为发出了什么合并命令”很重要,您可能会更直观地说A已合并到b1中。或者,如果在最近的开发中进行提交更有效,那么在这种情况下,您可能会选择b2。无论哪种方式,您都可能遇到类似

的情况
x -- x -- A <-[my_tag]
            \
             \        x <--(b1)
              \      /
           ... M -- x
                     \
                      x <--(b2)

完全可以断言A是“合并到b1”还是“合并到b2”(相对于“合并到不再存在的其他分支”)。因此,此时,您可能只需要选择一个即可。

因此,一般来讲,您无法唯一地标识已标记提交合并到的一个分支。它可能已合并到已删除的分支中,或者甚至可能已以分离的HEAD状态合并。

由于您了解团队的分支/合并策略和其他实践,您也许可以消除其中的某些可能性,但是值得注意的是git本身对诸如“提交合并到的分支”-它只关心“当前状态下可以到达此提交的分支”之类的事情;因此您必须施加一些假设,使其更加具体。