Git

gitでブランチ間の差分ファイルを抽出

More than 3 years have passed since last update.


はじめに

ソースコードの管理にgitを導入していても、案件によっては本番化とは連携しておらず、差分ファイルだけ必要になる事がよくあります。

コミットを指定して差分を抽出する方法は利用していたのですが、そもそも細かくコミット間の差分を抽出する必要性があまりなかったので、ターミナルから簡単にブランチの差分ファイルだけまとめてzipで抽出する方法をまとめてみました。

なお、今回紹介するやりかたは、選択中の作業ブランチとmasterブランチ間になります。


基本のコマンド

とりあえず使いたい時はこれ。

git archive --format=zip --prefix=_diff/ HEAD `git diff master --diff-filter=ACMR --name-only` -o _diff.zip

良記事をよく見かけるので、git archiveの細かい説明は省きますが、これで現在のブランチとmasterブランチを比較して、差分を_diff.zipに纏める事ができました。


削除ファイルがあったときのエラー対策

削除したファイルがあるとエラーになってしまうので、--diff-filterオプションで抽出ファイルを絞ることで削除ファイルを除外しています。

とりあえず以下で事足りていますが、場合によっては修正が必要かも。

A : 追加

C : コピー

M :修正

R :リネーム

なお、削除ファイルは、Dなので、必要であれば削除ファイルだけのリストも取得できます。

git diff master --diff-filter=D --name-only


functionにして使うと楽

毎回オプション付きのコマンドを打つのが面倒くさいので、実際は、.bash_profile(ここで良いのかな)にfunctionを追加して利用しています。

ローカルリポジトリのルートのディレクトリで実行する必要があります。

こちらでは解凍時に扱いやすくするため、zip内に格納されるディレクトリ名を_diffではなく、ローカルリポジトリのディレクトリ名で格納するようにしました。

bashで動作確認済み。

(daそれはdiff archiveの略)

function gitda() {

BASENAME=$(basename `pwd`)
git archive --format=zip --prefix=${BASENAME}/ HEAD `git diff master --diff-filter=ACMR --name-only` -o _diff.zip
}


使い方まとめ



  1. .bash_profile等にfunctionを追加。

  2. ターミナルでdiffを取りたいディレクトリへ移動し、masterとの差分を取りたいブランチになる。


  3. gitdaを実行。

  4. 実行したディレクトリに_diff.zipが出来上がっていれば完了。

ちなみに、functionの中身だけ.shファイル化してSouceTreeのカスタムアクションに登録しても使えました。お好みでご利用頂ければ幸いです。