はじめに
業務で git を使用する際、コミットログの整理で git rebase -i で squash や fixup を使用するのですが、
なんか定期的に使い方を調べている気がするので、自分でもまとめてみようと思います。
備忘録的なノリなので、間違いあればご指摘いただけますと幸いです。
まずは squash の場合
ここでは、3度コミットを行ったことを想定しましょう。
rebase でコミットログを確認します。
$ git rebase -i HEAD~3
pick bba2136 1回目のコミット
pick 0eb1f81 2回目のコミット
pick ad4ef06 3回目のコミット
ここで squash を使用してコミット履歴1つにまとめてみます。
$ git rebase -i HEAD~3
pick bba2136 1回目のコミット
squash 0eb1f81 2回目のコミット
squash ad4ef06 3回目のコミット
そしてコミットメッセージを編集します。
# This is a combination of 3 commits.
# This is the commit message #3:
1つのコミットにまとめる
ログを確認してみましょう。
$ git log
commit ea2e814422a5858cf1eefa7d651bb12cddfc60f4 (HEAD -> feature/aaa)
Author: ramen tarou
Date: Fri Jun 5 23:59:10 2026 +0900
1つのコミットにまとめる
これでコミットログがまとめられたことを確認できました。
squash の本質は、複数のコミットを1つにまとめることにあります。
続いて fixup の場合
続いて fixup の場合。
ここでも squash の時同様、3度コミットを行ったことを想定しましょう。
$ git rebase -i HEAD~3
pick bba2136 1回目のコミット
pick 0eb1f81 2回目のコミット
pick ad4ef06 3回目のコミット
ここで fixup を使用してコミットログをまとめてみます。
$ git rebase -i HEAD~3
pick bba2136 1回目のコミット
fixup 0eb1f81 2回目のコミット
fixup ad4ef06 3回目のコミット
すると、squash の場合と異なり、コミットメッセージを編集するためのエディタは表示されません。
$ git log
commit abd13670a3272801c657c56aeb99b757e2f43dd7 (HEAD -> feature/bbb)
Author: ramen tarou
Date: Sat Jun 6 00:11:17 2026 +0900
1回目のコミット
2回目のコミットと3回目のコミットというメッセージが落ちて、pick した1回目のコミットというメッセージのみが残っていることが確認できます。
fixup の本質は、変更内容だけ前のコミットに吸収し、コミットメッセージは捨てることにあります。
コミット自体を削除するわけではなく、変更内容は残したままコミットメッセージのみ破棄されます。
ざっくりまとめ
| コマンド | 変更内容 | コミットメッセージ |
|---|---|---|
| squash | 統合する | 編集できる |
| fixup | 統合する | 先頭のコミットメッセージだけ残す |
(補足)既にリモートに push していた場合
git rebase -i を実行すると、コミットIDが変更されるため、既にリモートへ push 済である場合、下記のように通常のpush が失敗します。
$ git push origin feature/bbb
! [rejected] feature/bbb -> feature/bbb (non-fast-forward)
そのため、rebase で履歴を書き換えた場合は、git push --force-with-lease origin <branch-name>を実行してリモートブランチを更新する必要があります。
1度も push していないローカルコミットに対する rebase であればそのまま push でOKです。
ちなみに、--force-with-leaseではなく--forceを用いた push もあるのですが、--forceはリモートブランチの履歴を強制的に上書きします。
そのため、他の開発者が push した変更を誤って消してしまう可能性があります。
まとめると、--force-with-leaseは、自分が最後に取得した状態からリモートが更新されていないことを確認してから強制 push するので、安心というわけですね。
最後に
今回まとめたことは頻繁に使う操作ではないかもしれませんが、コミット履歴を整理する場面では役立つ知識だと思います。
チーム全員で快適な開発ライフを送るために、忘れないようにしましょう。