Git:合并和子模块

15
假设我在RepoX中有两个分支,分别为BranchA和BranchB。 RepoX还有一个名为SubmoduleY的子模块。
BranchA将SubmoduleY设置为版本“abc”,而BranchB将SubmoduleY设置为版本“def”。
假设我想将BranchA合并到BranchB中,但是我想让BranchB的SubmoduleY指向其原始版本“def”。 我看到了一些方法:
方法1:
1.检出BranchB。 2.将SubmoduleY移动到版本“abc”,以使实际合并变得轻松(我们现在不想在子模块级别上进行任何合并)。 3.提交新版本的SubmoduleY(我们不能让它漂浮以进行合并)。 4.将BranchA合并到BranchB中。解决任何冲突。 5.将SubmoduleY移回版本“def”。 6.提交新版本的SubmoduleY。 7.将更改推送到主存储库。
方法2:与方法1相同,但是在执行第6步时,使用变基并消除第3步中的额外子模块提交。
这两种方法都具有令人恼火的缺点:
方法1会在历史记录中增加两个额外的提交。
方法2会忘记与子模块版本有关的任何更改,因为这些提交将被删除。 因此,以后的任何合并都必须再次处理一些问题。
有更好的方法吗?
1个回答

8

您可以对方法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

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

使用 git merge a --no-commit,无需进行修改。只需 git add sY 并提交(因为我们在分支 b 上,所以 def 应该已经被检出)。 - kiciek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接