Git:合并和子模块

Ben*_*Ben 12 git merge git-submodules

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

BranchA在版本'abc'处具有SubmoduleY,BranchB在版本'def'处具有SubmoduleY.

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

方法1:

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

方法2:

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

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

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

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

有没有更好的办法?

Mar*_*air 7

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

$ 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
Run Code Online (Sandbox Code Playgroud)

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