分散型バージョン管理システムである Git では Subversion や CVS、Visual SourceSafe などと違って気軽にローカルリポジトリにコミットしていって、最終的に形になったところで公開/共用リポジトリに push するといったことができる。
こまめにローカルリポジトリにコミットしながら作業していくことで、いつでも後戻りしてやり直したり変更点を確認したりできる。ただちょっとした変更の連続によるたくさんのコミットを公開/共用リポジトリにそのまま push したくない。そういう場合は意味のある単位にコミットをまとめてから push したい。
Git では git-rebase でこれができる。
A---B---C---D---E | | | | | HEAD | HEAD^ HEAD~2
最初に git rebase する。
git rebase -i HEAD~2
すると
pick <HEAD~1のハッシュ> <HEAD~1 のログ> pick <HEADのハッシュ> <HEAD のログ>
という行を含む内容でエディタが起動する。HEAD を HEAD~1 にまとめたいので 2番目の pick を squash に書き換えエディタを閉じる。
すぐにまた今度はコミットログ修正のためのエディタが開く。HEAD~1 のコミットログと HEAD のコミットログがあらかじめ含まれているので、それらを編集して2つ分の内容を反映したものに書き換えエディタを閉じる。
これで直近の2つのコミットがまとめられて新しい1つのコミットになる。
A---B---C---F
ローカルでの試行錯誤をとりまとめて整理されたコミットになったのでここで push する。
git push
なお squash を使えばできるというヒントは @tokuhirom 氏に教えていただきました。ありがとうございます。
Naney (なにい)です。株式会社ミクシィで SNS 事業の部長をしています。
nDiki は1999年1月に始めたコンピュータ日誌を前身とする Naney の Web 日記(兼パーソナルナレッジベース)です。ちょっとしたノートは nNote にあります。
※内容は個人的見解であり所属組織とは関係ありません。