Git:合并和子模块

时间:2010-12-07 18:08:11

标签: git merge git-submodules

假设我在RepoX中有两个分支,名为BranchA和BranchB。 RepoX还有一个名为SubmoduleY的子模块。

BranchA在版本'abc'处有子模块,BranchB在版本'def'处有子模块。

假设我想将BranchA合并到BranchB中,但我想让BranchB的SubmoduleY指向其原始版本的'def'。我看到了几种方法:

方法1:

  1. Checkout BranchB。
  2. 将SubmoduleY移动到修订版'abc'以使实际合并无痛(我们现在不想在子模块级别进行任何合并)。
  3. 为SubmoduleY提交新版本(我们不能让它为合并浮动)。
  4. 将BranchA合并到BranchB中。解决任何冲突。
  5. 将SubmoduleY移回修订版'def'。
  6. 为SubmoduleY提交新版本。
  7. 将更改推送至主仓库。
  8. 方法2:

    与方法1相同,但不是执行步骤6,而是从第3步中重新定义并删除额外的子模块提交。

    两者似乎都有令人讨厌的缺点:

    方法1将两个额外的提交放入历史记录中。

    方法2忘记了对子模块修订的任何更改,因为这些提交会被删除。因此,以后的任何合并都将不得不再次处理一些问题。

    有更好的方法吗?

1 个答案:

答案 0 :(得分:7)

您可以对方法1执行变体操作,但执行使用--amend将更改引入子模块版本(在步骤6中)的提交,以便它更改合并提交中子模块的状态。换句话说,这将是:

$ git checkout b
$ git merge a
Merge made by recursive.
 example.txt |    1 +
 sY          |    2 +-
 2 files changed, 2 insertions(+), 1 deletions(-)
 create mode 100644 example.txt
$ cd sY
$ git checkout def
[... you get the "detached HEAD" warning ...]
$ cd ..
$ git add sY
$ git commit --amend

请注意,正如您在问题中所建议的那样,我没有在尝试避免在合并之前使用不同版本的子模块。如果存在冲突,您可以选择在def添加子模块来解决它。如果没有冲突,我上面提到的步骤应该可以正常工作。