SlideShare a Scribd company logo
Git Subtree解说
by于哲
2014.3.31
场景
对于⼀一些⽐比较⼤大的⼯工程,为了便于复⽤用,常常需要抽取⼦子
项⺫⽬目
A B
C
⽅方案1:git submodule
!
⽅方案2:git subtree
git submodule
submodule项⺫⽬目和它的⽗父项⺫⽬目本质上是2个独⽴立的git仓库,
只是⽗父项⺫⽬目存储了它依赖的submodule项⺫⽬目的版本号信息⽽而已。
坑:
• git pull之后,需要 git submodule update
• detached HEAD state,需要 git checkout master
• git clone 之后,需要 git submodule init & update
• messy,etc
git subtree
简介:
替代git submodule 命令,合并⼦子仓库到项⺫⽬目中并放在⼦子
⺫⽬目录,管理、更新都更加⽅方便。
要求:
git version > 1.8.0.0
if git version < 1.8.0.0:
go https://github.com/apenwarr/git-subtree
why git subtree?
• 管理和更新流程⽐比较⽅方便
• git v1.5.2以后建议使⽤用git subtree (git v1.8.0.0 才合并进来)
cd git/contrib/subtree && make && sudo install -m 755 git-subtree /usr/lib/git-core
	

 •	

 仓库 clone下来不需要 init 和 update
	

 •	

 不会产⽣生像.gitmodule类似的⽂文件 	

	

 • 可以以分⽀支形式切换依赖库
如何使⽤用git subtree?
前期准备:
!
创建本地项⺫⽬目(两个项⺫⽬目,⼀一个库):
git --git-dir=proj1.git init --bare
git --git-dir=proj2.git init —bare
git --git-dir=lib1.git init —bare
!
!
填充数据,提交,etc
如何使⽤用git subtree?
!
!
1. git remote add -f <⼦子仓库名> <⼦子仓库地址>
!
其中-f意思是在添加远程仓库之后,⽴立即执⾏行fetch
!
2. git subtree add --prefix=<⼦子⺫⽬目录名> <⼦子仓库名> <分⽀支> —squash
!
—squash意思是把subtree的改动合并成⼀一次commit,这样就不⽤用拉取⼦子
项⺫⽬目完整的历史记录。
!
--prefix之后的=等号也可以⽤用空格。
!
!
添加⼦子⺫⽬目录,建⽴立与git项⺫⽬目的关联
如何使⽤用git subtree?
!
!
1. git fetch <远程仓库名> <分⽀支>
!
2. git subtree pull --prefix=<⼦子⺫⽬目录名> <远程分⽀支> <分
⽀支> --squash
!
!
!
从远程仓库更新⼦子⺫⽬目录
如何使⽤用git subtree?
!
!
1. git subtree push --prefix=<⼦子⺫⽬目录名> <远程分⽀支名>
分⽀支
!
!
!
!
!
从⼦子⺫⽬目录push到远程仓库
git subtree原理
libs master
new master
git subtree原理
• git read-tree 更新暂存区
• git write-tree 保存暂存区⺫⽬目录树
• git commit-tree
porcelain瓷器
• git branch
• git commit
• git push
• etc
plumbing⽔水管
git subtree原理
• git read-tree —prefix=libs/lib1 lib1
• git write-tree
• echo "subtree merge" | git commit-tree id -p id1 -p id2
• git reset id
参考
• http://aoxuis.me/posts/2013/08/07/git-subtree/
• http://blogs.atlassian.com/2013/05/alternatives-to-git-
submodule-git-subtree/
• http://www.worldhello.net/2010/10/31/2041.html
THANK YOU	

@jackyu

More Related Content

What's hot

Git基礎介紹
Git基礎介紹Git基礎介紹
Git基礎介紹
Max Ma
 
Git 入門與實作
Git 入門與實作Git 入門與實作
Git 入門與實作
奕浦 郭
 
Git in a nutshell
Git in a nutshellGit in a nutshell
Git in a nutshell
Nelson Tai
 
版本控制 使用Git & git hub
版本控制   使用Git & git hub版本控制   使用Git & git hub
版本控制 使用Git & git hub
維佋 唐
 
Git 程式碼版本控制軟體介紹
Git 程式碼版本控制軟體介紹Git 程式碼版本控制軟體介紹
Git 程式碼版本控制軟體介紹
PingLun Liao
 
git merge 與 rebase 的觀念與實務應用
git merge 與 rebase 的觀念與實務應用git merge 與 rebase 的觀念與實務應用
git merge 與 rebase 的觀念與實務應用
Will Huang
 
Add mailinglist command to gitolite
Add mailinglist command to gitoliteAdd mailinglist command to gitolite
Add mailinglist command to gitolite
琛琳 饶
 
