【Git】特定のディレクトリについてのみコミットAからコミットBまでの変更をピックして適用する方法

  • 2023年3月23日
  • 2023年3月23日
  • Git

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 -- target-directory で管理されているリポジトリ内の特定のディレクトリに関する2つのコミット間の差分を生成し、git applyでその差分を現在の作業ディレクトリに適用するコマンドです。

本文

 プログラムをデプロイする際、稀に部分的に先にソースコードを置き何かをする必要がある時があります。例えばデプロイ中もシステムの互換を保つために順序良くプログラムを配置する必要がある時です。余談ですがそういった必要がある時は複数台のマシンを用意してデプロイ中はデプロイしていないマシンにのみユーザーを処理させる、などできた方が安全かつ楽な場合が多いです。ともあれ、そういった状況では Git 管理してあるソースコードの一部のみを呼び出したりすることができると便利です。

 特定のディレクトリについてのみコミットAからコミットBまでの変更をピックして適用する方法は先に紹介したgit diff -- target-directory | git applyでできます。ディレクトリについての部分適用はこのコマンドでできますが Git コマンドは多彩なオプションがあり次の例の様なこと、またそれ以上のこともできます。

 例えば特定のディレクトリ(resources)の変更だけを適用したくない場合、次のコマンドでできます。

git diff <commit-1> <commit-2> -- . ':!resources' | git apply

 これも何かを検証したい時などに使えます。resources 以下を元にしたビルド後ファイルと残りのシステムがあれば検証が可能といった resources 以下を持ってくるのが無駄な場合などに使えます。

 注意点としてこの方法で変更を適用した場合、新しいコミットが作成されません(Git コマンドですがほとんど patch コマンドみたいな感じです)。そのため適用した変更をリポジトリに反映するには改めてコミットする必要があり、元に戻すにはgit apply -Rコマンドを使用するか、手動で元に戻す必要があります。大雑把に元に戻すならgit checkout .を使うのも手です。

>株式会社シーポイントラボ

株式会社シーポイントラボ

TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:〒432-8003
   静岡県浜松市中央区和地山3-1-7
   浜松イノベーションキューブ 315
※ご来社の際はインターホンで「316」をお呼びください

CTR IMG