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。
参考链接