Git:有没有一种从一个分支合并到多个分支的方法比串行地合并每个分支更快?

Git:有没有一种从一个分支合并到多个分支的方法比串行地合并每个分支更快?,git,version-control,merge,branch,Git,Version Control,Merge,Branch,我的处境: 我最近加入了一个已建立的项目的前端,该项目涉及越来越多的rails应用程序实例,每个实例在某些方面(视图、样式、设置等)有所不同,但它们都共享其大部分后端代码 我们的Git回购有许多分支,看起来像这样: master apple banana cherry ... strawberry tangerine ... #!/bin/bash production_branches=( branch1 branch2 branch3 ) for branch in ${product

我的处境:

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

我们的Git回购有许多分支,看起来像这样:

master
apple
banana
cherry
...
strawberry
tangerine
...
#!/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
其中,每个水果派生分支都保存生产实例的生产代码

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

我的问题:

特定于单个实例的工作非常简单,发生在分支(或其开发分支)中,等等

然而,如果我需要做一个会影响集群中所有站点的更改,我现在在一个开发分支中这样做,并将其合并到master中,然后(我的问题是)必须依次手动检查每个生产分支并将master合并到其中

即使是我谦逊的代码猴子大脑也可以看出,这并不能很好地扩展

目前我们有大约8个生产分支机构,所以还不算太糟,但我们的计划是为了增长,当增长到20个(更不用说50个以上)时,这将是一个严重的痛苦。这也将是我个人的痛苦,因为我很可能每天都在处理它

因此,我的实际问题是:

  • 在git的核心功能中是否有我所缺少的东西可以让我从master一下子优雅地合并到n个其他分支中?(我认为不太可能,但值得一问)
  • 或者,是否有一种方法可以通过巧妙的shell脚本实现这一点?(我可以补充一点,我知道的很少,理解的更少)
如果是后者,谁能帮我开始/为我指出正确的方向


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

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

好的,真正的答案是。没有内置的方法,因为(假设它不是快进的)您确实需要为git签出文件才能实现合并。幸运的是,您实际上没有做太多(
git签出和&git合并
),因此编写脚本并不麻烦。您可以使用一个配置文件使这一点复杂化,甚至可以将一些自定义内容添加到
.git/config
(例如
git config branch..productionbranch true
,然后使用git命令检查哪些分支设置了该标志),但最简单的方法是这样的:

master
apple
banana
cherry
...
strawberry
tangerine
...
#!/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

和往常一样,你可以做很多改进。例如,您可以使用一些git命令来检查master是否已经合并到给定的分支中,并避免将其签出。如果您正在处理过去失败的合并,您可以单独执行签出和合并,以防签出失败(这可能意味着工作树脏了,这意味着它们都会失败)。希望这足以让你开始

嘿,杰弗罗米,谢谢你给出了非常清晰和有用的答案——我想是时候把手弄脏了。。。