2

原始问题

我在一个包含多个子模块的 git 存储库中工作,其中一个显示出奇怪的行为:我正在处理一个功能分支,我们称之为featureBranch. 这个分支是从我的develop分支创建的。在我处理我的功能时,有人更新了子模块并将更改提交到develop. 我的存储库现在看起来像这样:

* 10000003 (HEAD -> featureBranch) Work on my feature
| * 10000002 (develop) Update submodule
|/
* 10000001 some commit

为了保持最新,我想将当前合并developfeatureBranchvia git merge develop。在运行git status呼叫时,我希望看到子模块的变化,因为我的子模块当然还没有更新到develops 的状态。然而,事实并非如此。合并后,没有显示子模块更改,并且子模块保持在提交1000000310000001.

这是对我的存储库和提交次数的简化描述。我试图用一个最小的示例 repo 来重现这个,但没能做到。在最小的情况下,一切都按预期工作,子模块在合并后显示更改,并且git submodule update调用将其设置为从 commit 的阶段10000002。但是,我可以根据需要在我的生产存储库中通过reset --hard和一个新的来复制它merge develop

除了命令行,我偶尔会使用 GitKraken,它在子模块方面存在一些已知问题。因此,我不能将其排除在此之外,但由于仅在使用命令行时也会发生这种情况,因此对我来说似乎不太可能。

有谁知道为什么从更改它的分支更改子模块不会继续合并到子模块没有更改的分支?任何提示表示赞赏。

评论

事实证明,我的问题中的简化是无效的。实际上,featureBranch起源于develop很久以前。那里不时合并developfeatureBranch我认为其中一些合并以及与develop起源的局部分歧以及介于两者之间的一些硬重置是其来源。由于历史错综复杂,很难确定真正的原因,我也没有时间解开这一切。

在合并developfeatureBranch添加另一个提交更改相关子模块的提交后,我通过 GitKrakens 的文件历史查看了子模块,奇怪的是它显示了以下内容(自下而上阅读):

+Commit 183 //new commit id
-Commit ad7 //commit id from develop the submodule should have been on after merge,
              but it actually was on ccc and did not show any changes!

**This is where the merge happened. Below is the file history from featureBranch

+Commit ccc //new commit id
-Commit ff9 //old commit id

+Commit ff9 //new commit id
-Commit bb6 //old commit id

+Commit bb6 //new commit id
-Commit 3f9 //old submodule commit id

我对这个问题仍然很困惑,但不会进一步调查。如果有人能对此有所启发,我将非常高兴。

4

1 回答 1

1

您必须首先将子模块视为并行存储库。

您的主存储库(包含子模块)仅旨在提交子模块历史记录。例如:当您将开发合并到您的功能分支中时,开发中子模块的提交哈希现在将在功能分支中相同,但是您必须手动更新它们(这就是您应该避免使用 GUI 的原因)。

合并运行后git submodule update,您将获得子模块的所有更新(如果有)。此外,如果您在特定分支中使用子模块并希望将它们更新到最后一次提交运行git submodule update --remote

在这里您可以很好地了解子模块的工作原理:https ://git-scm.com/book/en/v2/Git-Tools-Submodules

于 2017-04-12T09:23:57.377 回答