假设我在RepoX中有两个分支,名为BranchA和BranchB。 RepoX还有一个名为SubmoduleY的子模块。
BranchA在版本'abc'处有子模块,BranchB在版本'def'处有子模块。
假设我想将BranchA合并到BranchB中,但我想让BranchB的SubmoduleY指向其原始版本的'def'。我看到了几种方法:
方法1:
方法2:
与方法1相同,但不是执行步骤6,而是从第3步中重新定义并删除额外的子模块提交。
两者似乎都有令人讨厌的缺点:
方法1将两个额外的提交放入历史记录中。
方法2忘记了对子模块修订的任何更改,因为这些提交会被删除。因此,以后的任何合并都将不得不再次处理一些问题。
有更好的方法吗?
答案 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
添加子模块来解决它。如果没有冲突,我上面提到的步骤应该可以正常工作。