0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【squash/fixup】コミット履歴を整理しよう

0
Posted at

はじめに

業務で 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 するので、安心というわけですね。

最後に

今回まとめたことは頻繁に使う操作ではないかもしれませんが、コミット履歴を整理する場面では役立つ知識だと思います。
チーム全員で快適な開発ライフを送るために、忘れないようにしましょう。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?