Git與source tree 基礎教學
Git與source tree 基礎教學Git與source tree 基礎教學
Git與source tree 基礎教學
Duncan Chen
 
Git introduction
Git introductionGit introduction
Git introduction
mythnc
 
Xcode 的 git 版本管理
Xcode 的 git 版本管理Xcode 的 git 版本管理
Xcode 的 git 版本管理
彼得潘 Pan
 
Git 版本控制系統 -- 從微觀到宏觀
Git 版本控制系統 -- 從微觀到宏觀Git 版本控制系統 -- 從微觀到宏觀
Git 版本控制系統 -- 從微觀到宏觀
Wen-Tien Chang
 
Introduction to git
Introduction to gitIntroduction to git
Introduction to git
Bo-Yi Wu
 
Git Essence Tutorial
Git Essence TutorialGit Essence Tutorial
Git Essence Tutorial
Ho Kim
 
幸福快樂的完美結局
幸福快樂的完美結局幸福快樂的完美結局
幸福快樂的完美結局
Anna Su
 
Git and git hub
Git and git hubGit and git hub
Git and git hub
唯 李
 
Git 入门实战
Git 入门实战Git 入门实战
Git 入门实战
icy leaf
 
連哈秋都懂的Git教學
連哈秋都懂的Git教學連哈秋都懂的Git教學
連哈秋都懂的Git教學
hydai
 
Git & Sourcetree 介紹
Git & Sourcetree 介紹Git & Sourcetree 介紹
Git & Sourcetree 介紹
Adison wu
 
Git由超淺入超深
Git由超淺入超深Git由超淺入超深
Git由超淺入超深
羊 小咩 (lamb-mei)
 

What's hot (20)

Git基礎介紹
Git基礎介紹Git基礎介紹
Git基礎介紹
 
Git 入門與實作
Git 入門與實作Git 入門與實作
Git 入門與實作
 
Git in a nutshell
Git in a nutshellGit in a nutshell
Git in a nutshell
 
版本控制 使用Git & git hub
版本控制   使用Git & git hub版本控制   使用Git & git hub
版本控制 使用Git & git hub
 
Git 程式碼版本控制軟體介紹
Git 程式碼版本控制軟體介紹Git 程式碼版本控制軟體介紹
Git 程式碼版本控制軟體介紹
 
git merge 與 rebase 的觀念與實務應用
git merge 與 rebase 的觀念與實務應用git merge 與 rebase 的觀念與實務應用
git merge 與 rebase 的觀念與實務應用
 
Add mailinglist command to gitolite
Add mailinglist command to gitoliteAdd mailinglist command to gitolite
Add mailinglist command to gitolite
 
Git與source tree 基礎教學
Git與source tree 基礎教學Git與source tree 基礎教學
Git與source tree 基礎教學
 
Git introduction
Git introductionGit introduction
Git introduction
 
Xcode 的 git 版本管理
Xcode 的 git 版本管理Xcode 的 git 版本管理
Xcode 的 git 版本管理
 
Git 版本控制系統 -- 從微觀到宏觀
Git 版本控制系統 -- 從微觀到宏觀Git 版本控制系統 -- 從微觀到宏觀
Git 版本控制系統 -- 從微觀到宏觀
 
Introduction to git
Introduction to gitIntroduction to git
Introduction to git
 
Git Essence Tutorial
Git Essence TutorialGit Essence Tutorial
Git Essence Tutorial
 
幸福快樂的完美結局
幸福快樂的完美結局幸福快樂的完美結局
幸福快樂的完美結局
 
Git and git hub
Git and git hubGit and git hub
Git and git hub
 
Git 入门实战
Git 入门实战Git 入门实战
Git 入门实战
 
Git Tutorial 教學
Git Tutorial 教學Git Tutorial 教學
Git Tutorial 教學
 
連哈秋都懂的Git教學
連哈秋都懂的Git教學連哈秋都懂的Git教學
連哈秋都懂的Git教學
 
Git & Sourcetree 介紹
Git & Sourcetree 介紹Git & Sourcetree 介紹
Git & Sourcetree 介紹
 
Git由超淺入超深
Git由超淺入超深Git由超淺入超深
Git由超淺入超深
 

Similar to Submodule && subtree

Git 超簡單學習懶人包(軟體程式版本控管系統)
Git 超簡單學習懶人包(軟體程式版本控管系統)Git 超簡單學習懶人包(軟體程式版本控管系統)
Git 超簡單學習懶人包(軟體程式版本控管系統)
flylon
 
Git &amp; git hub v1.2
Git &amp; git hub v1.2Git &amp; git hub v1.2
Git &amp; git hub v1.2
Chris Chen
 
Git原理与实战 201607
Git原理与实战 201607Git原理与实战 201607
Git原理与实战 201607
Charles Tang
 
