git subtree

198 阅读1分钟

git 裸库

没有工作区域的git仓库,仅用来存放和中转开发者代码的区域,用于服务端

  1. mkdir git-bare && git-bard 创建git-bard文件夹
  2. git init --bare 初始化裸库

submoudle 和 subtree的区别

  • submodule 会有一个引用目录,直接定位到对应的仓库
  • subtree 实实在在的文件目录

场景

  • project 开发项目
  • child 子模块项目

在 project里面添加child

  • git remote add substre-origin <child-url>
  • git subtree add --prefix=subtree subtree-origin master [--squash]
  • git remote show 查看远程仓库信息

child存在修改, project更新child

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

project修改child,推送修改subtree

  1. git push 推送project的修改,subtree并没有推送上去
  2. git subtree push --prefix=subtree subtree-origin master 推送subtree的修改

--squash参数

把commit进行合并,生成一个新的commit,不会有多余的提交记录,将无法追溯历史commit

注意:如果再项目开始的时候使用了 --squash,后续操作必须全部用上,否则将出现难以修复的问题;如果没用 --squash,后续所有操作不用该参数

三方合并

分支合并绝对能找到同一个parent,而subtree追溯parent-commit,最终会追溯不到同一个parent-commit

image.png

  1. commit-4 合并会往前找到共同的parent-commit-3
  2. 再把commit-3.12commit-3.22合并起来,得到commit-4
  3. commit-4有两个parent,一个指向 3.12,一个指向3.22