はじめに
Gitで開発を進めていると、細かな修正や一時的な変更が次々とコミットされ、履歴が見づらくなることがあります。そんなときに活用したいのが、複数のコミットを1つにまとめる「squash(スカッシュ)」という機能です。
本記事では、squashの仕組みや活用シーン、注意点をわかりやすく解説しながら、git rebase
を使ったsquashの操作方法を紹介します。Gitの履歴をきれいに保ちたい方や、実務でも通用するGitスキルを身につけたい方におすすめの内容です。
Gitについての基本
Gitは、ファイルの変更履歴を管理するバージョン管理ツールです。個人の作業でもチーム開発でも、「誰が・いつ・何を」変更したのかを記録でき、安心して作業が進められます。
Gitの基本をさらに知りたい方は、以下の記事も参考にしてください。
▼Gitを基礎から学びたい方はこちら
【初心者向け】GitHubとは?必須知識と使い方について解説!
https://envader.plus/article/68
▼Gitコマンド早見表はこちら
必見!現場で役立つGitコマンド29選をまとめて紹介!
https://envader.plus/article/402
▼「エンベーダー」ではGitの基本コマンドを実践で学べます。
エンベーダー公式サイト - Gitの使い方コース
https://envader.plus/course/5/scenario/1055
GitのSquashとは
Gitのsquash(スカッシュ)は、複数のコミットを1つにまとめてGit履歴を整理する操作です。
複数のコミットをまとめることで、履歴を簡潔に整理できるほか、コミットメッセージや内容の見直しも行えます。
コミットをまとめる機能をもつsquashですが、実は git squash
というコマンドがあるわけではありません。squashは、あとで紹介する git rebase
の対話モード(--interactive
)を使って実行します。
Squashを使う場面とメリット
複数のコミットをまとめられるという特性から、squashは以下のような場面で活用され、多くのメリットを得ることができます。
-
開発中の細かい修正を整理したいとき
タイプミスの修正や小さなリファクタリングなど、複数の小さなコミットを1つにまとめることで、履歴がスッキリします。変更内容がまとまっていると、後から見返すときも分かりやすくなります。
-
コードレビューをスムーズにしたいとき
プルリクエストの前に関連するコミットをまとめておくと、レビュアーが意図を把握しやすくなり、レビューが効率的に進みます。
-
チーム開発で履歴を整理したいとき
複数人で開発しているとコミットが細かく分かれがちですが、機能単位でまとめておくと、後からの履歴確認や差分の追跡がしやすくなります。
このように、コミットをまとめることで得られるメリットは、履歴の簡潔化・レビューの効率化・メンテナンス性の向上と多岐にわたります。Squashはただの整理整頓ではなく、プロジェクト全体の開発体験を改善するための重要な手段です。
コラム:squash(スカッシュ)の語源
squashの語源は、英語の動詞「squash(スカッシュ)」です。squashは、野菜の「かぼちゃ」や「ズッキーニ」を潰すという意味の動詞です。squashの操作は、複数のコミットを1つのコミットに「潰す」ことに似ていることから、この名前が付けられたと考えられています。
また、squashは、複数のものを1つにまとめるという意味の「圧縮」や「統合」という意味でも使用されます。この意味でのsquashも、squashの操作と関連しています。
なお、GitのSquashは、英語では「squash merge」または「squash commit」とも呼ばれます。
squashがコミット履歴に与える影響と注意点
Gitでsquashを実行すると、複数のコミットが一つの新しいコミットとして履歴に再構成されます。
たとえば、3つのコミットをsquashすると、まとめられたコミットは履歴上から消え、新しい1コミットとして置き換わります。変更内容は維持されますが、履歴そのものは書き換えられる点に注意が必要です。
squash使用時の注意点
-
履歴の書き換えによる注意点(チーム開発時は特に重要)
すでにリモートにpush済みのコミットに対してsquashすることはおすすめしません。履歴を書き換えたことにより、他のメンバーと履歴に差異が発生し、コンフリクトが発生するなどのトラブルの原因になります。
特にチーム開発では、rebaseやsquashを使う場面を事前に取り決めておくなど、運用ルールの確認と共有が重要です。
-
コミットメッセージの編集が必要
squashを実行すると、まとめられた複数のコミットメッセージがそのまま連結された状態で表示されます。あとから履歴を確認しやすいよう、どんな変更を行ったのか明確なメッセージに編集し直すことが推奨されます。
git rebaseによるSquash使い方
複数のコミットをまとめるsquashの操作は、Gitのrebase機能を使って実行します。
このセクションでは、git rebase -i
を使った基本的な手順をわかりやすく解説します。
▼git rebase
の仕組みについて詳しく知りたい方は、こちらの記事も参考にしてください。
git rebaseとは?コミット履歴を整理する基本から応用まで解説!
https://envader.plus/article/549
1. リベースの開始
まず、リベースしたいコミットの範囲を決定します。コマンドはgit rebase -i HEAD~[N]
を使用します。ここで、[N]
は統合したいコミットの数です。
git rebase -i HEAD~3
このコマンドを実行すると、テキストエディタが開き、リベースするコミットのリストが表示されます。
pick commit_hash_1
squash commit_hash_2
squash commit_hash_3
git rebase
についてはこちらの記事で詳しく解説しています。
https://envader.plus/article/244
2. Squashの選択
コミットの前にpick
と書かれているものをsquash
またはs
に書き換えます。最初のコミットはpick
のままにし、続くコミットをsquash
にします。これにより、pick
されたコミットにsquash
されたコミットが取り込まれます。
pick commit_hash_1
squash commit_hash_2
squash commit_hash_3
3. コミットメッセージの編集
全てのコミットをsquash
に書き換えた後、新しいコミットメッセージを入力します。不要なメッセージは削除またはコメントアウトします。
pick commit_hash_1
squash commit_hash_2
squash commit_hash_3
# 新機能の完全な実装
4. 変更の確定
新しいコミットメッセージを保存し、リベースを完了します。
git rebase --continue
具体的な例
例として、以下のようなコミットがあったとします。
コミットA: 新機能の初期実装
コミットB: 新機能のバグ修正
コミットC: 新機能の改善
これらを1つのコミットにまとめる場合、次のように操作します。
git rebase -i HEAD~3
# 編集
pick commit_hash_1
squash commit_hash_2
squash commit_hash_3
# 新機能の完全な実装
git rebase --continue
注意点
-
安全な環境での実行
Squash操作は履歴を改変するため、誤って重要な情報を失わないように注意が必要です。実験的な変更は、新しいブランチで試すことをお勧めします。
-
共有されたブランチでの使用の注意
他の開発者と共有しているブランチでSquashを行うと、他の開発者の作業に影響を与える可能性があるため、事前にチーム内で確認することが重要です。
Squash後のリモートへの反映
Squash操作後、ローカルのコミット履歴がリモートの最新の履歴と異なるため、通常のgit push
では拒否されることがあります。このような場合、強制プッシュ(git push -f
)を使用して変更をリモートに反映させる必要があります。
強制プッシュの例
# ローカルリポジトリで変更を確認
git log
# 強制プッシュの実行
git push -f origin [ブランチ名]
注意点
強制プッシュによるリモートリポジトリの履歴上書きのリスク
強制プッシュは、リモートリポジトリの履歴を上書きします。他の開発者の作業が含まれる場合、それらの変更を失うリスクがあります。共有されているブランチに強制プッシュを行う前には、チーム内での十分なコミュニケーションと、リモートリポジトリのバックアップの取得が必要です。
コンフリクトの解決
強制プッシュを行った後に、他の開発者がリモートの最新の状態に基づいて作業をしていた場合、コンフリクトが発生する可能性があります。このような場合は、以下のステップで解決します。
# 最新のリモート状態の取得
git pull origin [ブランチ名]
# コンフリクトの手動解決
`git status` でコンフリクトが発生したファイルを確認
`vim [ファイル名]` などでファイルを開き、コンフリクトを解決
# 再度のコミットとプッシュ
git add [ファイル名]
git commit -m "[コミットメッセージ]"
git push origin [ブランチ名]
まとめ
GitのSquash機能は、複数のコミットを1つのコミットにまとめる操作です。この機能は、コミット履歴の整理や、コードレビューの準備、機能の完全な実装の表示など、さまざまな場面で役立ちます。
Squashを行う際には、以下の点に注意が必要です。
強制プッシュ(git push -f
)は、他の開発者の作業を上書きする可能性があるため、共有ブランチでは慎重に行うべきです。Squash操作や強制プッシュによってコンフリクトが発生する可能性があるため、その場合は適切に手動で解決する必要があります。
Squashを理解し、適切に使用することで、Gitを用いたソフトウェア開発の効率性と整理性を向上させることができます。
【番外編】USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話

