【问题标题】:Git: is there a quicker way to merge from one branch to multiple branches than doing each one serially?Git:从一个分支合并到多个分支是否有比依次执行每个分支更快的方法?
【发布时间】:2010-02-22 16:35:14
【问题描述】:

我的情况:

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

我们的 Git 存储库有许多分支,如下所示:

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

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

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

我的问题:

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

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

即使是我不起眼的代码猴脑也能看出这不能很好地扩展。

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

所以,我的实际问题是:

  • 我缺少的核心 git 功能中是否有一些东西可以让我一举从 master 优雅地合并到 n 其他分支? (我认为不太可能,但值得一问)
  • 或者,是否有办法通过一些巧妙的 shell 脚本来做到这一点? (我可以补充一下,我知道的很少,了解的更少)

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

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

【问题讨论】:

    标签: git version-control merge branch


    【解决方案1】:

    在我回答这个问题之前,我想非常清楚,这只是一个好主意,在这种情况下要合并的分支是生产分支,而不是开发分支。如果您发现这篇文章正在寻找一种将集成分支(主)合并到所有主题(开发)分支中的方法,答案是您几乎肯定不应该 (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 是否已经合并到给定分支中,并避免将其检出。如果您要继续过去失败的合并,则可以单独进行结帐和合并,以防结帐失败(这可能意味着工作树很脏,这意味着它们都会失败)。希望这足以让您入门!

    【讨论】:

    • 嘿 Jefromi,感谢您提供非常清晰和有用的答案 - 我想我该把手弄脏了...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-30
    • 2016-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-11
    相关资源
    最近更新 更多