git submodule 游离分支(detached)产生原因及解决办法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了git submodule 游离分支(detached)产生原因及解决办法相关的知识,希望对你有一定的参考价值。

参考技术A

submodule 是很方便的功能,但在使用中有一些痛点,其中对我们项目困扰最大的就是游离分支了,昨天专门花时间研究了下,终于弄懂了,这里记录下来,希望能帮到大家。

在说产生原因之前,先说下其原理,否则不太好说清楚。

更详细的描述,请查看: 7.11 Git 工具 - 子模块

如果了解了以上5点,那产生原因就比较容易说清楚了。

简单来说,就是主仓库的 sptr 指向一个你本地不存在的 commit id 时,子模块就会进入游离分支。

举个例子,假如有个子模块 s1 , 有100次提交,为了方便,我们假设 commit id 就是1~100这样的数字。

本来 sptr 指向100,也没人更新子模块,这时大家都相安无事,直到有一个人更新了子模块,并push了一个 commit id =101的提交,并且他还把 sptr 更新到101并推到了主仓库的远端(origin).

这个时候,别人在主仓库下执行 git pull 时, sptr 就会指向101,但是当git去子模块里找这个 commit id 时,由于还没执行 git submodule update --remote , 根本就找不到 101 这个提交,然后子模块就会进入 detached HEAD 101 的状态,也就是进入到了游离分支。

知道了原因,再解决起来就很容易了。

只要我们在执行主仓库的 git pull 时,先执行一下 git submodule update --remote , 把子模块更到最新,这样所有的 commit id 都有了。不管主仓库的 sptr 指向哪个 commit id ,我们都可以适应,也就不会进入游离分支了。

以上就是本文的所有内容,希望对大家有所帮助。
END

HEAD detached from refs/heads/master

出现原因。在rebase的时候有改动。改动后再次进行commit的时候出现的

 

在游离状态无法提交修改

解决办法

1,查看当前分支状态

git branch -a

2,新建一个临时 tem 分支,把当前提交的代码放到整个分支

git branch tem

git checkout tem

3,换回要回到的那个分支,这里是 master

git checkout master

这里要自己处理哦。。。如果HEAD上面的东西不重要可以直接删除掉。

然后再这里处理好冲突与合并后 删除远程分支tem

git branch -D tem

以上是关于git submodule 游离分支(detached)产生原因及解决办法的主要内容,如果未能解决你的问题,请参考以下文章

git HEAD detached from origin 问题的解决

git 处于游离的状态的解决办法

HEAD detached from refs/heads/master

Git 分离头指针 HEAD

Git分支合并冲突解决(续)

Git submodule应用