Git-修复子模块Head_detached的问题
Git-子模块Head detached的问题
更新了项目的code, 更新完之后执行 git status,发现子模块似乎发生了变化:

提示有 “new commits”, 于是进入到子模块把子模块代码也给更新了一下,结果更新完了之后发现子模块的状态变成下面的样子:

解决方案
-
进入到当前子模块的目录,执行:
cd path/to/submodule # Assuming you're tracking the 'master' in the submodule git checkout master
这样可以暂时修复 detached state.
-
回到主模块所在的目录,执行:
# cd back to project root git submodule update --remote --merge # or git submodule update --remote --rebase更新所有子模块内容,如果你觉得每次执行
submodule update --remote --rebase或submodule update --remote --merge比较麻烦,你可以为这两条命令指定一个别名,如:git config alias.supdate 'submodule update --remote --merge' # do submodule update with git supdate这样你下次只需要执行
git supdate就可以达到相同的效果了。
经过如上操作后,子模块基本能恢复正常了。
后面的内容如果不想看可以忽略。
--------------------------------------------------- 华丽丽的分割线 -----------------------------------------------------
Unix命令的设计哲学就是一个命令只会做一件事,这样就导致你通过
git submodule update --remote来更新所有子模块的代码后,子模块的代码有被 pull 下来,但是没有跟原来的代码merge到一起,所以有时候还需要执行:git submodule update --rebase或git submodule update --merge来手动将这些代码合并到一起,有一种做法就是可以修改git submodule update的默认行为,让它在pull完子模块代码之后,自动进行merge:手动进行修改:
打开主模块的目录,找到主模块的
.git文件夹
找到里面的config文件,打开后修改子模块update的默认行为:
update = merge

或者你通过执行下列命令进行配置:
git config -f .gitmodules submodule.$name.update merge
这样你下次再执行git submodule update --remote时就不用再显式指定 --rebase 或 --merge了,它会根据这边的配置选项自动进行merge。
参考链接

浙公网安备 33010602011771号