TL;DR
これは次のコマンドでできます。
git diff <commit-1> <commit-2> -- target-directory | git apply # 例 git diff 4cc8f716fcc5f263b0c50cebac7809c1927f99ff 1d8cb66b2ae8aff8003d11cfea61031d1d6dc954 -- app | git apply ## 他の Git コマンド同様コミットを特定できれば指定可能。↓はタグ指定 git diff v0.124.5 v0.125.0 -- migrate | git apply
このコマンドは git diff
で管理されているリポジトリ内の特定のディレクトリに関する2つのコミット間の差分を生成し、git apply
でその差分を現在の作業ディレクトリに適用するコマンドです。
本文
プログラムをデプロイする際、稀に部分的に先にソースコードを置き何かをする必要がある時があります。例えばデプロイ中もシステムの互換を保つために順序良くプログラムを配置する必要がある時です。余談ですがそういった必要がある時は複数台のマシンを用意してデプロイ中はデプロイしていないマシンにのみユーザーを処理させる、などできた方が安全かつ楽な場合が多いです。ともあれ、そういった状況では Git 管理してあるソースコードの一部のみを呼び出したりすることができると便利です。
特定のディレクトリについてのみコミットAからコミットBまでの変更をピックして適用する方法は先に紹介したgit diff
でできます。ディレクトリについての部分適用はこのコマンドでできますが Git コマンドは多彩なオプションがあり次の例の様なこと、またそれ以上のこともできます。
例えば特定のディレクトリ(resources)の変更だけを適用したくない場合、次のコマンドでできます。
git diff <commit-1> <commit-2> -- . ':!resources' | git apply
これも何かを検証したい時などに使えます。resources 以下を元にしたビルド後ファイルと残りのシステムがあれば検証が可能といった resources 以下を持ってくるのが無駄な場合などに使えます。
注意点としてこの方法で変更を適用した場合、新しいコミットが作成されません(Git コマンドですがほとんど patch コマンドみたいな感じです)。そのため適用した変更をリポジトリに反映するには改めてコミットする必要があり、元に戻すにはgit apply -R
コマンドを使用するか、手動で元に戻す必要があります。大雑把に元に戻すならgit checkout .
を使うのも手です。