【问题标题】:Git merge subtrees of two local branchesGit合并两个本地分支的子树
【发布时间】:2013-09-25 02:08:49
【问题描述】:

为了我的一生,我无法让git subtree merge 工作。这是我的情况:

我正在开发一个名为 Workshop 的 Moodle 的内置部分。代码位于moodle 目录中的mod/workshop。我必须将我的本地 Moodle 升级到 2.5 并让我的 Workshop 更改在其中工作。所以,对我来说显而易见的解决方案是:

  1. 从上游检查 MOODLE_25_STABLE 分支
  2. 基于该分支创建一个名为MOODLE_25_STABLE_workshop 的分支
  3. mod/workshop 从我的MOODLE_23_STABLE_workshop 分支合并到MOODLE_25_STABLE_workshop

如果我想将MOODLE_23_STABLE_workshop 中的每个文件合并到MOODLE_25_STABLE_workshop 中,那将是简单,但我只想重播我对mod/workshop 目录的提交。有没有比cherry-pick 更简单的方法来完成六个月的提交?因为我真的,真的不想那样做。

我已经尝试过的事情:

$ git subtree merge --prefix=mod/workshop/ MOODLE_23_STABLE_workshop:mod/workshop
error: 402c67f6fedc96a6fed76e663df4e5af9dfa094e: expected commit type, but the object dereferences to tree type

$ git merge -s ours --no-commit MOODLE_23_STABLE_workshop
$ git read-tree --prefix=mod/workshop/ -u MOODLE_23_STABLE_workshop:mod/workshop
error: Entry 'mod/workshop/aggregate.php' overlaps with 'mod/workshop/aggregate.php'.  Cannot bind.
$ gormster:Documents/moodle$ git read-tree -m --prefix=mod/workshop/ -u MOODLE_23_STABLE_workshop:mod/workshop
fatal: Which one? -m, --reset, or --prefix?

感谢任何指导。

【问题讨论】:

  • 没有git subtree 命令。请确保复制并粘贴准确的命令。
  • 是的,至少在我的版本中有。我复制并粘贴了确切的命令。 imgur.com/iPUDv3z
  • 太棒了。确实有这样的命令,但它没有记录。 official documentation 对此一无所知,尽管该命令存在,但也没有在本地安装它。
  • 我会尝试git subtree merge --prefix=mod/workshop/ MOODLE_23_STABLE_workshop 没有其他路径。但这只是一个猜测,很可能无论如何它都行不通。子树合并适用于一个分支只包含子树的情况,而不是两个分支都包含所有内容,但您只想合并对某个部分的更改。
  • 对。看起来在我的情况下,我实际上应该使用变基,但这有其自身的问题,我将在一分钟内发布一个问题:P

标签: git merge branch subtree


【解决方案1】:

好吧,合并(没有处理交叉合并策略的递归部分)只是用从最近的共同祖先到远程树的差异修补本地树。

有一个命令可以获取合并基,git merge-base,但如果您使用 ...(3 个点而不是 2 个点)运算符,git diff 甚至可以自己调用它。

所以合并是:

git diff HEAD...MOODLE_23_STABLE_workshop -- mod/workshop/ | git apply -3

然后你提交它。

您可能不应该尝试将MOODLE_23_STABLE_workshop 记录为基础,因为它确实不是。如果你这样做了,下一次合并将假定你合并了所有更改并显式还原了 mod/workshop/ 之外的更改。另一方面,如果您不记录父级,则下一次合并将尝试重新应用更改,如果再次修改相同的区域,则会导致不必要的冲突,因为 git 足够聪明,可以识别已经应用的差异,但无法分辨当差异淘汰其他更改时。

【讨论】:

  • 好吧,这听起来确实像解决方案,除了 git apply 似乎不想让我控制冲突解决...
  • 用 -3 修复!标记为解决方案。谢谢先生/女士。
  • 编辑答案以包含 -3 选项。它通常会有所帮助,而且永远不会受到伤害。
猜你喜欢
  • 2014-09-23
  • 1970-01-01
  • 2021-01-18
  • 2013-05-23
  • 2019-04-15
  • 2013-04-11
  • 2017-12-15
  • 2011-09-20
  • 2014-03-06
相关资源
最近更新 更多