gitリビジョン間の差分を抽出する

2021年3月20日土曜日

git

t f B! P L

「git」で、特定のリビジョンで変更されたファイルのみ、フォルダ構成を維持したまま差分としてファイルをエクスポートしたい時に使えるコマンドを紹介します。

gitのコマンドには、差分ファイルをエクスポートするための直接のコマンドは存在しないため、git diffgit archiveコマンドを組み合わせて使って、差分ファイルを圧縮してエクスポートします。

スポンサーリンク

gitで差分ファイルをエクスポート

先述のように、gitでコミット間の差分ファイルをエクスポートするには、git diffgit archiveコマンドを組み合わせます。

具体的な手順としては、git diffコマンドでリビジョン間の差分ファイル名のリストを取得し、git archiveで、それらのファイルのフォルダ構造を維持したまま圧縮ファイルとしてエクスポートします。

言葉だけではイメージが沸かないかもしれない為、コピペで使えるサンプルコマンドを見ながら、差分をエクスポートする方法を見てきましょう。

最新からひとつ前の差分をエクスポート

次のイメージのように、最新と一個手前のリビジョンとの差分を取得します。


コピペ用のコマンドです。

git archive HEAD `git diff --name-only HEAD^ HEAD --diff-filter=ACMR` -o archive.zip

リビジョン(上の例では HEAD)の後ろにチルダ(^)を付けると、そのリビジョンよりも一つ前のリビジョンという指定になるため、これにより、git diffで最新よりひとつ前のリビジョンから最新リビジョンまでの差分ファvイルの一覧が取得できる仕掛けになってます。

指定したリビジョンの差分をエクスポート

リビジョンを指定して、そのリビジョンと一個手前のリビジョンとの差分を取得します。

コピペ用のコマンドは次の通り。

$ git archive コミットID3 `git diff --name-only コミットID3^` -o archive.zip

2つのリビジョン間の差分をエクスポート

次のイメージのように、2つのリビジョンの範囲を指定して差分を取得します。

コピペ用のコマンドは次の通り。開始と終了リビジョンの指定が逆転しないように注意しましょう。

$ git archive コミットID3 `git diff --name-only コミットID1^ コミットID3 --diff-filter=ACMR` -o archive.zip

開始リビジョン(コミットID)の後ろにチルダ()を付けるのを忘れないようにしましょう。チルダ()をつけ忘れると、開始リビジョン(コミットID)の変更が抽出できません。

スポンサーリンク

特定リビジョンのファイルを全部エクスポート

差分ではなく、特定のリビジョン時点でのファイル一式をエクスポートする場合は、git archiveコマンドだけを使用します。

git archive <リビジョン> -o archive.zip

いくつか使用例を見てみましょう。

最新リビジョン(HEAD)をエクスポート

現在チェックアウトしているブランチの最新リビジョン(HEAD)のファイル一式をエクスポートします。ローカルで変更したファイルは含まないため、コミット前にリポジトリ上の最新を抜き出したい時などに便利かもです。

$ git archive HEAD -o archive.zip

リビジョンを指定してエクスポート

コミットIDを指定して、そのリビジョン時点のファイル一式をエクスポートします。

$ git archive 2320f92af5 -o archive.zip

○世代前のリビジョンをエクスポート

最新リビジョン(HEAD)の1世代前や、指定リビジョンの1世代前など、リビジョンの後ろにチルダ(^)を付けて、指定リビジョンの○世代前のファイル一式をエクスポートします。

次のコマンドは、最新リビジョンの1世代前をエクスポートするコマンドの例です。

$ git archive HEAD^ -o archive.zip

まとめ

「git」のコマンドで差分を抽出する方法や、指定したリビジョンをエクスポートする方法などを紹介してきました。

今回紹介した内容は、プログラムを客先に納品した後に変更があり、差分のファイルだけを再度納品したい時などに超活躍します。(少なくとも私は重宝している)

スポンサーリンク

QooQ