Gitを利用したチーム開発において、ブランチの統合やコミット履歴の整理で活躍するのが git rebase です。しかし、「履歴が書き換わるから怖い」「merge とどう違うの?」と疑問に思う方も多いでしょう。
本記事では、git rebase の基本的な使い方から、merge との違い、-i(インタラクティブ)オプションによるコミットのまとめ方、コンフリクトの解消手順、そしてチーム開発で絶対にやってはいけない注意点(安全な使い方)までを徹底解説します。
git rebase とは?
git rebase コマンドは、あるブランチの変更を別のブランチの先頭に付け替える(リベースする)ためのコマンドです。主に、作業ブランチの起点(ベース)を最新の状態に進めたり、コミット履歴をきれいに整理したりするために利用されます。
git rebase と git merge の違い
ブランチを統合するコマンドとして merge と rebase がありますが、履歴の残り方に大きな違いがあります。
git merge(履歴をそのまま残す)
merge は、2つのブランチの履歴をそのまま残し、「マージコミット」を作成して合流させます。分岐や合流の事実が正確に記録されるため安全ですが、履歴が複雑(ブランチが入り組んだ状態)になりやすいデメリットがあります。
git rebase(履歴を直線的にする)
rebase は、現在のブランチのコミットを一つずつ取り出し、対象ブランチの最新のコミットの後ろに新しく付け直します。分岐がなかったかのような直線的で綺麗な履歴(コミット履歴の整頓)になる反面、元のコミットIDが書き換わる(別のコミットとして作成される)ため、扱いには注意が必要です。
【重要】git rebase の安全な使い方と絶対のルール
リベースにおける最大のルールは「すでにリモートリポジトリへPushし、他の人と共有しているブランチでは rebase を行わない」ことです。
公開済みのブランチを rebase して履歴を書き換えてしまうと、他の開発者のローカル環境にある履歴との間に矛盾が生じ、重大なトラブルを引き起こします。rebase は、あくまで「自分だけが作業しているローカルの作業ブランチ」に対してのみ行うようにしてください。
基本的な使い方:mainブランチの最新に追従する
作業中の機能ブランチ(feature)に、更新された main ブランチの最新の変更を取り込む場合の基本的な手順です。
git checkout feature
git rebase main
これにより、feature ブランチの起点が main ブランチの最新コミットに移動します。
コンフリクト(競合)発生時の解消法
rebase 中に変更内容が衝突し、コンフリクトが発生した場合は処理が一時停止します。以下の手順で解消します。
- コンフリクトが発生したファイルをエディタで開き、該当箇所を修正します。
- 修正後、
git addで変更をステージングします。(※git commitは不要です)
git add <コンフリクトを修正したファイル> --continueオプションでリベースを再開します。
git rebase --continue
※ もし rebase 自体を取りやめて元の状態に戻したい場合は、git rebase --abort を実行します。
git rebase -i でコミットをまとめる・整理する
-i(インタラクティブ)オプションを使うと、過去の複数のコミットを1つにまとめたり、コミットメッセージを変更したりと、柔軟なコミット履歴の整頓が可能です。Pull Requestを出す前に、「typo修正」などの細かなコミットをまとめる際によく使われます。
# 最新の3つのコミットを整理する
git rebase -i HEAD~3
エディタが起動し、以下のようなコミットの一覧が表示されます。
pick 1a2b3c4 Add new feature
pick 5d6e7f8 Fix typo in README
pick 9z8y7x6 Update configuration
コミットを直前のコミットにまとめるには、先頭の pick を squash(または s)に変更します。
pick 1a2b3c4 Add new feature
squash 5d6e7f8 Fix typo in README
squash 9z8y7x6 Update configuration
保存してエディタを閉じると、新たにコミットメッセージを編集する画面が開くため、まとめた後のメッセージを入力して完了です。
主なオプション一覧
| オプション | 説明 | 使用例 |
|---|---|---|
<ブランチ名> | 指定ブランチに現在のブランチを付け替え | git rebase main |
-i <ブランチ名またはコミット> | インタラクティブリベース(コミット編集・統合・削除) | git rebase -i HEAD~3 |
--onto <新ベース> <開始点> <ブランチ> | 特定の範囲を別のベースに付け替え | git rebase --onto main feature~2 feature |
--continue | コンフリクト解消後にリベースを続行 | git rebase --continue |
--abort | リベースを中止して元の状態に戻す | git rebase --abort |
--skip | 問題のあるコミットをスキップ | git rebase --skip |
まとめ
git rebase は、コミット履歴を綺麗に保ち、プロジェクトの進行状況を見やすくするために欠かせない強力なコマンドです。merge との違いを理解し、共有ブランチでは絶対に使わないというルールを守りながら、日々の開発に役立ててください。

コメント