git子模块的使用
git子模块可以用于项目包含另一个项目的情况,也许是第三方库或被多个项目引用的基础框架。
此次学习子模块就是因为公司的基础框架在多个不同的项目上的使用,同时又想当在开发项目过程中对基础框架有改动时,其他项目也能同时更新到改动的部分,而子模块允许我们将一个git仓库作为另一个git仓库的子目录,同时还能保持提交独立,正好满足原来设想的需求。
提示:下面使用的test1为子模块,tets2为使用子模块的项目
1. 开始使用子模块
1.1 直接添加子模块的情况:
git submodule add https://github.com/yangmin1234/test1.git
1.2 克隆含有子模块项目的情况:
git submodule init #初始化本地配置文件
git submodule update # 从该项目中抓取所有的数据并检出父项目中列出合适的提交(个人理解为将子模块的东西更新到本地)
2. 在包含子模块的项目上工作
2.1 进入子模块目录中手动抓取与合并
- 进入子模块目录
- git fetch
- git merger origin/master
- 进入主仓库目录
2.2 直接在主仓库里抓取与合并子模块
- git submodule update --remote
2.3 在子模块上工作
当我们运行 git submodule update 从子模块仓库中抓取修改时,Git 将会获得这些改动并 更新子目录中的文件,但是会将子仓库留在一个称作 “游离的 HEAD” 的状态。 这意味着没有本 地工作分支(例如 “master”)跟踪改动。 所以你做的任何改动都不会被跟踪。
git checkout stable 进入子模块并检出相应的工作分支
git submodule update --remote 从上游拉取数据
git submodule update --remote --merge 从上游拉取数据并合并
发布子模块改动
如果我们在主项目中提交并推送但并不推送子模块上的改动,其他尝试检出我们修改的人会遇到 麻烦,因为他们无法得到依赖的子模块改动。 那些改动只存在于我们本地的拷贝中。
为了确保这不会发生,你可以让 Git 在推送到主项目前检查所有子模块是否已推送。 git push 命令接受可以设置为 check 或 on-demand 的 --recurse-submodules 参数。 如果任何提交的子模块改动没有推送那么 check 选项会直接使 push 操作失败。
提交主项目时自动检测子模块是否有未提交的改动
git push --recurse-submodules=check
提交主项目时,尝试自动推送一改动的子模块
git push --recurse-submodules=on-demand
子模块技巧
子模块遍历
有一个 foreach 子模块命令,它能在每一个子模块中运行任意命令。 如果项目中包含了大量子模块,这会非常有用。
有用的别名
你可能想为其中一些命令设置别名,因为它们可能会非常长而你又不能 设置选项作为它们的默认选项。
子模块的问题
例如在有子模块的项目中切换分支可能会造成麻烦。 如果你创建一个新分支, 在其中添加一个子模块,之后切换到没有该子模块的分支上时,你仍然会有一个还未跟踪的子模块目录。
常用git命令(积累学习)
- 定位到相关文件下
git init 创建git仓库,初始化
git add 文件名 将文件加入到git中
git commit -m "提交说明" 提交文件到本地仓库
git status 查看仓库当前的状态(比如哪些文件被修改过了等等)
git diff 文件名 查看文件具体修改了什么内容
git log 查看git提交历史日志,从近到远的显示,如果日志过多可以加(--pretty=oneline)
git reflog 查看命令历史,可以得到所有的版本id
git reset --hard HEAD^或者版本号 ^越多退的越多
git remote add origin https://github.com/yangmin1234/test1.git 关联版本库
git push (-u) origin master 将本地库内容提交到远程库中(使用"u"以后就可以直接使用git pull和git push来提交更新)
子模块操作
git submodule add https://github.com/yangmin1234/test.git #将一个git仓库作为本仓库的一个子目录
git clone https://github.com/yangmin1234/test2.git clone带子模块的项目
git submodule init
git submodule update
git push --recurse-submodules=check 提交主项目时自动检测子模块是否有未提交的改动
git push --recurse-submodules=on-demand 提交主项目时,尝试自动推送一改动的子模块