Git+使用教程
Git+使用教程Git+使用教程
Git+使用教程
gemron
 
Git基础培训
Git基础培训Git基础培训
Git Tutorial
Git TutorialGit Tutorial
Git Tutorial
Drake Huang
 
Git入門介紹
Git入門介紹Git入門介紹
Git入門介紹
mudream4869
 
Git Flow 管理
Git Flow 管理Git Flow 管理
Git Flow 管理
Pu Lee
 
Git 教學
Git 教學Git 教學
Git 教學
Ming-Sian Lin
 
Git 实战
Git 实战Git 实战
Git 实战
简放 视野
 
Github in xcode
Github in xcodeGithub in xcode
Github in xcode
郁凱 曾
 
20170510 git 懶人包
20170510 git 懶人包20170510 git 懶人包
20170510 git 懶人包
Chen-Ming Yang
 
COSCUP 2015 開源之道-Git工作坊教學簡報
COSCUP 2015 開源之道-Git工作坊教學簡報COSCUP 2015 開源之道-Git工作坊教學簡報
COSCUP 2015 開源之道-Git工作坊教學簡報
Bachue Zhou
 
Learning to Use Git | WeiYuan
Learning to Use Git | WeiYuanLearning to Use Git | WeiYuan
Learning to Use Git | WeiYuan
Wei-Yuan Chang
 
First meetingwithgit
First meetingwithgitFirst meetingwithgit
First meetingwithgit
Rhythm Sun
 
20150313 ian git
20150313 ian git20150313 ian git
20150313 ian git
LearningTech
 
容器與 Gitlab CI 應用
容器與 Gitlab CI 應用容器與 Gitlab CI 應用
容器與 Gitlab CI 應用
Philip Zheng
 
Git 簡介(古時候的簡報備份)
Git 簡介(古時候的簡報備份)Git 簡介(古時候的簡報備份)
Git 簡介(古時候的簡報備份)
Hsin-lin Cheng
 
Github简介及实用入门
Github简介及实用入门Github简介及实用入门
Github简介及实用入门
Rongxing Liu
 
Android 程式設計(4)
Android 程式設計(4)Android 程式設計(4)
Android 程式設計(4)
Roy Wang
 

Similar to Submodule && subtree (20)

Git 超簡單學習懶人包(軟體程式版本控管系統)
Git 超簡單學習懶人包(軟體程式版本控管系統)Git 超簡單學習懶人包(軟體程式版本控管系統)
Git 超簡單學習懶人包(軟體程式版本控管系統)
 
Git &amp; git hub v1.2
Git &amp; git hub v1.2Git &amp; git hub v1.2
Git &amp; git hub v1.2
 
Git原理与实战 201607
Git原理与实战 201607Git原理与实战 201607
Git原理与实战 201607
 
Git+使用教程
Git+使用教程Git+使用教程
Git+使用教程
 
Git基础培训
Git基础培训Git基础培训
Git基础培训
 
Git Tutorial
Git TutorialGit Tutorial
Git Tutorial
 
Git入門介紹
Git入門介紹Git入門介紹
Git入門介紹
 
Git Flow 管理
Git Flow 管理Git Flow 管理
Git Flow 管理
 
Git 教學
Git 教學Git 教學
Git 教學
 
Git 实战
Git 实战Git 实战
Git 实战
 
Github in xcode
Github in xcodeGithub in xcode
Github in xcode
 
20170510 git 懶人包
20170510 git 懶人包20170510 git 懶人包
20170510 git 懶人包
 
COSCUP 2015 開源之道-Git工作坊教學簡報
COSCUP 2015 開源之道-Git工作坊教學簡報COSCUP 2015 開源之道-Git工作坊教學簡報
COSCUP 2015 開源之道-Git工作坊教學簡報
 
Learning to Use Git | WeiYuan
Learning to Use Git | WeiYuanLearning to Use Git | WeiYuan
Learning to Use Git | WeiYuan
 
First meetingwithgit
First meetingwithgitFirst meetingwithgit
First meetingwithgit
 
20150313 ian git
20150313 ian git20150313 ian git
20150313 ian git
 
容器與 Gitlab CI 應用
容器與 Gitlab CI 應用容器與 Gitlab CI 應用
容器與 Gitlab CI 應用
 
Git 簡介(古時候的簡報備份)
Git 簡介(古時候的簡報備份)Git 簡介(古時候的簡報備份)
Git 簡介(古時候的簡報備份)
 
Github简介及实用入门
Github简介及实用入门Github简介及实用入门
Github简介及实用入门
 
Android 程式設計(4)
Android 程式設計(4)Android 程式設計(4)
Android 程式設計(4)
 

Submodule && subtree