git submodule 游离分支(detached)产生原因及解决办法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了git submodule 游离分支(detached)产生原因及解决办法相关的知识,希望对你有一定的参考价值。
参考技术Asubmodule 是很方便的功能,但在使用中有一些痛点,其中对我们项目困扰最大的就是游离分支了,昨天专门花时间研究了下,终于弄懂了,这里记录下来,希望能帮到大家。
在说产生原因之前,先说下其原理,否则不太好说清楚。
更详细的描述,请查看: 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 问题的解决