Git: コミットをまとめる(Squash)
最終更新
Squash は複数のコミットを 1 つにまとめる操作で、"wip"、"タイポ修正"、"今度こそ修正" のような雑然としたコミットの連なりを、1 つのきれいなコミットにできます。よく使うツールはインタラクティブ rebase - git rebase -i - で、まとめたいコミットに印を付けます。squash は履歴を書き換えるので、push する前か、自分だけが作業しているブランチで行いましょう。
これらをターミナルプレイグラウンドで試してみてください - ブラウザ上で動く本物のシェルで、インストールは不要です。
構文
| Command | What it does |
|---|---|
git rebase -i HEAD~3 | 直近 3 件のコミットをインタラクティブに rebase する |
git rebase -i main | main 以降のすべてのコミットを rebase する |
git merge --squash feature | マージ時にブランチのコミットを 1 つにまとめる |
git reset --soft HEAD~3 && git commit | rebase を使わずに直近 3 件のコミットをまとめる |
インタラクティブ rebase のコマンド
開いたエディタで pick を次のいずれかに変更します。
| Keyword | What it does |
|---|---|
pick | コミットをそのまま残す |
squash (s) | 前のコミットにまとめ、メッセージを結合する |
fixup (f) | まとめるが、このコミットのメッセージは破棄する |
reword (r) | コミットは残すが、メッセージを編集する |
実例
push する前に、直近 3 件のコミットを 1 つにまとめます。
| Step | Action | Result |
|---|---|---|
| 1 | git rebase -i HEAD~3 | 直近 3 件のコミットをエディタで開く |
| 2 | 2 番目と 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 と履歴の整理を段階的に扱っています。