Menu
Coddy logo textTech

Git: コミットをまとめる(Squash)

最終更新

Squash は複数のコミットを 1 つにまとめる操作で、"wip"、"タイポ修正"、"今度こそ修正" のような雑然としたコミットの連なりを、1 つのきれいなコミットにできます。よく使うツールはインタラクティブ rebase - git rebase -i - で、まとめたいコミットに印を付けます。squash は履歴を書き換えるので、push する前か、自分だけが作業しているブランチで行いましょう。

これらをターミナルプレイグラウンドで試してみてください - ブラウザ上で動く本物のシェルで、インストールは不要です。

スカッシュは、細かいコミットの連なりをインタラクティブリベースで 1 つのきれいなコミットにまとめます。

構文

CommandWhat it does
git rebase -i HEAD~3直近 3 件のコミットをインタラクティブに rebase する
git rebase -i mainmain 以降のすべてのコミットを rebase する
git merge --squash featureマージ時にブランチのコミットを 1 つにまとめる
git reset --soft HEAD~3 && git commitrebase を使わずに直近 3 件のコミットをまとめる

インタラクティブ rebase のコマンド

開いたエディタで pick を次のいずれかに変更します。

KeywordWhat it does
pickコミットをそのまま残す
squash (s)前のコミットにまとめ、メッセージを結合する
fixup (f)まとめるが、このコミットのメッセージは破棄する
reword (r)コミットは残すが、メッセージを編集する

実例

push する前に、直近 3 件のコミットを 1 つにまとめます。

StepActionResult
1git rebase -i HEAD~3直近 3 件のコミットをエディタで開く
22 番目と 3 番目のコミットを squash に設定する最初のコミットにまとめる印を付ける
3保存して結合後のメッセージを編集する3 件のコミットが 1 つのきれいなコミットになる

Git コミットまとめ(squash)に関するよくある質問

Git で直近 N 件のコミットをまとめるには?
git rebase -i HEAD~N を実行します(例えば直近 3 件なら HEAD~3)。エディタで最初のコミットは pick のまま残し、残りを squash に変更します(メッセージを破棄したい場合は fixup)。保存して結合後のコミットメッセージを編集すると、コミットが 1 つにまとまります。
squash と fixup の違いは?
どちらもコミットを 1 つ前のコミットにまとめます。squash はコミットのメッセージを残し、エディタで他のメッセージと結合できます。fixup はコミットのメッセージを完全に破棄し、前のコミットのメッセージだけを残します - 最終メッセージに含めたくない "おっと、小さな修正" のコミットに便利です。
マージ時にブランチ全体をまとめるには?
git merge --squash feature を使い、続けて git commit します。これはブランチのすべての変更をステージ済みの変更として適用し、ブランチの個々のコミットを取り込まずに、対象ブランチ上で 1 つのコミットとして記録できます。GitHub の "Squash and merge" ボタンも同じことを行います。
インタラクティブ rebase を使わずにまとめられますか?
はい。git reset --soft HEAD~N はブランチを N 件分戻しつつ、それらの変更をすべてステージ済みのまま保持し、その後 1 回の git commit で 1 つのコミットとして記録します。rebase エディタを開かずに直近のコミットをまとめる手早い方法です。
オンラインで練習できますか?
はい。ターミナルプレイグラウンドを開けば、ブラウザ上の本物のシェルでインタラクティブ rebase を実行できます - インストールは不要です。Coddy の無料のインタラクティブ Git コースでも、rebase と履歴の整理を段階的に扱っています。
Coddy programming languages illustration

Coddy で Git を学ぼう

始める