gitでtagとtagの間の差分を出力する
やりたいこと
gitのプロジェクトで以下のような感じでtagがついてる時、tag1とtag2の差分を出してzipにしたい
※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の物置