Git rebaseでコミット履歴を整理する - インタラクティブrebaseの使い方

どうも、Shinyaです。この記事では、Gitのrebaseコマンドを使ってコミット履歴を整理する方法について解説します。特に、プルリクエストを作成する際に活用できるインタラクティブrebase(git rebase -i)に焦点を当てて説明します。
- Gitのコミット履歴を整理する方法を知りたい人
- プルリクエストのコミット履歴をきれいにしたい人
git rebase -iの使い方を理解したい人- チーム開発でコミット履歴の管理に課題を感じている人
rebaseとは
git rebaseは、コミット履歴の基準点(ベース)を変更・再構成するためのコマンドです。コミット履歴を整理したり、ブランチの起点を変更したりする際に使用します。
普段mainブランチで直接作業するような場合にはあまり使用しませんが、プルリクエストを作成するワークフローでは、マージ前にコミット履歴を整理する目的で活用できます。
rebaseはコミット履歴を書き換える操作です。誤った使い方をするとGitの作業ツリーを破壊する可能性があります。特に、共同開発のブランチでrebaseを行うと、他のメンバーの修正を消してしまうリスクがあります。リモートにプッシュ済みのコミットに対するrebaseは、影響範囲を十分に理解した上で実行する必要があります。
インタラクティブrebaseの活用例
コミット履歴が散らかるケース
開発中、以下のようなコミット履歴になることがあります。
このfeatureブランチのコミット履歴を見ると、本質的な変更である「機能実装」と「テスト追加」に加えて、「typo修正」や「デバッグ用print削除」といった小さな修正コミットが混在しています。このままマージすると、mainブランチのコミット履歴にもこれらの細かいコミットがそのまま残ります。
本来は、コミットの時点で適切な単位にまとめてコミットすることが理想です。しかし、開発中に試行錯誤した結果、細かいコミットが増えてしまうケースは少なくありません。
rebaseでコミットを統合する
git rebase -i(インタラクティブrebase)を使用すると、複数のコミットを1つに統合(squash)できます。
直近4件のコミットを対象にインタラクティブrebaseを開始します。
git rebase -i HEAD~4
エディタが開き、対象のコミット一覧が表示されます。
pick jkl3456 機能実装
pick ghi9012 typo修正
pick def5678 テスト追加
pick abc1234 デバッグ用print削除
各行の先頭にあるpickは、そのコミットをそのまま残すことを意味します。統合したいコミットのpickをsquash(または省略形のs)に変更します。
pick jkl3456 機能実装
squash ghi9012 typo修正
pick def5678 テスト追加
squash abc1234 デバッグ用print削除
squashを指定したコミットは、その直前のpickコミットに統合されます。上記の例では:
- 「typo修正」→「機能実装」に統合
- 「デバッグ用print削除」→「テスト追加」に統合
編集が完了したら、エディタを保存して終了します(Vimの場合は:wq)。続いてコミットメッセージの編集画面が表示されるので、統合後のコミットメッセージを記述して保存します。
rebase後のコミット履歴
rebaseが完了すると、コミット履歴は以下のように整理されます。
4つあったコミットが2つに整理され、プルリクエストをマージした際にmainブランチに残るコミット履歴もきれいな状態になります。
rebase -iで使用できるコマンド
インタラクティブrebaseでは、pickとsquash以外にもいくつかのコマンドが使用できます。
| コマンド | 省略形 | 動作 |
|---|---|---|
pick | p | コミットをそのまま使用する |
reword | r | コミットメッセージを変更する |
edit | e | コミット内容を修正するために一時停止する |
squash | s | 直前のコミットに統合し、メッセージを編集する |
fixup | f | 直前のコミットに統合し、メッセージは破棄する |
drop | d | コミットを削除する |
squashは統合時にコミットメッセージの編集画面が表示されます。fixupは統合先のコミットメッセージをそのまま使用し、統合されるコミットのメッセージは破棄されます。メッセージの変更が不要な場合はfixupが効率的です。
rebaseを中断・取り消す
rebase中に問題が発生した場合、以下のコマンドで操作を中断・取り消すことができます。
git rebase --abort
git reflog
git reset --hard HEAD@{n}
git reflogでrebase前のコミットハッシュを確認し、git reset --hardで戻ることができます。
まとめ
この記事では、git rebase -iを使ってコミット履歴を整理する方法について解説しました。インタラクティブrebaseを活用することで、開発中に増えてしまった細かいコミットを論理的な単位にまとめ、プルリクエストのコミット履歴を整理できます。ただし、rebaseはコミット履歴を書き換える操作であるため、共有ブランチでの使用には注意が必要です。
参考リンク:
