Git-将master递归合并到所有功能分支中,而无需签出每个功能分支

时间:2019-06-07 05:13:17

标签: git github merge git-merge

如果我有一个工作区,则看起来像这样:

oliver-koo-C02WC0EJHTDG:foo oliver.koo$ git log --all --decorate --oneline --graph
* f528ce3 (HEAD -> master) someone else made a change
| * 447855b (feature1.2) feature 1.2
| | * f3e4d2f (feature-1.1) create feature 1.1
| |/  
| * b04c5c6 (feature-1) create feature 1 core
|/  
* 06a8ddb (origin/master, origin/HEAD) Update stuff

以及每个分支轨道的父分支,如下所示:

oliver-koo-C02WC0EJHTDG:foo oliver.koo$ git branch -vv
  feature-1   b04c5c6 [master: ahead 1, behind 1] create feature 1 core
  feature-1.1 f3e4d2f [feature-1: ahead 1] create feature 1.1
  feature1.2  447855b [feature-1: ahead 1] feature 1.2
* master      f528ce3 [origin/master: ahead 1] someone else made a change

是否有一种方法(甚至可能)将master递归合并到所有子分支中,而无需签出每个子分支并执行git merge master


注意:

  1. answer建议使用git fetch . master:feature-x无效,因为它们是非快进合并
oliver-koo-C02WC0EJHTDG:foo oliver.koo$ git fetch . master:feature-x
From .
 ! [rejected]        master          -> feature-x  (non-fast-forward)
  1. 我知道在不检出(git rebase master feature-x)的情况下使用rebase可以实现类似的结果。但我想使用合并。

  2. 我一直在考虑使用git cherry-pick A^..B的替代方法,但是再次可以将未经挑选的提交应用于分支而无需将其检出吗?

1 个答案:

答案 0 :(得分:1)

如果您的意思是“不检出每个分支中的所有文件”,则可以。合并确实需要检查潜在的冲突,并且可能需要将它们留给您检查/修复,因此它确实需要工作树,但是您不必检出所有文件,只需设置索引并HEAD,将工作树留空。

这意味着,您可以非常便宜地在tmpfs克隆中进行合并。

rm -rf ${scratchmerge=`mktemp -d`}
git clone -nsb branch1 $scratchmerge  # minimal clone, <1MB even for the linux repo
cd $_
git reset -q
git merge master
fix any conflicts and commit if needed
git push
cd -

-n选项使克隆不执行检出操作,因此工作树保持为空(并且未读入索引),-s选项使克隆共享原始对象的数据库,这正是您想要的临时工作,并且-b选项设置了HEAD(已签出的分支)。总而言之,该克隆总共使用了几十KB(用于克隆的refs和repo支架)。

git reset -qHEAD提交中加载索引,您可以在此处等效地git read-tree HEAD,对于更合理的脚本来说,它是等效的核心命令。 / p>

从那里开始很正常:合并,修复冲突,推送。