Git submodule update --rebase后子模块仍为分离HEAD状态的疑问
Git子模块
--rebase选项的理解澄清 - 你对
--rebase选项的作用存在误解:git submodule update --rebase的核心不是让子模块HEAD保持附着状态,而是当子模块存在本地未推送的提交时,将这些提交变基到远程更新后的提交上,避免直接合并带来的冲突。 - 新鲜克隆后出现分离头状态的原因:
- 刚克隆的项目,子模块默认是从父仓库记录的特定提交检出,本身就处于分离头状态。
- 加上
--remote选项时,Git会拉取子模块远程仓库指定分支(默认是main/master)的最新提交,但不会自动将子模块的HEAD切换到该分支并建立追踪关联。 - 此时子模块没有本地提交,
--rebase没有实际变基操作可执行,最终还是停在远程拉取的那个提交上,依旧是分离头状态。
- 让子模块HEAD保持附着状态的正确操作:
- 进入子模块目录,手动切换到目标分支并关联远程:
cd path/to/your/submodule git checkout main # 替换为子模块的目标分支名 git branch --set-upstream-to=origin/main main - 之后在父仓库执行更新:
git submodule update --remote --rebase
git submodule set-branch --branch main path/to/your/submodule - 进入子模块目录,手动切换到目标分支并关联远程:
内容的提问来源于stack exchange,提问作者TruLa
相关产品推荐
相关产品推荐

