helen's blog

ずっとおもしろいことしてたいな。

git revertがgit diffにも役立ってくれた素敵な話

helen.hatenablog.com
の続編です

上記の方法は1つのブランチで作業されていて
間に別の案件のコミットが含まれていない場合に使えるものであり、
間に無関係なコミットが混ざっているとその差分もdiffに含まれてしまうため使えません。

そこで
f:id:heleeen:20160108215415j:plain
ローカルでブランチを作ってHEADを移動し、
関係ないコミットはrevertすればいいのでは!?と思いやってみました。

ブランチを作る理由

・作業完了後にブランチを削除すれば不要な作業を残さずに済むため
・そのままやるとgit resetなど無駄な作業が増えそうな予感

HEADを移動する理由

・関係する案件のコミットに後続コミットがあるとrevertが多くて単純に面倒
・下手にrevertの回数を増やしてコンフリクトを起こさないため
f:id:heleeen:20160108215417j:plain
↑ めんどそう

作業手順

  1. ローカルブランチ作成
  2. git reset --hard で関係する案件の最新のコミットにHEADを移動
  3. 間にはさまっている無関係なコミットをgit revert
  4. git diff で差分抽出

f:id:heleeen:20160108215418j:plain

本当にうまくいったのかの確認事項

  • 必要な差分が含まれていること
  • revertした差分がdiff結果に含まれていないこと
  • resetしたコミットより新しいコミットの差分が含まれていないこと

やってみた

$ git branch local_hoge
$ git checkout local_hoge
Switched to branch 'local_hoge'
$ git log
##########
git reset, git revertしたいコミットのコミット値を確認
##########
$ git reset --hard c95a08   
HEAD is now at c95a08 piyo_message
$ git revert 659392                                                                          
[develop_XXXX 8e414a5] Revert "hoge_message"
 4 files changed, 4 insertions(+), 114 deletions(-)
$ git revert eaa28f
[develop_XXXX 232830a] Revert "fuga_message"
 4 files changed, 21 insertions(+), 47 deletions(-)
$ git diff 反映するコミットの直前コミットのハッシュ値  反映するコミットの最終コミットのハッシュ値 --diff-filter=M
# --diff-filter=Mでファイルの更新のみを抽出(ファイルの追加はA)

結果

f:id:heleeen:20160108215421j:plain
求めていた差分が取れました!
チキンすぎて結局コミット内容と照らし合わせたなんて口が裂けても言えない
実験だからしょうがないよね!

まとめ

1つのブランチに他の案件のコミットが混ざっていてもその案件の差分が抽出できる!
ファイルが混ざっていてもできないことはない模様
ただしコピペする場合はdiffの+に注意(´-ι_-`)

git先輩さすがっす!!