使用 Git 将 master 的更改合并到所有分支中?

Posted

技术标签:

【中文标题】使用 Git 将 master 的更改合并到所有分支中?【英文标题】:Merging changes from master into all branches using Git? 【发布时间】:2011-01-20 17:52:39 【问题描述】:

我使用 git 来维护我的代码的多个工作副本。这个想法是我可以检查任何分支,构建并运行它以查看分支的特性 x 是否适合代码的当前状态。

Git 的主分支是 Trunk,其他 git 分支是我想尝试的功能或东西。因此,我的典型用法是使用最新的修复程序更新 master,然后将 master 合并到各个分支中,以便每个分支都保持最新。

这个系统对我来说很好用,除了我必须检查一个分支,合并主分支并为其他分支冲洗/重复。考虑到像 git 这样的版本控制系统,考虑到随着时间的推移我很容易产生很多分支,我看不到这种扩展性很好。

我仍然是一个 git 初学者,所以我怀疑 git 可能已经有某种我可能会丢失的机制。有吗?如果没有,如何对所有分支进行更改,以便它们自己保持最新状态?

【问题讨论】:

你有那个问题的代码实现吗? 不,最初这是一个相当手动的过程。这也是我还是 git 初学者的时候。我现在用的是git flow,很相似,但是不需要我维护好几个脚本。 【参考方案1】:

如果

    您要合并最新主提交的分支未发布并且 您希望 master 中的所有提交都在其他分支中

那么你可以在 master 更新后简单地将它们 rebase 到 master 上。如果您使用的是 Unix shell,这个小脚本可能会起作用。它将每个分支 rebase 到 master 上。

for BRANCH in `ls .git/refs/heads`; do git rebase master $BRANCH; done

【讨论】:

太棒了!我更喜欢合并而不是变基:for BRANCH in `ls .git/refs/heads`; do git checkout $BRANCH; git merge master; done 在我推送到原点之后:for BRANCH in `ls .git/refs/heads`; do git push origin $BRANCH; done【参考方案2】:

一种可能性(我自己没有测试过)是:

建立一个裸仓库,您可以在其中推送您的主分支。 在该裸仓库上有一个接收后挂钩(请参阅githooks man page),然后将 master 推送到您想要的每个“功能”仓库 每个功能存储库都有一个接收后挂钩以开始: 你的特性分支在 master 之上的 rebase(如果你还没有将你的特性分支推送到其他地方,那很好) 或在您的功能分支上合并 master。

您仍然需要访问您的功能存储库并检查变基或合并是否由于某些合并冲突而未被阻止。

【讨论】:

是的,我需要手动解决任何合并冲突。谢谢。我不知道钩子甚至存在。我有一些阅读要做:kernel.org/pub/software/scm/git/docs/githooks.html @carleeto:好点,我在我的答案中添加了 githooks 手册页链接。 这听起来像是您建议使用多个存储库而不是多个分支。 @Abizern:是的,我对 OP 问题的第一个解释是能够同时检查和编译多个功能(因此所有克隆问题)。但我可能在这里误解了这个问题。 @edi9999 不,我没有。【参考方案3】:

以下检查每个分支并进行合并

for BRANCH in $(ls .git/refs/heads);
  do git checkout $BRANCH ; 
  git merge origin/master $BRANCH ; 
done

【讨论】:

你真的运行过这个吗? for b in $(< .git/refs/heads); do echo $b ; done 什么也不打印,所以我无法想象它怎么能做任何事情。 我的错,for 的 BRANCH 变量正在使用 $BRANCH。 您可以从我提供的代码中看出这不是问题。 @Jeff 已修复。后实现。泰! git merge之后添加--no-edit以避免所有提示

以上是关于使用 Git 将 master 的更改合并到所有分支中?的主要内容,如果未能解决你的问题,请参考以下文章

在 Git 中获取从 master 到分支的更改

git:清理 git 历史记录并仅在 master 中保留合并的提交

git 如何把develop分支代码合并到master主分支

git merge master branch来发布分支问题

git pull 从 master 到 development 分支

将一项更改合并到 Git 中的多个分支