git-子模块subtree

subtree

上篇文章我们讨论过git相关的子模块项目可以用submodule来完成关联,但是对于submodule想在主项目里面去修改所关联的子项目并且推送到远程git子项目会出现很多的问题,因此,git出现了subtree命令,可以完美解决以上的问题,git官方也推荐我们在关联git子项目的时候使用subtree,当然,subtree也可以完美地完成submodule所能够做的事情。

增加一个新的远程仓库:

git remote add subtree-origin git@github.com:huiGod/git_child.git 

可以通过以下命令查看:

git remote show

这里写图片描述

添加远程子模块项目:

git subtree add --prefix=subtree subtree-origin master --squash

prefix: 创建的本地目录,来存放子项目代码

subtree-origin:指定在本地存在的远程仓库

master: 从以上指定的远程仓库的master分支来创建并关联子项目

squash:在merge的时候一个可选的参数(与subtree命令无关),如果不加此参数,将会把远程的多次提交一个一个拉到本地仓库,log会记录子项目的每个commit log,如果加此参数,会将远程仓库的多次commit log提交合并成一个并拉取回来同时创建一个当前仓库author的新的commit log(即使子项目只有一次提交同样会创建一个新的当前仓库的author对应的commit log,也就是一定不会出现子项目author提交的commit log)。这个参数的存在,就是为了区分开主项目和子项目的commit log,使他们不被揉和在一起,而无法方便的查询主项目的commit log的history(时间线)。

git是基于修改的管理,文件之间是通过commit id来协调的,对于squash的参数,强烈建议,如果从一开始就使用了,对于后续的subtree pull操作一定也要使用squash参数,如此的话,子项目将不会存在和主项目相同的commit id,因为主项目都是合并子项目commit id之后生成的新的commit id。但是一定不要有时使用squash而有时不使用,这样的话主项目和子项目将有错综复杂的commit id,有的相同有的不相同,如此一定会有错误产生。

执行以上命令之后同submodule一样创建一个指定好的subtree目录:

这里写图片描述

从github可以看出,和submodule相比需要注意的一点,点击submodule生成的目录将会跳转到对应的子项目中,而点击subtree生成的目录会依然在当前项目目录,也就是在当前项目直接包含了子项目的所有代码。

(1)当子项目有提交新的修改之后,在主项目根目录执行:

git subtree pull --prefix=subtree subtree-origin master --squash

可以看到加了squash参数之后在主项目:
这里写图片描述

会生成一个新的commit id,并且commit log会记录subtree子项目中的commit id (图中511c092,多个的话会一一列出),对应的author一定是主项目所配置的。

拉取子项目的修改并且进行merge,然后我们可以执行git push推送到远程仓库。

(2)当在主项目修改了子项目代码之后,正常执行git add commit push一系列命令之后,会成功地将对应子项目的修改同步到主项目的远程仓库。

以上操作只是将子项目的修改推送到了主项目的远程仓库,我们也应该推送到远程子仓库,执行一下代码:

git subtree push --prefix=subtree subtree-origin master

问题补充:
当加入了squash参数之后,在子项目提交修改并推送到远程仓库之后,在主项目进行subtree pull有时候会出现conflict,这里的conflict并非是文件内容上的修改导致的,而是squash参数对subtree合并机制出现的。因为执行subtree pull随后进行merge的时候,在子项目和主项目会找不到一个相同的commit id(合并提交点),因为squash参数的原因,在主项目都是新生成的commit id,所以会有时候出现空的confilct,需要手动处理一下,但是总体并不影响使用。当然,如果不使用这个参数就不会有这种情况的出现。因此,是否使用这个参数需要大家自己来衡量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值