☝️

プッシュ済みのコミットを1つにまとめる

に公開

はじめに

コミットがまばらになると、レビュアーがレビューしづらくなります。
その他にも、例えばプログラム追加の際に気になったインデントのズレをまとめて修正しコミットしてしまったため、レビュアーから「この差分は何?」と突っ込まれ、再度余分な修正をなくしたコミットを追加したことで、無駄なコミットが増えて1プルリクエスト内のコミットが無駄に増えてしまいます。
(これ、今回の私のミス)
そんな時は、コミットを一つにまとめましょう。
(これが推奨される方法かは知りません)

手順

まずは、以下のコマンドでコミット履歴を確認しましょう。

git log --oneline

以下のように表示されます。

456def (HEAD -> feature/XXX, origin/feature/add-XXX) コミットメッセージ2
123abc コミットメッセージ1

今回はコミットメッセージ1と2のコミットを一つにまとめます。
以下を実行します。

git rebase -i HEAD~2

git rebase -iはインタラクティブ・リベースと言い、過去のコミットを選択して編集やら削除やらできるモードです。HEAD~2で直近2コミットを対象にします。
これを実行するとVimやnanoエディタが開かれ、以下のように表示されます。

pick 123abc コミットメッセージ1
pick 456def コミットメッセージ2

これを以下のように書き換えます。

pick 123abc コミットメッセージ1
squash 456def コミットメッセージ2

123abcコミットをベースに、456defコミットをまとめる(squash)指定になります。
これで編集完了です。保存し、コミットメッセージを編集し、以下のコマンドでプッシュしましょう。

git push --force

--forceは強制プッシュで、履歴を上書きします。共有リポジトリの場合は注意が必要です。

おわりに

今回の私の反省は「気まぐれのインデント修正も含めてコミットしてしまった」ことです。
プログラム追加時に合わせてインデントを同じコミットに含めるのはやめましょう。
「そんなの当たり前だ」と怒られそうな気がしますが...。
(そもそも、インデントの修正は別ブランチでまとめて実施するべき?)

Discussion