ソースコードを整理していると、リポジトリを統合したい時があります。
リポジトリを2つに分けて管理してきたけど、コードを整理してスリムになると
2つに分けている意味がなくなったり、2つセットで意味のあるコード群になることがあります。
今回は、GIT で管理されている2つのリポジトリを統合する方法をまとめます。
GIT リポジトリの構成
ここで紹介する方法は、以下のリポジトリ構成とします。
リポジトリ構成
${HOME}/
|- repo.a:リポジトリA
|- repo.b:リポジトリB
または
git://sanachan.com/repo.a:リポジトリA
git://progzakki.sanachan.com/repo.b:リポジトリB
git rebase を使って統合する方法
repo.a というリポジトリの master ブランチに
repo.b というリポジトリの master ブランチを取り込んで統合する方法です。
step
1git fetch で repo.a のブランチに取り込む
以下のコマンドを実行して、repo.a の new-branch というブランチに repo.b を取り込みます。
command
$ cd repo.a
$ git fetch ../repo.b refs/heads/master:refs/heads/new-branch
step
2git rebase を使って new-branch の始点を master ブランチの先頭にする
command
$ git checkout new-branch
$ git rebase master
コンフリクトが発生した場合は、都度対応して rebase を続けます。
command
$ git add .
$ git rebase --continue
step
3repo.a の master ブランチに new-branch をマージ
rebase の作業を終えた後、repo.a の master ブランチにマージして統合の作業完了です。
command
$ git checkout master
$ git merge new-branch
$ git branch -d new-branch ※不要になったnew-branchの削除
全体の流れを以下の図に整理しておきます。

git remote を使って統合する方法
先の git rebase を使うのは、統合に時間を要する場合です。
ブランチを分けて作業することで、master ブランチでの開発は継続することができます。
あまりコンフリクトが見込めない場合は、もっとお手軽な方法があります。
git remote add を使って、一気に統合する方法です。
step
1repo.a に repo.b のリモートリポジトリを追加
command
$ cd repo.a
$ git remote add repo.b ../repo.b
step
2repo.b の変更点を全て取り込む
command
$ git fetch repo.b
step
3repo.b リモートの master ブランチをマージ
command
$ git merge repo.b/master
git merge を使ってサブディレクトリとして統合する方法
ベースとなるリポジトリのサブディレクトリとして統合したい場合があります。
1つの機能として、または何かのまとまったデータなどのリポジトリを統合したいときです。
step
1サブディレクトリを作成
command
$ cd repo.a
$ mkdir test_data
$ touch test_data/.gitkeep
$ git add -A test_data
$ git commit -m "prepare sub-directory to integrate another repository."
step
2repo.b の変更点を全て取り込む
merge オプション -X subtree=subdir を使用して、サブディレクトリにマージします。
command
$ git remote add repo.b ../repo.b
$ git fetch repo.b
$ git merge -X subtree=test_data repo2/master
git pull を使って統合する方法
リポジトリが別々のサーバーに存在する場合には、git pull を使うと便利です。
clone するついでに統合しちゃうという感じです。
step
1ベースとなる repo.a をクローンする
command
$ git clone git://sanachan.com/repo.a repo.a
$ cd repo.a
step
2取り込むリポジトリを remote add する
command
$ git remote add repo.b git://progzakki.sanachan.com/repo.b
step
3git pull で統合して push する
command
$ git pull repo.b master
$ git remote rm repo.b
$ git push
特定の変更だけ取り込んで統合する方法
全ての変更を統合したいんじゃなくて、特定の変更だけ取り込んで統合したい場合は、
以下の流れでコマンドを実行します。
step
1ベースとなる repo.a をクローンする
command
$ git clone git://sanachan.com/repo.a repo.a
$ cd repo.a
step
2取り込むリポジトリを remote add する
command
$ git remote add repo.b git://progzakki.sanachan.com/repo.b
step
3取り込みたい変更を探して控えておく
command
$ git fetch repo.b
$ git log repo.b/master
※ここで表示された SHA1 を控えておく
step
4控えた SHA1 を cherry-pick して変更を取り込む
command
$ git cherry-pick <SHA1>
$ git push
$ git remote rm repo.b