git subtree使用基本操作及--squash

#查看关联的远程仓库的详细信息
git remote -v

一、初始化subtree项目步骤

 1、语法:git remote add -f <子仓库名> <子仓库地址>

     解释:其中-f意思是在添加远程仓库之后, 立即执行fetch.

例如:

git remote add -f proto [email protected]:zkh201/zkh-proto.git
2、语法:git subtree add --prefix=<子目录名> <子仓库名> <分支> –-squash

     解释:–squash意思是把subtree的改动合并成一次commit, 这样就不用拉取子项目完整的历史记录. –prefix之后的=等号也可以用空格.

注意:子目录名不需要提前建立好

例如:

–prefix可以使用-P来替换

git subtree add --prefix=zkh-netty/src/main/resources/protobuf proto master --squash
或
git subtree add -P zkh-netty/src/main/resources/protobuf proto master --squash

二、pull subtree项目(需在proto文件夹的父目录执行)

语法:git subtree pull --prefix=<子目录名> <远程分支> <分支> –-squash
例如:

git subtree pull --prefix=zkh-netty/src/main/resources/protobuf proto --squash

三、push subtree项目

语法:git subtree push --prefix=<子目录名> <远程分支> <分支>
注意:子目录中只能修改其中的文件,自己新添加的文件不会纳入到git的管理中
例如:

git subtree push --prefix=zkh-netty/src/main/resources/protobuf proto master

四、移除subtree项目

 删除关联的subtree的git地址即可

语法:
git remote remove name
例如:

git remote remove proto

然后删除相应的文件

遇到的问题(这个很重要):
git subtree使用基本操作及--squash_第1张图片
(我再描述一下这个冲突:父项目修改了子项目中的文件,然后子项目做了更新且成功,然后子项目又做了一次提交然后push,父项目进行更新此时就出现了冲突,是不是很莫名其妙)是为什么会出现冲突的呢?
现在对上方图片进行描述:
上面的步骤可以分为两种情况:
1、更新父项目中的文件

  • 修改父项目中的文件,提交,push
  • 子项目修改文件,提交,push
  • 父项目进行更新(git subtree pull -P 目录名 子项目远程分支 分支 --squash)

这种情况下不会出现冲突
2、在父项目修改了子项目中的文件

  • 修改父项目下的子项目的文件,提交,push
  • 子项目下更新刚才的提交
  • 子项目下修改文件,提交,push
  • 父项目下进行更新(git subtree pull -P 目录名 子项目远程分支 分支 --squash)

这种情况下会出现冲突
这是第一个问题;
结论就是:
commitId:553b5c2和commitId:2a32d43(squash的合并,这是一个独立的提交,和要待合并的提交没关系)在合并时,都修改了相同的文件,所以造成了两者合并时出现冲突(个人猜测,如有读者知晓原因的话,还望在下方评论给出,谢谢)

第二个问题是在第一个问题出现后,然后我们去解决冲突,然后add标记为冲突解决,再去进行push到远程,一般你是会执行git subtree push …的命令,会出现在报错
git subtree使用基本操作及--squash_第2张图片
会发现又懵了,这又是什么错?
我这边给出解决办法,具体什么原因我也只是懂个大概
你的做法是需要先提交push到父工程上,然后再进行子工程的push
即如下操作:
git subtree使用基本操作及--squash_第3张图片
使用subtree和–squash的问题描述就这些,望有知道答案的小伙伴能在下方评论区给出,谢谢!!!!!

你可能感兴趣的:(git)