プログラミング塾に半年通えば、一人前になれると思っているあなた。それ、勘違いですよ。「なぜ間違いなの?」「正しい勉強法とは何なの?」ITを学び始める全ての人に知って欲しい。そう思って書きました。是非読んでみてください。
「フリーランスエンジニア」
近年やっと世間に浸透した言葉だ。ひと昔まえ、終身雇用は当たり前で、大企業に就職することは一種のステータスだった。しかし、そんな時代も終わり「優秀な人材は転職する」ことが当たり前の時代となる。フリーランスエンジニアに高価値が付く現在、ネットを見ると「未経験でも年収400万以上」などと書いてある。これに釣られて、多くの人がフリーランスになろうとITの世界に入ってきている。私もその中の1人だ。数年前、USBも知らない状態からITの世界に没入し、そこから約2年間、毎日勉学を行なった。他人の何十倍も努力した。そして、企業研修やIT塾で数多くの受講生の指導経験も得た。そこで私は、伸びるエンジニアとそうでないエンジニアをたくさん見てきた。そして、稼げるエンジニア、稼げないエンジニアを見てきた。
「成功する人とそうでない人の違いは何か?」
私が出した答えは、「量産型エンジニアか否か」である。今のエンジニア市場には、量産型エンジニアが溢れている!!ここでの量産型エンジニアの定義は以下の通りである。
比較的簡単に学習可能なWebフレームワーク(WordPress, Rails)やPython等の知識はあるが、ITの基本概念を理解していないため、単調な作業しかこなすことができないエンジニアのこと。
多くの人がフリーランスエンジニアを目指す時代に中途半端な知識や技術力でこの世界に飛び込むと返って過酷な労働条件で働くことになる。そこで、エンジニアを目指すあなたがどう学習していくべきかを私の経験を交えて書こうと思った。続きはこちらから、、、、
エンベーダー編集部
エンベーダーは、ITスクールRareTECHのインフラ学習教材として誕生しました。 「遊びながらインフラエンジニアへ」をコンセプトに、インフラへの学習ハードルを下げるツールとして運営されています。

関連記事

2025.09.29
Gitの作業効率化!git stash と git diff の使い方を解説
ここでは表題の`git diff`, `git stash` に加え、`git status`という3つの重要なコマンドをそれぞれの使い方や役割、利点について解説します。
- インフラエンジニア
- git

2025.04.02
エンジニアがLinuxコマンドを習得する理由
この記事では、「エンジニアがLinuxコマンドを習得する理由」について解説しています。その他、「初学者が知っておきたいLinuxの基本」や「Linuxの学習方法」も紹介しているので、初学者はぜひ参考にしてください。
- インフラエンジニア
- Linux

2023.10.01
【BIND高度実践】chroot環境を構築してみよう【後編】
こちらの記事は、chroot環境の構築(ハンズオン)の後編です。
- インフラエンジニア

2025.08.28
【初心者向け】GitHubとは?必須知識と使い方について解説!
「GitHub」とは、Gitの仕組みを使用して開発のソースコードを保存・共有・公開ができるウェブービスです。開発者が自分の作品のソースコード等を公開したり、チーム開発ではメンバー内でコードを確認(レビュー)したりすることができます。各自の環境で開発を行い、コードを共有・履歴を管理できるため、チーム開発に最適で必須のツールです。
- インフラエンジニア
- git