スカッシュマージとは何か?
スカッシュマージは、マージ時にブランチ上のすべてのコミットを単一のコミットに畳み込み、メインブランチに変更ごとに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を簡単にします。
関連ガイド
What Is a Git Merge?What is a Git merge? An explainer on how merging combines branches, fast-forward versus merge commits, confli…
What Is a Fast-Forward Merge?What is a fast-forward merge? An explainer on how Git simply moves a pointer when no divergence exists, the l…
What Is a Conventional Commit?What is a conventional commit? An explainer on the structured commit message format, its type and scope prefi…