背景
コードをガーッと書いてcommitを積み上げて、最終的にキレイな意味のあるcommitにしたい、という事があると思います。僕はあります。そういうときに、自分なりにやっているコードの整理フローです。
注意
以下のフローではrebaseを利用します。
もうご存知かとは思いますが、rebaseは簡単にcommitの歴史が変えられてしまうので、複数人で開発しているときに実行するのはチームメンバーに確認をとった上で行ないましょう。
commit操作の概要
commitの意図は「要求されている機能を一通り実装したのでごっそりcommit」「まずはmodel部分だけ書いてテスト通ったからcommit」「一時的に別の案件の作業をするためちょっとcommit」、などその時々で様々だと思います。それらいろんな意図で詰み上がってしまったcommit達をわりと大規模にrebase/resetなどし、意味のあるcommitを作ります。意味のあるcommitができるとrevertもしやすくなります。
詳細な手順
まずは、対象となるrepositoryをcloneし、整理する対象のブランチをチェックアウトします。
$ git clone git@github.com:radioboo/sample.git
$ cd sample/
$ git checkout -b function origin/function
チェックアウトしたら、これまで蓄積してきたコミット群を1つにまとめてみます。
いろいろとやり方はあると思いますが、今回はrebase -iでsquashして履歴をひとつにまとめます。
$ git rebase -i HEAD~13
普通にrebaseの手法でsquashします
$ git log -n 1 --oneline
abcd123 新機能の差分全て ←ひとつになりました
ここまでくると、現在HEADにそれまで積んだcommitをすべてまとめた差分が出来ているはずです。この状態でgit resetし、HEADを一個前に戻してやります。するとそれまでHEADにコミットされていた差分がresetされて、差分ファイルたちはUnstagedな差分となります。
$ git reset HEAD~1
Unstaged changes after reset:
M lib/Hoge/Model/Hogehoge.pm
M lib/Hoge/Controller/Fugafuga.pm
M t/lib/Hoge/Model/Hogehoge.t
M t/lib/Hoge/Controller/Fugafuga.t
ここまで戻せば、あとは必要なファイルを再度add→commitすることが出来るようになるので、それぞれ必要な順番でcommitを再度積んでいくことで意味のある整理されたcommitが作成できると思います。