第16回: squash mergeの基本 — 細かい作業履歴を「意味のある1件」にまとめて取り込む

章: 第5章: 変更履歴を実務で整える

作業中のコミット数と、本流に残したい履歴数は同じとは限らない

実務では、作業中に細かくコミットを積むことがあります。

  • 途中保存のコミット
  • レビュー指摘への小さな修正
  • 一時的な調整コミット

これは作業中としては自然です。しかし、そのまま本流へ全部並べると、あとから履歴を読む人には少しノイズになります。

そこで使われるのが squash merge です。

squash merge は、複数のコミットを1つにまとめた形で本流へ取り込む方法です。

なぜ使うのか

プルリクエストの中では10コミットあったとしても、「本質的にはログインバリデーション追加」という1テーマなら、本流には1件として残したいことがあります。

そうすると履歴がかなり読みやすくなります。

つまり squash merge は、作業中の細かい履歴と、本流に残したい履歴を分けて考えるための方法です。

どういう場面に向いているか

  • 1つのプルリクエストが1つの目的にきれいにまとまっているとき
  • レビュー修正コミットが多く、本流へは要点だけ残したいとき
  • 本流の履歴をできるだけ簡潔に保ちたいとき

たとえば次のようなコミットが並んでいたとしても、

  • feat: ログイン時の入力チェック追加
  • fix: レビュー指摘で命名修正
  • fix: テストケース追加

本流では「ログイン時の入力チェック追加」として1件にまとめた方が読みやすい場合があります。

通常の merge との違い

取り込み方 本流にどう残るか
通常の merge ブランチ上のコミットがそのまま残りやすい
squash merge まとめられた1コミットとして残る

ここで大事なのは、squash merge は「作業履歴を消す」というより、「本流に残す単位を整える」ことだと理解することです。

実務での考え方

チームによっては「PRは squash merge で統一」という運用も珍しくありません。

理由は単純で、

  • main の履歴が読みやすい
  • 1PR = 1コミットで意味が追いやすい
  • レビュー修正の細かいノイズを本流へ残しすぎない

という利点があるからです。

ただし、細かな途中経過まで本流に残したい場合は通常 merge の方が向くこともあります。ここも運用次第です。

チェックポイント: squash merge は「コミットを減らす技術」ではなく、「本流に残す意味の単位を整える技術」と考えましょう。

まとめ & 次のステップ

  • squash merge は複数コミットを1つにまとめて取り込む方法
  • 作業中の履歴と本流に残したい履歴を分けて考えられる
  • PR単位で履歴を簡潔に保ちたいときに向いている
  • 本流の可読性を重視するチームでよく使われる
  • merge 方法はチーム方針と履歴の残し方で選ぶ

次回は revert を扱います。 実務で「変更を取り消したい」ときに、なぜ reset ではなく revert が選ばれることが多いのかを整理します。

Related Articles