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

时间:2010-02-22 16:35:14

标签: git version-control merge branch

我的情况:

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

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

master
apple
banana
cherry
...
strawberry
tangerine
...

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

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

我的问题:

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

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

即使我的谦逊代码猴脑也能看出这种情况不能很好地扩展。

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

所以,我的实际问题是:

  • 我缺少的核心git功能中有什么能让我一举优雅地从大师合并到 n 其他分支? (不太可能我想,但值得问的是)
  • 或者,有没有办法用狡猾的一些shell脚本来做到这一点? (我可以补充一点,我知道的很少,甚至更少了解)

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

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

1 个答案:

答案 0 :(得分:8)

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

好的,真正的答案。没有内置的方式,因为(假设它不是一个快进的)你真的必须检查文件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

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