git子模塊的使用
git子模塊可以用于項(xiàng)目包含另一個(gè)項(xiàng)目的情況,也許是第三方庫(kù)或被多個(gè)項(xiàng)目引用的基礎(chǔ)框架。
此次學(xué)習(xí)子模塊就是因?yàn)楣镜幕A(chǔ)框架在多個(gè)不同的項(xiàng)目上的使用,同時(shí)又想當(dāng)在開(kāi)發(fā)項(xiàng)目過(guò)程中對(duì)基礎(chǔ)框架有改動(dòng)時(shí),其他項(xiàng)目也能同時(shí)更新到改動(dòng)的部分,而子模塊允許我們將一個(gè)git倉(cāng)庫(kù)作為另一個(gè)git倉(cāng)庫(kù)的子目錄,同時(shí)還能保持提交獨(dú)立,正好滿足原來(lái)設(shè)想的需求。
提示:下面使用的test1為子模塊,tets2為使用子模塊的項(xiàng)目
1. 開(kāi)始使用子模塊
1.1 直接添加子模塊的情況:
git submodule add https://github.com/yangmin1234/test1.git
1.2 克隆含有子模塊項(xiàng)目的情況:
git submodule init #初始化本地配置文件
git submodule update # 從該項(xiàng)目中抓取所有的數(shù)據(jù)并檢出父項(xiàng)目中列出合適的提交(個(gè)人理解為將子模塊的東西更新到本地)
2. 在包含子模塊的項(xiàng)目上工作
2.1 進(jìn)入子模塊目錄中手動(dòng)抓取與合并
- 進(jìn)入子模塊目錄
- git fetch
- git merger origin/master
- 進(jìn)入主倉(cāng)庫(kù)目錄
2.2 直接在主倉(cāng)庫(kù)里抓取與合并子模塊
- git submodule update --remote
2.3 在子模塊上工作
當(dāng)我們運(yùn)行 git submodule update 從子模塊倉(cāng)庫(kù)中抓取修改時(shí),Git 將會(huì)獲得這些改動(dòng)并 更新子目錄中的文件,但是會(huì)將子倉(cāng)庫(kù)留在一個(gè)稱作 “游離的 HEAD” 的狀態(tài)。 這意味著沒(méi)有本 地工作分支(例如 “master”)跟蹤改動(dòng)。 所以你做的任何改動(dòng)都不會(huì)被跟蹤。
git checkout stable 進(jìn)入子模塊并檢出相應(yīng)的工作分支
git submodule update --remote 從上游拉取數(shù)據(jù)
git submodule update --remote --merge 從上游拉取數(shù)據(jù)并合并
發(fā)布子模塊改動(dòng)
如果我們?cè)谥黜?xiàng)目中提交并推送但并不推送子模塊上的改動(dòng),其他嘗試檢出我們修改的人會(huì)遇到 麻煩,因?yàn)樗麄儫o(wú)法得到依賴的子模塊改動(dòng)。 那些改動(dòng)只存在于我們本地的拷貝中。
為了確保這不會(huì)發(fā)生,你可以讓 Git 在推送到主項(xiàng)目前檢查所有子模塊是否已推送。 git push 命令接受可以設(shè)置為 check 或 on-demand 的 --recurse-submodules 參數(shù)。 如果任何提交的子模塊改動(dòng)沒(méi)有推送那么 check 選項(xiàng)會(huì)直接使 push 操作失敗。
提交主項(xiàng)目時(shí)自動(dòng)檢測(cè)子模塊是否有未提交的改動(dòng)
git push --recurse-submodules=check
提交主項(xiàng)目時(shí),嘗試自動(dòng)推送一改動(dòng)的子模塊
git push --recurse-submodules=on-demand
子模塊技巧
子模塊遍歷
有一個(gè) foreach 子模塊命令,它能在每一個(gè)子模塊中運(yùn)行任意命令。 如果項(xiàng)目中包含了大量子模塊,這會(huì)非常有用。
有用的別名
你可能想為其中一些命令設(shè)置別名,因?yàn)樗鼈兛赡軙?huì)非常長(zhǎng)而你又不能 設(shè)置選項(xiàng)作為它們的默認(rèn)選項(xiàng)。
子模塊的問(wèn)題
例如在有子模塊的項(xiàng)目中切換分支可能會(huì)造成麻煩。 如果你創(chuàng)建一個(gè)新分支, 在其中添加一個(gè)子模塊,之后切換到?jīng)]有該子模塊的分支上時(shí),你仍然會(huì)有一個(gè)還未跟蹤的子模塊目錄。
常用git命令(積累學(xué)習(xí))
- 定位到相關(guān)文件下
git init 創(chuàng)建git倉(cāng)庫(kù),初始化
git add 文件名 將文件加入到git中
git commit -m "提交說(shuō)明" 提交文件到本地倉(cāng)庫(kù)
git status 查看倉(cāng)庫(kù)當(dāng)前的狀態(tài)(比如哪些文件被修改過(guò)了等等)
git diff 文件名 查看文件具體修改了什么內(nèi)容
git log 查看git提交歷史日志,從近到遠(yuǎn)的顯示,如果日志過(guò)多可以加(--pretty=oneline)
git reflog 查看命令歷史,可以得到所有的版本id
git reset --hard HEAD^或者版本號(hào) ^越多退的越多
git remote add origin https://github.com/yangmin1234/test1.git 關(guān)聯(lián)版本庫(kù)
git push (-u) origin master 將本地庫(kù)內(nèi)容提交到遠(yuǎn)程庫(kù)中(使用"u"以后就可以直接使用git pull和git push來(lái)提交更新)
子模塊操作
git submodule add https://github.com/yangmin1234/test.git #將一個(gè)git倉(cāng)庫(kù)作為本倉(cāng)庫(kù)的一個(gè)子目錄
git clone https://github.com/yangmin1234/test2.git clone帶子模塊的項(xiàng)目
git submodule init
git submodule update
git push --recurse-submodules=check 提交主項(xiàng)目時(shí)自動(dòng)檢測(cè)子模塊是否有未提交的改動(dòng)
git push --recurse-submodules=on-demand 提交主項(xiàng)目時(shí),嘗試自動(dòng)推送一改動(dòng)的子模塊