Skip to content
Latchkey

スカッシュマージとは何か?

スカッシュマージは、マージ時にブランチ上のすべてのコミットを単一のコミットに畳み込み、メインブランチに変更ごとに1コミットという整った履歴を与えます。

スカッシュマージは、メインブランチをクリーンに保つ方法です。フィーチャーブランチのごちゃごちゃした作業途中のコミットをすべて取り込む代わりに、マージ時にそれらを1つのコミットにまとめます。ブランチの詳細な履歴は消え、うまく説明された単一の変更に置き換わります。

What squashing does

スカッシュしてマージすると、Gitはブランチ上のすべての変更を取り、ターゲットブランチ上に1つの新しいコミットとして記録します。ブランチの個々のコミットは引き継がれず、それらを合わせた効果だけが、通常マージ時に書く単一のメッセージのもとで記録されます。

Squash merging a pull request

ほとんどのプラットフォームはスカッシュをマージオプションとして提供しています。CLIからは、マージ前にスカッシュできます。

Squashing a branch into one commit
git switch main
git merge --squash feature/cleanup
git commit -m "Add cleanup utility"

The tradeoffs

スカッシュはmainに、意味のある変更のクリーンで線形な履歴を与え、スキャンやbisectがしやすくなります。その代償として、ブランチのきめ細かなコミット履歴を失います。これは、その中間ステップが価値あるものだった場合に問題になり得ます。ほとんどのチームにとって、この整然さは価値があります。

Squash merges and CI/CD

フィーチャーごとに1コミットのクリーンな履歴は、CIの失敗を単一の自己完結した変更までbisectで絞り込み、必要ならクリーンにrevertするのを容易にします。各マージが1コミットなので、パイプライン実行やデプロイを、それが出荷した変更へマッピングするのがよりシンプルで曖昧さが少なくなります。

When to squash

  • ブランチの履歴がノイジーなとき、mainを読みやすく保つためにスカッシュします。
  • 変更全体を要約する明確な最終メッセージを書きます。
  • 小さく単一目的のプルリクエストにはスカッシュを優先します。
  • 中間コミットに本当の価値があるときは避けます。

重要なポイント

  • スカッシュマージは、ブランチをターゲット上の1つのコミットに畳み込みます。
  • mainをクリーンに保ちますが、ブランチの詳細な履歴は破棄します。
  • 変更ごとに1コミットの履歴は、CIでのbisectやrevertを簡単にします。

関連ガイド