【问题标题】:Git: How to make submodule pointer point to identical commit on two parent branchesGit:如何使子模块指针指向两个父分支上的相同提交
【发布时间】:2017-05-20 01:53:11
【问题描述】:

我有一个项目parent 有分支masterworkmaster 分支仅用于从上游存储库中提取更改,并且不时将这些更改合并到 work 分支中。不会对 master 分支进行任何更改。

该项目有一个子模块child。在某些时候,在我将更改从 master 分支合并到 work 分支后,我注意到两个分支上的子模块指针不同。每当我从一个分支切换到另一个分支然后输入git status 时,我都会得到,例如切换回master时:

On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   child (new commits)

git diff 的输出类似于:

diff --git a/child b/child
index 02232f9..5902a22 160000
--- a/child
+++ b/child
@@ -1 +1 @@
-Subproject commit abcdefdeadbeef0123456789
+Subproject commit 12381257dea0ffff018dead

通过git submodule update 更新子模块通过使更改消失来“修复”当前的问题,但是每当我切换分支时,我都会再次遇到受污染的索引。我希望分支work 的子模块指针始终指向与我上次将master 合并到work 时分支master 上的提交相同的提交,但是在执行git submodule update 之后,我无法合并master 变成 work,因为 git 认为 work 已经是最新的了。

如何“修复”分支 work 中的子模块指针,并使其指向与分支 master 中的相同提交?

我知道过去曾与分支work 上的子模块发生冲突问题,但我不知道它发生的时间和地点,因此我无法确切说明为什么会发生这种情况。

有没有办法找出parent 的哪个提交更改了子模块指针? 根据this question,这是不可能的?

【问题讨论】:

    标签: git git-branch git-merge git-submodules


    【解决方案1】:

    您必须像更改代码一样提交更新的子模块。在将子模块提交到您想要的提交之后,在您想要更新的分支中从主项目的根目录(在您的情况下为 work):

    git add .
    git commit -m "Updating Submodule"
    

    这将使您的分支“指向”正确的提交。

    或者,如果您有其他不想提交的更改

    git add /path/to/module
    git commit -m "Updating Submodule"
    

    【讨论】:

    • 这解决了work 分支上的问题!如果你能澄清你的答案会很好,即在分支work,你必须手动将子模块更新为你希望它所在的特定提交,然后然后将该更改添加到索引!
    • 我添加了一些说明。为了后代,我把它留得更笼统,因为git commit 总是影响你当前所在的分支,有时有人可能想更新不同分支上的子模块。
    猜你喜欢
    • 2014-01-06
    • 2021-03-15
    • 1970-01-01
    • 2012-04-06
    • 1970-01-01
    • 2021-09-21
    • 1970-01-01
    • 2013-08-23
    • 2020-06-10
    相关资源
    最近更新 更多