Git:从一个分支到多个分支合并是否有一种更快捷的方式,而不是按顺序进行每个分支的合并?

Tom*_*ies 11 git version-control merge branch

我的情况:

我最近加入了一个已建立项目的前端,该项目涉及越来越多的rails应用程序实例,每个实例在某些方面(视图,样式,设置等)都有所不同,但它们都占有大多数他们的后端代码.

我们的Git repo有很多分支看起来像这样:

master
apple
banana
cherry
...
strawberry
tangerine
...
Run Code Online (Sandbox Code Playgroud)

每个水果派生分支都包含生产实例的生产代码.

(Master不用于实时部署,但包含所有共享代码,是我们从中设置新实例的克隆.)

我的问题:

特定于单个实例的工作很简单,发生在分支(或它的开发分支)等中......

但是,如果我需要进行一个会影响集群中所有站点的更改,我现在在dev分支中执行此操作并将其合并到master中,然后(什么在烦我)必须手动检查每个生产分支转而将master合并到其中.

即使我的谦逊代码猴脑也可以看出这不能很好地扩展.

目前我们有8个生产分支,所以它并没有那么糟糕,但计划是为了增长,到达20甚至20(更不用说50+)的时候,这将是一个严重的痛苦.这也将是我个人的痛苦,因为我是一个可能每天都在处理它的人.

所以,我的实际问题是:

  • 有什么在我的思念,让我从优雅的主合并到核心的git功能ñ其他部门一举?(不太可能我想,但值得问的是)
  • 或者,有没有办法用狡猾的一些shell脚本来做到这一点?(我可以补充说,我知道的很少,而且理解的更少)

如果后者能够帮助我开始/指出正确的方向吗?

非常感谢您的时间和帮助.

Cas*_*bel 8

在我回答这个问题之前,我想非常清楚,在这种情况下,这只是一个好主意,其中要合并的分支是生产分支,而不是开发分支.如果你发现这篇文章正在寻找一种方法将集成分支(master)合并到你所有的主题(开发)分支中,答案是你几乎肯定不应该(见这里).

好的,真正的答案.没有内置的方式,因为(假设它不是快进的)你真的必须检查git的文件来做它的合并魔术.幸运的是,你实际上并没有做太多(git checkout && git merge)因此编写脚本没有问题.您可以使用配置文件使其复杂化,或者甚至添加一些自定义内容.git/config(例如git config branch.<branchname>.productionbranch true,然后使用git命令检查哪些分支设置了该标志),但最简单的方法是这样的:

#!/bin/bash

production_branches=( branch1 branch2 branch3 )

for branch in ${production_branches[@]}; do
    if ! ( git checkout $branch && git merge master ); then
        exit
        # Exit on the first error
        # If you want to just plow ahead, do something like this:
        # git reset --hard       # make sure there aren't merge conflicts in the tree
        # failed_merges="$failed_merges $branch"  # remember for later
    fi
done

# if you plowed ahead above, print the branches which failed to checkout+merge
# if [ -n "$failed_merges" ]; then
#     echo "Failed merges: $failed_merges"
# fi
Run Code Online (Sandbox Code Playgroud)

您可以一如既往地进行许多改进.例如,您可以使用一些git命令来检查master是否已合并到给定分支中,并避免将其检出.如果您正在继续过去失败的合并,您可以单独进行结帐并合并,以防结帐失败(这可能意味着工作树很脏,这意味着它们都会失败).希望这足以让你开始!