マジ便利、Gitリビジョン間の差分をエクスポート | すぐ使えるサンプルコマンド付き

2021年6月4日金曜日

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 HEAD `git diff --name-only リモート名/ブランチ名..HEAD --diff-filter=ACMR` -o archive.zip

… の右側が時系列的に最新とみなされ
、上のコマンドの場合は git commit した後のローカルの最新と、リモートリポジトリの差分を確認する時につかえます。

ブランチ間の差分をエクスポート

2つのブランチ間の差分をエクスポートする場合は次のコマンドを使用します。

git archive ブランチA `git diff --name-only ブランチA..ブランチB --diff-filter=ACMR` -o archive.zip

上のコマンドの場合、ブランチAとブランチBを比較し、差分があるブランチAのファイルをエクスポートします。

スポンサーリンク

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

差分ではなく、特定のリビジョン時点でのファイル一式をエクスポートする場合は、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」のコマンドで差分を抽出する方法や、指定したリビジョンをエクスポートする方法などを紹介してきました。

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

スポンサーリンク
スポンサーリンク

このブログを検索

Profile

自分の写真
Webアプリエンジニア。 日々新しい技術を追い求めてブログでアウトプットしています。
プロフィール画像は、猫村ゆゆこ様に書いてもらいました。

仕事募集もしていたり、していなかったり。

QooQ