【问题标题】:Git - Recursively merge master into all feature branchs without checking out each feature branch outGit - 递归地将 master 合并到所有功能分支中,而不检出每个功能分支
【发布时间】:2019-10-22 14:31:52
【问题描述】:

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

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. 我知道在没有结帐的情况下使用 rebase 可以达到类似的结果 (git rebase master feature-x)。但我想使用合并。

  2. 我一直在考虑使用 git cherry-pick A^..B 的替代方案,但是否可以在不检查分支的情况下将精选提交应用到分支?

【问题讨论】:

  • 不可能。 git merge mastermaster 合并到当前签出的分支,您甚至无法命名要合并到的分支。 cherry-pick 也是如此。请参阅stackoverflow.com/a/4157106/7976758:“需要检查目标分支才能解决冲突等问题(如果 Git 无法自动合并它们)。
  • @phd 您是否知道是否有文档支持该评论“需要检查目标分支才能解决冲突等问题(如果 Git 无法自动合并它们) 。”
  • 简短的回答是否定的;长答案是使用git worktree add 在每个分支上添加额外的工作树,以便您可以检查分支

标签: git github merge git-merge


【解决方案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 选项使克隆共享源的对象 db,这正是你想要什么像这样从头开始工作,-b 选项设置HEAD,即签出分支。总而言之,该克隆总共使用了几十 kbytes(用于克隆的 ref 和 repo 脚手架)。

git reset -qHEAD 提交加载索引,您可以在此处等效为git read-tree HEAD,对于更迂腐正确的脚本,它是核心命令等效项。

从那里开始是正常的:合并、修复冲突、推送。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-05
    • 1970-01-01
    • 1970-01-01
    • 2020-06-24
    • 2021-01-12
    • 2013-06-02
    相关资源
    最近更新 更多