【问题标题】:Git: Merging and SubmodulesGit:合并和子模块
【发布时间】:2010-12-07 18:08:11
【问题描述】:

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

BranchA 在修订版“abc”有 SubmoduleY,BranchB 在修订版“def”有 SubmoduleY。

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

方法一:

  1. 结帐BranchB。
  2. 将 SubmoduleY 移动到修订版 'abc' 以使实际的合并变得轻松(我们现在不想在子模块级别进行任何合并)。
  3. 提交 SubmoduleY 的新修订版(我们不能让它浮动以进行合并)。
  4. 将分支 A 合并到分支 B。解决任何冲突。
  5. 将 SubmoduleY 移回修订版“def”。
  6. 提交 SubmoduleY 的新版本。
  7. 将更改推送到主存储库。

方法二:

与方法 1 相同,但不执行第 6 步,而是变基并删除第 3 步中的额外子模块提交。

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

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

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

有没有更好的办法?

【问题讨论】:

    标签: git merge git-submodules


    【解决方案1】:

    您可以对方法 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 添加子模块来解决它。如果没有冲突,我上面提到的步骤应该可以正常工作。

    【讨论】:

    • 使用git merge a --no-commit 无需修改。只需 git add sY 并提交(def 应该已经签出,因为我们在分支 b 上)。
    猜你喜欢
    • 2014-09-30
    • 2014-03-17
    • 2015-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-01
    • 2011-10-11
    • 2012-05-24
    相关资源
    最近更新 更多