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

标签 git version-control merge branch

我的情况:

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

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

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

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

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

我的问题:

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

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

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

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

所以,我的实际问题是:

  • 核心 git 功能中是否有一些我遗漏的东西可以让我一口气从 master 优雅地 merge 到 n 个其他分支? (我认为不太可能,但仍然值得一问)
  • 或者,是否可以使用一些巧妙的 shell 脚本来完成此操作? (其中我可能会补充一点,我知道的很少,了解的更少)

如果是后者,谁能帮助我开始/指出正确的方向?

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

最佳答案

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

好的,真正的答案。没有内置方式,因为(假设它不是快进方式)您确实必须 check out 文件以便 git 执行 merge 魔术。幸运的是,您实际上并没有做太多事情 ( 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 是否已经 merge 到给定的分支中,并避免将其 check out 。如果你继续过去失败的 merge ,你可以单独进行 check out 和 merge ,以防 check out 失败(这可能意味着脏工作树,这意味着它们都会失败)。希望这足以让您入门!

关于Git:有没有一种从一个分支 merge 到多个分支比串行执行每个分支更快的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2312387/

相关文章:

git - 通过 Git 远程跟踪分支的给定名称如何找到哪个本地分支跟踪它?

php - 在没有 Git 的情况下读取 Git 存储库

git - merge 了两个 Git 分支,推送到服务器上,现在如何取消 merge 它们

r - 在 R 中合并数据

Git blame committed 行

java - Java 是否有围绕 subversion 和 Git 的 API 包装器?

Github-如何在我的本地机器上找到未发布的分支?

git - 从 JGit 中的 RevCommit 对象获取提交信息

c++ - git 冲突解决文件并不总是代表源文件中的每一行吗?

Git:在 merge 过程中忽略一些文件(将一些文件限制在一个分支中)