Git Squash: 複数のコミットを1つにまとめる
interactive rebase を使って複数の git コミットを1つのクリーンなコミットにまとめる方法を解説。プルリクエストの履歴をきれいに保つテクニックです。
git rebase -i HEAD~3詳細な説明
コミットの Squash とは?
squash(スカッシュ)は複数のコミットを1つのコミットにまとめることです。通常、feature ブランチを merge する前に main ブランチの履歴をクリーンで読みやすく保つために行います。
方法1: Interactive Rebase
# 直近3つのコミットを squash する
git rebase -i HEAD~3
エディタが開き、以下のような内容が表示されます:
pick a1b2c3d Add login form
pick f4e5d6a Fix typo in login
pick 7g8h9i0 Add validation to login
まとめたいコミットの pick を squash(または s)に変更します:
pick a1b2c3d Add login form
squash f4e5d6a Fix typo in login
squash 7g8h9i0 Add validation to login
保存して閉じると、Git が結合されたコミットメッセージを書くための新しいエディタウィンドウを開きます。
方法2: Soft Reset
# 3つ前のコミットにリセットし、すべての変更をステージ済みのまま保持
git reset --soft HEAD~3
# 1つの新しいコミットを作成
git commit -m "Add login form with validation"
こちらの方がシンプルですが、結果のメッセージに対する制御は少なくなります。
方法3: Squash Merge
git checkout main
git merge --squash feature-branch
git commit -m "Add login feature"
feature-branch のすべてのコミットを取得し、main 上で単一の変更セットとしてステージします。
Squash すべきとき
- PR を merge する前 — 「WIP」「typo 修正」「レビューコメント対応」を意味のあるコミットにまとめる。
- 試行錯誤の後 — コミット履歴が論理的なステップではなく試行錯誤を反映している場合。
Squash すべきでないとき
各コミットが意味のあるアトミックな変更を表している場合は、そのまま分けておきましょう。よく構造化されたコミット履歴は、巨大な1つのコミットよりも価値があります。
ユースケース
開発者の feature ブランチに WIP や typo 修正を含む15個のコミットがあり、merge 前に squash して機能を明確に説明する2つの論理的なコミットにまとめる場面で使用します。