メインコンテンツまでスキップ

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

公開読了約6分

この記事では、Gitのrebaseコマンドを使ってコミット履歴を整理する方法について解説します。特に、プルリクエストを作成する際に活用できるインタラクティブrebase(git rebase -i)に焦点を当てて説明します。

この記事はこんな人にオススメ
  • Gitのコミット履歴を整理する方法を知りたい人
  • プルリクエストのコミット履歴をきれいにしたい人
  • git rebase -iの使い方を理解したい人
  • チーム開発でコミット履歴の管理に課題を感じている人

rebaseとは

git rebaseは、コミット履歴の基準点(ベース)を変更・再構成するためのコマンドです。コミット履歴を整理したり、ブランチの起点を変更したりする際に使用します。

普段mainブランチで直接作業するような場合にはあまり使用しませんが、プルリクエストを作成するワークフローでは、マージ前にコミット履歴を整理する目的で活用できます。

rebaseの注意点

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は、そのコミットをそのまま残すことを意味します。統合したいコミットのpicksquash(または省略形のs)に変更します。

squashに変更
pick jkl3456 機能実装
squash ghi9012 typo修正
pick def5678 テスト追加
squash abc1234 デバッグ用print削除
squashの動作

squashを指定したコミットは、その直前のpickコミットに統合されます。上記の例では:

  • 「typo修正」→「機能実装」に統合
  • 「デバッグ用print削除」→「テスト追加」に統合

編集が完了したら、エディタを保存して終了します(Vimの場合は:wq)。続いてコミットメッセージの編集画面が表示されるので、統合後のコミットメッセージを記述して保存します。

rebase後のコミット履歴

rebaseが完了すると、コミット履歴は以下のように整理されます。

4つあったコミットが2つに整理され、プルリクエストをマージした際にmainブランチに残るコミット履歴もきれいな状態になります。

rebase -iで使用できるコマンド

インタラクティブrebaseでは、picksquash以外にもいくつかのコマンドが使用できます。

コマンド省略形動作
pickpコミットをそのまま使用する
rewordrコミットメッセージを変更する
editeコミット内容を修正するために一時停止する
squashs直前のコミットに統合し、メッセージを編集する
fixupf直前のコミットに統合し、メッセージは破棄する
dropdコミットを削除する

参考: git-rebase - Git公式ドキュメント

squashとfixupの使い分け

squashは統合時にコミットメッセージの編集画面が表示されます。fixupは統合先のコミットメッセージをそのまま使用し、統合されるコミットのメッセージは破棄されます。メッセージの変更が不要な場合はfixupが効率的です。

rebaseを中断・取り消す

rebase中に問題が発生した場合、以下のコマンドで操作を中断・取り消すことができます。

rebaseを中断する(rebase開始前の状態に戻る)
git rebase --abort
rebase完了後に取り消す(直前の操作を元に戻す)
git reflog
git reset --hard HEAD@{n}

git reflogでrebase前のコミットハッシュを確認し、git reset --hardで戻ることができます。

まとめ

この記事では、git rebase -iを使ってコミット履歴を整理する方法について解説しました。インタラクティブrebaseを活用することで、開発中に増えてしまった細かいコミットを論理的な単位にまとめ、プルリクエストのコミット履歴を整理できます。ただし、rebaseはコミット履歴を書き換える操作であるため、共有ブランチでの使用には注意が必要です。


参考リンク: