如果我有一个工作区,则看起来像这样:
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
?
注意:
git fetch . master:feature-x
无效,因为它们是非快进合并oliver-koo-C02WC0EJHTDG:foo oliver.koo$ git fetch . master:feature-x
From .
! [rejected] master -> feature-x (non-fast-forward)
我知道在不检出(git rebase master feature-x
)的情况下使用rebase可以实现类似的结果。但我想使用合并。
我一直在考虑使用git cherry-pick A^..B
的替代方法,但是再次可以将未经挑选的提交应用于分支而无需将其检出吗?
答案 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 -q
从HEAD
提交中加载索引,您可以在此处等效地git read-tree HEAD
,对于更合理的脚本来说,它是等效的核心命令。 / p>
从那里开始很正常:合并,修复冲突,推送。