まりぴよこのブログ

日々の日記。技術ネタでまとまりきってないものの記録、伝わる文章の書き方を練習とか。

Git & Tig コミットを分割してみた

Everyday Rails 写経中・・

Read Everyday Rails - RSpecによるRailsテスト入門 | Leanpub

https://s3.amazonaws.com/titlepages.leanpub.com/everydayrailsrspec-jp/small?1413374938

RSpecの勉強に、Everyday Railsを写経中。現在5章(コントローラースペックの基礎)始めたところ。 本家のgitリポジトリをクローンしないで、同じ状態になるように、Railsコマンドたたいて進めていた。

こんな感じ↓

$ ./bin/rails g model Contact firstname:string lastname:string email:string

generate controllerしようとして、一緒にviewも作りたくなって、もしかして最初にscaffoldした方が良かったかも。。と思いせっかくだからgitコマンドの練習を兼ねてやり直してみようと思った。 (モデル生成とマイグレーション適用以外の、写経部分のみをscaffoldし直したところに当てたい)

4章まで進んでくる間に、モデルを作ったトコと、スペック書いてたところをなるべくstep by stepに分けてたつもりだったんだけど、いざapplyしようとしたら、db migreateしてるのと、一緒になってたコミットがいくつかあり・・・

このコミットのうち、コレとコレとコレ(ファイル指定)でapplyしたいんだよな〜・・・

git cherrypickの時に、ファイルの指定ってできないんだろうか・・・

としばし悩んでたけど、コミットそのものを分割すれば良いことに気づいた。

やってみた

今までぼへ〜っとコミットログを見ることにしか使えてなかったtigも使ってみたい。

分割したいコミットのところでブランチチェックアウト

pokepokeは分割したいコミットを表すid。

re-applyという名前で新しいブランチをpokepokeから作る。

$ git checkout -b re-apply pokepoke

reset --softでコミットの状態をコミット前に戻す

1個前の状態に戻す。 ファイルはもちろんそのままにしたいので、--softで。

$ git reset --soft HEAD^

applyしたい部分だけステージしてコミット

ここでtig登場

$ tig

Shift-Sでステージングビューに移動。 コミットに含めたいファイルを選択し、uでステージング。

Shitf-Cでコミット。

このページで勉強した:tigでgitをもっと便利に! addやcommitも - Qiita

分割したコミットをapplyしたいブランチに戻る

元のブランチに戻る。

$ git checkout original-branch

tigでさっきのapplyするブランチを表示

tig起動時にブランチ名を指定すると、そのブランチを操作対象にしてくれる。

$ tig re-apply

re-applyブランチのコミットログが出てくるので、さっき作った分割したコミットを選んで、Shift-C

完成!

作ったコミットまで戻って一旦分割できるようになった・・ やっとgitの良さがわかりかけてきたかも。