我在一个包含多个子模块的git存储库中工作,其中一个子模块显示出奇怪的行为:我正在处理一个功能分支,我们称之为featureBranch
。此分支是从我的develop
分支创建的。当我处理我的功能时,有人更新了子模块并将更改提交到develop
。我的存储库现在看起来像这样:
* 10000003 (HEAD -> featureBranch) Work on my feature
| * 10000002 (develop) Update submodule
|/
* 10000001 some commit
要更新,我想通过develop
将当前featureBranch
合并到git merge develop
。运行git status
调用后,我希望看到子模块发生变化,因为我的子模块当然还没有更新到develop
s'状态。然而,事实并非如此。合并后,没有显示子模块更改,子模块仍然处于提交10000003
和10000001
的状态。
这是我的存储库和提交数量的简化描述。我尝试用最小的示例repo重现这个,但是无法做到。在最小的情况下,一切都按预期工作,子模块在合并后显示更改,并且git submodule update
调用将其设置为从提交10000002
的“阶段”。但是,我可以通过reset --hard
以及我想要的新merge develop
在我的高效存储库中重新生成此内容。
除了命令行,我偶尔会使用GitKraken,它有一些已知的子模块问题。因此,我不能将其排除在此之外,但由于这种情况在专门使用命令行时也会发生,因此对我来说似乎不太可能。
是否有人知道为什么子模块从更改的分支更改为不会将合并转移到子模块未更改的分支?任何提示都表示赞赏。
事实证明,我的问题的简化无效。实际上,featureBranch
很长一段时间都来自develop
。那里从develop
到featureBranch
不时合并,我相信其中一些合并以及本地develop
与原点不同'以及其中的一些硬重置作为此源。由于纠结的历史,很难找出真正的原因,我没有时间解决这一切。
将develop
合并到featureBranch
并添加另一个提交更改有问题的子模块的提交后,我通过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
我对这个问题仍感到非常困惑,但不会进一步调查。如果有人能为此带来光明,我会非常高兴。
答案 0 :(得分:1)
您必须首先将子模块视为并行存储库。
您的主存储库(包含子模块)只是为了提交子模块历史记录。例如:当您将 develop 合并到 featureBranch 时,开发中子模块的提交哈希值现在将在中相同featureBranch 但是你必须手动更新它们(这就是为什么你应该避免使用GUI)。
合并后运行git submodule update
,您将获得子模块中的所有更新(如果有)。此外,如果您在特定分支中使用子模块,并希望将它们更新到上次提交运行git submodule update --remote
。
在这里,您可以很好地了解子模块的工作原理:https://git-scm.com/book/en/v2/Git-Tools-Submodules