原始问题
我在一个包含多个子模块的 git 存储库中工作,其中一个显示出奇怪的行为:我正在处理一个功能分支,我们称之为featureBranch
. 这个分支是从我的develop
分支创建的。在我处理我的功能时,有人更新了子模块并将更改提交到develop
. 我的存储库现在看起来像这样:
* 10000003 (HEAD -> featureBranch) Work on my feature
| * 10000002 (develop) Update submodule
|/
* 10000001 some commit
为了保持最新,我想将当前合并develop
到featureBranch
via git merge develop
。在运行git status
呼叫时,我希望看到子模块的变化,因为我的子模块当然还没有更新到develop
s 的状态。然而,事实并非如此。合并后,没有显示子模块更改,并且子模块保持在提交10000003
和10000001
.
这是对我的存储库和提交次数的简化描述。我试图用一个最小的示例 repo 来重现这个,但没能做到。在最小的情况下,一切都按预期工作,子模块在合并后显示更改,并且git submodule update
调用将其设置为从 commit 的阶段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
我对这个问题仍然很困惑,但不会进一步调查。如果有人能对此有所启发,我将非常高兴。