git管理子项目
对于一些比较大的工程,为了便于复用,常常需要抽取子项目。通常项目中的共用UI、共用底层逻辑、共用第三方库抽出来做git管理子项目。这时候git提供了两种管理子项目的方式,submodule和subtree。
有人对submodule和subtree的区别做出一个总结: submodule is link; subtree is copy。
submodule
container 与 module 各自都是独立的 git repo
submodule需做一次commit
父层repo需将子层的commitID也要推送上去
submodule的坑
submodule更新完后并push,但主repo没push新meta档到服务器上,另一开发者git pull之后submodule会停留在未修改前的版本。
假设一切正常,主repo有最新submodule的变动文件,开发者git submodule update并不会将submodule切到任何branc 大专栏 git submoudle vs git subtreeh,所以默认下的submodule的repo会停留在一个detached HEAD(游离状态)。
修改submodule的坑
常见的做法切到 submodule 的目录,然后做修改,然后 commit 和 push。
如果你不慎忘记切换到分支,又做了提交,可以用 cherry-pick 命令挽救。
- 用 git checkout branch 将 HEAD 从游离状态切换到branch ,这时候,git会报 Warning 说有一个提交没有在 branch上,记住这个提交的 change-id(假如 change-id 为 aaaa)
- 用 git cherry-pick aaaa将刚刚提交的文件并到branch中。
- 用 git push 将更新提交到远程数据库中。
subtree
只有一个 git repo
只需要做一个 commit