保守

【保守】2つのGITリポジトリを統合する方法

2021年7月6日

ソースコードを整理していると、リポジトリを統合したい時があります。

リポジトリを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
1
git fetch で repo.a のブランチに取り込む

以下のコマンドを実行して、repo.anew-branch というブランチに repo.b を取り込みます。

 command
$ cd repo.a
$ git fetch ../repo.b refs/heads/master:refs/heads/new-branch

 

step
2
git rebase を使って new-branch の始点を master ブランチの先頭にする

 command
$ git checkout new-branch
$ git rebase master

コンフリクトが発生した場合は、都度対応して rebase を続けます。

 command
$ git add .
$ git rebase --continue

 

step
3
repo.a の master ブランチに new-branch をマージ

rebase の作業を終えた後、repo.amaster ブランチにマージして統合の作業完了です。

 command
$ git checkout master
$ git merge new-branch
$ git branch -d new-branch   ※不要になったnew-branchの削除

 

全体の流れを以下の図に整理しておきます。

GITリポジトリの統合

 

git remote を使って統合する方法

先の git rebase を使うのは、統合に時間を要する場合です。
ブランチを分けて作業することで、master ブランチでの開発は継続することができます。

あまりコンフリクトが見込めない場合は、もっとお手軽な方法があります。
git remote add を使って、一気に統合する方法です。

 

step
1
repo.a に repo.b のリモートリポジトリを追加

 command
$ cd repo.a
$ git remote add repo.b ../repo.b

 

step
2
repo.b の変更点を全て取り込む

 command
$ git fetch repo.b

 

step
3
repo.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
2
repo.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

もし「fatal: refusing to merge unrelated histories」というエラーが出た場合は、
以下のオプションを付けて再度試してみてください。

 command
$ git merge -X subtree=test_data repo2/master --allow-unrelated-histories

 

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
3
git 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

 

こちらの記事もよく読まれています

  • この記事を書いた人
  • 最新記事
SANACHAN

SANACHAN

「生涯一エンジニア」を掲げ、大手グローバル企業でSE/PGとして8年勤め、キャリアアップ転職した現役のエンジニアです。世にあるメジャーな全プログラム言語(コボル除く)を自由に扱えます。一児の父。自分のため、家族のため、日々勉強してます。システムエンジニア、プログラミングに関する情報を蓄積している雑記帳です。

-保守
-