git subtree のユースケース別覚書
Git Subtreeが覚えられないのでメモ。
追記するかもしれないけど、記憶に焼き付けることが目的なので、あまり期待できない。
usecase
- Subtreeの追加
- コミット&push
- pull
- (Subtreeを含むリポジトリの)clone
ブランチが絡んだケースはまだ必要性に直面してないので割愛.
注意点
以下において例はすべて、
- 親となるリポジトリ: https://github.com/kyoh86/parent.git
- subtreeとして追加するリポジトリ: https://github.com/kyoh86/sub.git
として記載していく。
また、あくまで一例なので「必ずこうしなきゃならん」という正しさのようなものは含まれていない。
Subtreeの追加
- remoteを追加する
$ git remote add <subtree-remote-name> <subtree-addr>
<subtree-remote-name>
は何でも良いんだが、以下簡単のために sub-origin
とする
例:
$ git remote add sub-origin https://github.com/kyoh86/sub.git
- subtreeを追加する
$ git subtree add --prefix <subtree-dir-name> <subtree-remote-name>
<subtree-dir-name>
はやりやすいように何でもいいんだが、以下簡単のために sub-dir
とする
例:
$ git subtree add --prefix sub-dir sub-origin
コミット & push
コミットするときは、親(parent)の変更とサブツリー(sub)内の変更を1コミットに混ぜない。
親の変更は通常通りなので割愛する。
サブツリー内の変更をmainブランチにコミット & pushする際はこう。
$ git add sub-dir
$ git commit
$ git push origin main
$ git subtree push --prefix sub-dir sub-origin main
親(parent)にpushして、サブツリー(sub)にもpushする感じ
pull
親リポジトリのpullは標準どおりなので気にしない。
サブツリーのリポジトリで独立してcommit & pushが行われた場合は、pullしてマージする必要がある。
$ git subtree pull --prefix sub-dir sub-origin main
コンフリクトのことは今はまだ考えたくない
(Subtreeを含むリポジトリの)clone
Cloneした時、remote追加しておかないと手間。
そのままだとsubtreeの存在には気づけないので、push漏れとか起きて悲劇なので、伝達が大事。
$ git clone https://github.com/kyoh86/parent.git
$ cd parent
$ git remote add sub-origin https://github.com/kyoh86/sub.git
自明だが、 sub-origin
は例にすぎず、このとき他の手順と同じ名前である必要はない。
補足 : remoteの運用
$ git remote add <subtree-remote-name> ...
のように、無理に <subtree-remote-name>
を付ける必要はない。
これは所詮ただのエイリアスのようなものなので、直接 <subtree-addr>
を指定しても構わない。
むしろ、これらの操作をスクリプト化して他の人でも同じように使えるようにしておく、などの可搬性を考えるとそちらの方が有益な場合が多い。
Discussion