あまり遭遇する人はいないだろうけど数年前に分岐したリポジトリA,BがあってAで開発進めていた内容を今回はBにも適用する必要があった。
git patch
を使うと良さそうとのことだが聞いたことあるけど使ったことはなかったのでメモを残しておく。
まずAで開発を進めていたコミットからパッチを作成する。
前提:Aでの開発はmasterからhogeというブランチで作業を進めていたとする。
最新のmasterをローカルにチェックアウト(既にチェックアウトしてるならpull等で最新に)
git checkout -b master origin/master
パッチファイルの作成
hoge
ブランチをチェックアウトしてパッチを作成。
git checkout hoge
git status
ここで指定するのはローカルのmasterブランチ
git format-patch master
実行すると以下のようなファイルが生成される。
0001-composer-92684.patch
0002-API-HogeClass-92791.patch
0003-API-93064.patch
0004-API-93124.patch
中身はいつも見てるコミットログのようなもの。
分岐してるリポジトリBで取り込む
Aリポジトリでさっき作成したパッチファイルをBリポジトリにコピー・移動する。
取り込み
git am -3 0001-composer-92684.patch
-3
は3-way merge
成功すると以下のようにコミットログが表示される。
Applying: ほげほげほげ
失敗した場合
失敗する理由としては私の場合は以下のようなものだった。
・Bリポジトリに存在しないファイルの差分
・Bリポジトリでは中身が全然異なるファイルの差分
・Bリポジトリのファイルに対象の行がない
・ファイル名のリネーム
Patch failed at 0001 ほげほげ
このようなメッセージが表示された場合は残念ながらマージに失敗しているので差分を確認する。
差分は発生していないと思うので以下のコマンドで適用&確認を行う。
git apply -v 0001-composer-92684.patch
ここで差分がでてるならコンフリクトを解消して以下のコマンドで次のパッチへ進む。
git am --continue
差分なんか出ないんだけどって時はパッチファイルを直接開いて原因を解決する。
あとはこれの繰り返し。