初始化
父项目: parent
子项目: child
添加子库的远程地址:
git remote add subtree-origin git@github.com:xxx/git_subtree_child.git
建立依赖关系
git subtree add --prefix=subtree subtree-origin master --squash
其中的--prefix=subtree可以写成:--p subtree 或 --prefix subtree
squash会将子项目中的多个commit合并为一个commit
更新子库
git subtree pull --prefix=subtree subtree-origin master --squash
--prefix可以简写为-F,路径可以为subtree或者a/b/c这样的路路径
分支可以为master或者其他分支,commitId也可以
最佳实践:要么全部操作都使用--squash指令,要么全部操作都不使用该参数。
修改子库
在父项目中的subtree目录中修改后,commit后,可将更改同步到子库git地址
git subtree push --prefix=subtree subtree-origin master
和submodule的异同
相同点:都可以用来管理子仓库
不同点:
- submodule是通过commit URL关联到子仓库,subtree更像是把文件copy过来了
- submodule更新需要在子仓库修改后,再回到主项目进行更新关联commit,subtree可以在主项目中直接修改,并把修改同步到远程子仓库