Gitで別リポジトリにコミットの変更を適用する方法(git format-patch / apply)
2分で読める
テック
最終更新:
リポジトリの分割やモノレポからのサービス切り出しの際、「このコミットの変更だけ別リポジトリにも反映したい」というケースがあります。
git cherry-pick はリモートが異なるリポジトリ間では使えないため、パッチファイルを介して変更を移植するのが確実です。
手順
1. パッチファイルを作成する
元のリポジトリで、適用したいコミットからパッチを生成します。
git show <commit-hash> -- path/to/target/file > /tmp/apply.patch
特定のディレクトリ配下の変更だけを含めたい場合は、パスを指定します。
git show abc1234 -- src/api/ > /tmp/apply.patch
複数コミットをまとめてパッチにしたい場合は format-patch が便利です。
git format-patch <base-commit>..<target-commit> --stdout > /tmp/apply.patch
2. パッチ内のパスを調整する(必要な場合)
リポジトリ間でディレクトリ構成が変わっている場合、パッチファイル内のパスを書き換えます。
sed -i '' 's|a/old-path/|a/new-path/|g; s|b/old-path/|b/new-path/|g' /tmp/apply.patch
3. 移行先リポジトリでパッチを適用する
cd /path/to/new-repo
git apply /tmp/apply.patch
適用前にドライランで確認するのがおすすめです。
git apply --check /tmp/apply.patch
よくあるエラーと対処
| エラー | 原因 | 対処 |
|---|---|---|
patch does not apply | パスの不一致 or コンテキスト行の差異 | --3way オプションを試す |
trailing whitespace | 空白の差異 | --whitespace=fix を付与 |
まとめ
git show or git format-patch でパッチを作り、git apply で適用するだけで、リポジトリをまたいだ変更の移植ができます。CI/CD パイプラインでの自動適用にも応用可能です。