狂ったお茶会のlog

後で起きる自分のためのメモ

gitでtagとtagの間の差分を出力する

やりたいこと

gitのプロジェクトで以下のような感じでtagがついてる時、tag1とtag2の差分を出してzipにしたい
f:id:dormouse666:20151102170106p:plain:w300
※SorceTreeで見た時

試したこと

上記のとおり、test1が古いtag、test2が新しいtag

(1) git archive --format=zip --prefix=root/ test1 `git diff --name-only test2 test1` -o archiveTest.zip
(2) git archive --format=zip --prefix=root/ test2 `git diff --name-only test1 test2` -o archiveTest2.zip
(3) git archive --format=zip --prefix=root/ test1 `git diff --name-only test1 test2` -o archiveTest3.zip

よくわかってない時の所感
(1)test1〜test2の間で失われたものが抽出された気がする
(2)test1〜test2の間で新しく追加されたものが抽出された気がする
(3)(1)と同じものが抽出された気がする

ググった
git diff の直前で指定してるコミットが抽出元のコミットだと理解
なので(1)と(2)の挙動の違いになる

git diff で指定してる2つのtagの順番に関しては、
git diff (基準) (変化後)
という扱いになる、が、上記のやり方だと、--name-only オプションがついていることによって、「差分があるファイルを(差分だけでなく)全部抽出する」ということになるので、(1)と(3)の違いが出ないということ

ちなみに--name-onlyオプションつけないと内容がそのまま出るのでarchiveに渡せなくて死ぬ

あと、tag1〜tag2間で削除されてるファイルとかあると以下みたいなエラーが出て死ぬ

fatal: pathspec 'hogehoge' did not match any files

--diff-filter=AMCR みたいにgit diffにオプションをつけるといいらしい(詳しくは参照URL)
それと、削除ファイルがある場合は、git diff (新しいコミット)(古いコミット)の順番でdiffしないと、オプションつけてても上と同じエラーが出て死ぬ

普通にdiff見る場合はgit diff (古いコミット)(新しいコミット)が見やすいが、上記の場合は差分があるファイルがわかればいいだけなので逆でもまあ結果的にはいい

最終的にやったこと

git archive --format=zip --prefix=root/ tag2 `git diff --name-only --diff-filter=AMCR tag2 tag1` -o archive.zip

蛇足

上記のやりかただと差分自体はわかんねーんだよなというのがあり
以下のように差分だけtxt出力もした

git diff --diff-filter=AMCRD tag1 tag2 >> ~/diff.txt

こっちの場合は、差分だけ出るので、git diff (古いコミット)(新しいコミット)の順番にする

2016/02/27 追記

commitコメントと変更ファイル情報を一緒に見たい時

git log --name-status --pretty=oneline tag1..tag2

--pretty=oneline つけると1行!楽!!!

上記をtxtに出力したい時

git log --name-status --pretty=oneline tag1..tag2 >> ~/diffLog_oneline.txt

-m をつけるとマージ情報も観れる

ブランチ間の特定のファイルのdiff

git diff tag1 tag2 ファイル名

参照

git tagで過去と現在のソースの差分をzipにまとめる | 株式会社アルベ | Arubeh Inc.
gitで差分ファイルを抽出してzipにまとめる方法 - HAM MEDIA MEMO
Gitを使って差分ファイルと差分情報を簡単に納品するコマンドのメモ - Qiita
git 差分を表示 (git diff) - saldnの物置