別のリポジトリの差分を取り込む - Git による版管理環境を構築する

SPECIAL


別のリポジトリの差分を取り込む

Git で別のリポジトリからの差分を取り込むには、どのようにしたらいいのでしょう。

Subversion でいうところの "svn merge -r R1:R2 file:////svn/repo1" みたいなことをしたいのですけど、このような操作を Git で簡単に実現する方法がわかりませんでした。

とりあえず、このようなことを実現する方法として思いつくのが、修正を終えたリポジトリのワーキングコピーで "git format-patch" で差分を作った後、別のリポジトリのワーキングコピーで "git am" でそのパッチを適用するという流れでしたので、まずはこの方法で実現していってみたいと思います。

 

まず、作業を終えたリポジトリのワーキングコピーへ移動します。

そこで、"git log" で対象となるコミット ID を確認したら、次のコマンドを実行して、差分をファイルに書き出します。

git format-patch 起点となるコミットID..終点となるコミットID -o パッチファイルを作成するディレクトリ名

このようにすると、指定したディレクトリ内に、コミットことに "通し番号-コミット内容.patch" というファイルが出来上がるようです。コミットの数だけファイルが出来上がるので、パッチごとに別のディレクトリを指定するのがいいかもしれません。

ファイル名の "コミット内容" のところは、コミットの説明のうち、英語の部分だけが空白毎に "-" で区切って設定される様子です。

 

さて、適用したいブランチのワーキングコピーに移動して、上で作成したパッチを適用してみます。

パッチを個別のディレクトリに作成した場合には、次のようにワイルドカードを使用して、一度にすべてのパッチを適用することができるようです。

git am パッチファイルを作成したディレクトリ名/*

既存のコードとパッチの内容とに矛盾がなければ、これでパッチを適用することができました。

パッチが適用されると、その中に埋め込まれていたコミットに関する情報も併せて、修正された内容が自動的にコミットされるようでした。

 

もしここで修正内容がコンフリクト(衝突)して、パッチの適用に失敗した場合には、その旨が表示され、内容の修正が求められます。

コンフリクトした内容は、そのファイル内に マージ のときと同じように書き込まれるので、その内容を適切なものに修正した後で、次のように、修正が終わったことを Git に伝えます。

git am --resolved

また、コンフリクトが解消できない場合など、もしこのパッチの適用をなかったことにしたい場合は、次のようにします。

git am --abort

このようにすることで、別のリポジトリで行った変更を、パッチを介して、別のリポジトリに適用することができました。

 

目次