Git合并两个本地分支的子树

时间:2013-09-25 02:08:49

标签: git merge branch subtree

对于我的生活,我无法让git subtree merge工作。这是我的情况:

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

  1. 从上游
  2. 查看MOODLE_25_STABLE分支
  3. 根据该分支创建名为MOODLE_25_STABLE_workshop的分支
  4. mod/workshop分支中的MOODLE_23_STABLE_workshop合并到MOODLE_25_STABLE_workshop
  5. 如果我想将MOODLE_23_STABLE_workshop中的每个文件合并到MOODLE_25_STABLE_workshop,那将是 easy 但我只想将我的提交重播到{{1} } 目录。通过六个月的提交,是否有一种比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
    

    感谢任何指导。

1 个答案:

答案 0 :(得分:1)

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

有一个命令可以获得合并基础git merge-base,但如果使用git diff(3而不是2个点),...甚至可以自己调用它操作

所以合并是:

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

而不是你提交它。

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