CakePHPのCookbook翻訳で、gitの利用方法を以前書きました。
http://d.hatena.ne.jp/cakephper/20120709/1341808861
その時は、本家の最新の状態をrebaseで反映してから自分のリポジトリのブランチにpushするまでの流れを書きました。
その後は、githubのページから自分のブランチのページへ移動して、pullリクエストをcakephp/docsのmasterブランチに投げればマージされるのを待つのみになります。
今回、RESTの章を気が向いた時に少しずつ翻訳しながら進めていました。
https://github.com/cakephp/docs/pull/407
そうすると、毎回作業の終わりにコミットしたくなるのですが、途中経過のファイルをコミットするため、コミットメッセージとかどうしようかなと迷ってました。
いろいろと考えるのが面倒なので、コミットメッセージは適当な文字 1st, 2ndとかにして、最後のpull requestを送る前にrebase -iでコミットを1つにまとめて、そのときにちゃんとしたコミットメッセージにすることにしました。
(注意点としては、その作業ブランチをgithubにpushしないことです。pushすると最後にまとめてしまうコミットと不整合が起こるので)
まずは、自分の作業ブランチに行って、push前に最新の本家masterブランチを取り込んでおき、
下記操作でmasterとの差分コミットを1つのコミットに統合します
git rebase -i master
そうすると、masterには無いこのブランチのコミットが下記のように表示されます
pick d648a70 1st
pick a988cd1 2nd
# Rebase f680aba..a988cd1 onto f680aba
#
# Commands:
# p, pick = use commit
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
pickはコミットを残す、squashは上のコミットに入れてしまう、という意味なので、下記のように2行目のコミットの先頭をpickからsに変えます
pick d648a70 1st
s a988cd1 2nd
そのままエディタを保存終了すると、今度はコミットメッセージの編集画面になるので、ここで正式なコミットメッセージを記述します。
# This is a combination of 2 commits.
# The first commit's message is:
1st
# This is the 2nd commit message:
2nd
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# Not currently on any branch.
# Changes to be committed:
# (use "git reset HEAD ..." to unstage)
#
# new file: ja/development/hoge.txt
#はコミットメッセージから無視されるので、1stと2ndという仮コミットメッセージを消して、
正式なコミットメッセージのみ記載して、エディタを保存終了します。
その後、git log -p などすれば、1コミットにまとまっているのが分かると思います。
参考:「GitHubへpull requestする際のベストプラクティス」 http://d.hatena.ne.jp/hnw/20110528