在git中,是否有办法覆盖或至少将一个文件合并到所有打开的分支中?

时间:2019-04-17 22:52:07

标签: git

在任何时候,我们都有一个master和development分支以及任意数量的打开的修补程序,feature分支等。

我想知道,缺少shell脚本,是否有一种方法可以将单个提交合并到所有分支中?

我们的测试基础架构允许我们在将不同分支合并到开发和掌握之前对其进行测试。但是有时,我们会进行基础架构更改,这将要求所有分支机构都进行通用代码更改。现在,我们进入每个分支,然后樱桃将更改逐个接一个分支。

有更好的方法吗?这个问题的扩展将是,是否还有一种方法可以强制覆盖每个分支上的整个文件?因为即使使用脚本完成,某些分支也可能存在必须解决的冲突,而另一些分支将进行不良的自动合并。但是在这种情况下,我们希望整个更新的文件覆盖每个打开的分支顶部的每个副本。

1 个答案:

答案 0 :(得分:3)

简短的回答是“否”。

更长的答案始于以下事实:您必须以某种方式定义“开放分支”,因为这不是Git概念。在Git中,分支 name 只是指向一个特定提交的标签。 分支通常是(取决于谁在说这个词)一系列未指定的提交,这些提交来自于该特定提交的reachable,但有时是分支名称。

解决了这一问题,使用git for-each-ref 1 来获取所有分支名称的列表,将其过滤为您所要表达的含义可能只是一个编程小问题。打开”,并编写一个shell脚本:

  

...缺少shell脚本...

糟糕。 :-)

shell脚本本身往往非常简单:它运行git checkout切换到所需的分支,然后运行git checkout <hash> -- <path> && git commitgit merge <hash>,并根据需要添加适当的附加参数。合并案例必须考虑发生合并冲突时的处理方式,并要求所选的<hash>可合并以产生所需的结果,而那是真正困难的部分:相应的<hash>可能因一个分支名称而异,并且在所有情况下,必须在运行脚本之前 创建要合并的特定提交。

(当然,也可以使用git checkout <hash> -- <path>代替cp /path/to/external/file <path> && git add <path>。)


1 请勿使用ls .git/refs/heads,因为它不能处理几种情况,包括压缩引用和名称形式为feature/X的分支。 请记住,git for-each-ref需要一个名称空间进行迭代:基本名称空间是refs/heads,但更有趣的名称空间可能是refs/remotes/origin。有关详细信息,请参见the documentation