Rebase は、一連のコミットを新しいベースコミットに移動し、ブランチの履歴を書き換えるGitの操作です。Mergeとは異なり、Rebaseはマージコミットを作成せず、ターゲットブランチの現在の状態の上にコミットを再適用します。git-scm.com、2026年によると、rebaseは58%のGitプロジェクトでクリーンな線形コミット履歴を維持するために使用されています。
主要ポイント
Rebase(リベース)は、現在のブランチから新しいベースポイントにコミットを移動するGit操作です。マージコミットを作成する代わりに、rebaseはソースブランチから各コミットを取得し、新しいベースの上に1つずつ適用します。結果として、分岐のない線形のコミット系列が得られます。
Rebase という名前は「re-base」(ベースを変更する)に由来します。mergeが2つのブランチを1つのポイントで結合するのに対し、rebaseはブランチ全体を新しい場所に実質的に移動し、あたかもターゲットブランチの現在の状態から開発を開始したかのように見せます。これにより、完全に順次的な作業の印象を与えます。
Atlassian、2025年によると、フィーチャーブランチにrebaseを使用するチームは、mergeのみを使用するチームと比較して、コミット履歴の分析に30%少ない時間を費やしています。線形履歴は、git blame、bisect、およびgit log --onelineによるログ表示を簡素化します。
Merge は2つの親を持つコミットを作成してブランチを結合します。Rebase は履歴を書き換えます。変更内容は元のものと同じですが、新しいハッシュで新しいコミットが作成されます。つまり、rebaseはコミットのSHA識別子を変更するため、公開ブランチでは重要です。
Rebaseのメカニズム は4つのステップで構成されます。Gitは現在のブランチとターゲットブランチの共通祖先(マージベース)を特定し、現在のブランチの各コミットをターゲットブランチの上に順次適用します。いずれかのステップで競合が発生すると、rebaseは停止して解決を待ちます。
# 初期状況:featureブランチがdevelopより3コミット遅れている
git checkout feature/new-login
git rebase develop
# Gitはfeatureから3つのコミットを取得し、developの上に適用する
# 競合がなければ — rebaseは自動的に完了する
# 競合があれば — Gitは競合するコミットで停止する
Rebase後、フィーチャーブランチ にはdevelopのすべてのコミットと、developの継続として表示される自身のコミットが含まれます。これにより、マージコミットを作成せずにfast-forwardでdevelopにマージできます。
詳細な例を見てみましょう。開発者がdevelopからフィーチャーブランチを作成し、2つのコミットを行い、その間に他の開発者がdevelopに3つのコミットを追加しました。Rebaseは2つのフィーチャーコミットを新しい位置に移動し、新しいSHAでコピーを作成します。
# 1. featureブランチを作成する
git checkout -b feature/payment-refactor develop
# 2. featureでコミットを行う
git commit -m "refactor: extract payment validation"
git commit -m "refactor: add payment gateway interface"
# 3. developを更新する(同僚の作業)
git checkout develop
git pull
# 4. 新しいdevelopの上にfeatureをリベースする
git checkout feature/payment-refactor
git rebase develop
# 5. これでfeatureをfast-forwardでマージできる
git checkout develop
git merge feature/payment-refactor
ステップ4で競合が発生した場合、Gitは問題のあるコミットで停止します。開発者は競合を解決し、git addを実行してからgit rebase --continueを実行します。コミットをスキップするには — git rebase --skip、rebase全体をキャンセルするには — git rebase --abort。
--emptyフラグ は、空のコミット(コミットのすべての変更がターゲットブランチにすでに存在する状況)に対するrebaseの動作を制御します。デフォルトでは、rebaseは停止して決定を求めます。--empty=dropを使用すると、Gitは停止せずに自動的にそのようなコミットをスキップし、多数のコミットを含む大量リベースを高速化します。
インタラクティブrebase(git rebase -i)は、コミット履歴を編集するための強力なツールです。コミットのリストとキーコマンド(pick(保持)、reword(メッセージ変更)、edit(内容変更)、squash(前のコミットと統合)、fixup(メッセージなしで統合)、drop(削除))を含むエディターが開きます。
# 最後の4つのコミットのインタラクティブrebase
git rebase -i HEAD~4
# エディタにrebase計画が表示されます:
# pick a1b2c3 feat: add login screen
# pick d4e5f6 fix: login validation
# pick g7h8i9 fix: login layout
# pick j0k1l2 docs: add login comments
# 次のように変更:
# pick a1b2c3 feat: add login screen
# squash d4e5f6 fix: login validation
# squash g7h8i9 fix: login layout
# drop j0k1l2 docs: add login comments
結果:3つのコミット(ログイン画面、バリデーション、レイアウト)が1つに統合され、コメントのあるコミットは削除されます。これにより、ドラフトや修正なしで、コードレビュー用のクリーンな履歴を提出できます。インタラクティブrebaseは、Pull Requestの前にフィーチャーブランチを準備するための標準ツールです。
RebaseとMerge は同じ問題 — 変更の統合 — を解決しますが、根本的に異なる方法で行います。どちらを選ぶかは、git logでどのような履歴を見たいか、そして誰があなたのブランチで作業しているかによって異なります。
| 基準 | Merge | Rebase |
|---|---|---|
| 履歴 | 分岐を保持 | 線形、ブランチなし |
| マージコミット | 作成される(ff除く) | 作成されない |
| コミットSHA | 変更なし | 新しく作成される |
| 安全性 | 公開ブランチに安全 | 危険 — 履歴を書き換える |
| ログの可読性 | 分岐グラフ | 直線 |
| git bisect | 便利 — マージポイントが可視 | 便利 — 線形シーケンス |
実用的なルール:共有ブランチ(develop、main)への統合にはmergeを使用し、個人のフィーチャーブランチを最新状態にするにはrebaseを使用します。多くのチームは両方を組み合わせています。developにフィーチャーをrebaseし、その後developに--no-ff mergeします。
Git bisect は、リグレッションを導入したコミットを見つけるためのツールです。mergeを使用する場合、git bisectは両方の親を考慮してマージコミットを正しく通過します。Rebaseを使用すると、履歴が線形で分岐を必要としないため、bisectはより速く動作します。ただし、コミットがチームに知られるようになった後にrebaseが行われた場合、元のSHAは失われ、bisectが問題のコミットを見つけられない可能性があります。
Rebase は3つのシナリオで最適です:Pull Request用のフィーチャーブランチの準備、main/developの現在の状態への個人ブランチの更新、マージ前の履歴のクリーンアップ。それぞれの場合において、rebaseはチームワークにリスクを与えることなく履歴の可読性を向上させます。
Pull Request の前に、ドラフトコミット(WIP、レビュー後の修正)を意味のある論理単位に結合するためにインタラクティブrebaseを実行することをお勧めします。これによりコードレビューが容易になります。レビュアーは15の小さなコミットではなく、明確なメッセージを持つ3〜5の構造化された変更を確認できます。
フィーチャーブランチの更新 には、不要なマージコミットを作成しないため、mergeよりもrebaseが推奨されます。フィーチャーブランチ内で定期的にgit rebase developを実行すると、最終的なマージに10個のマージコミットのカスケードは発生せず、developの上にクリーンなフィーチャーコミットのみが残ります。
マージ前のインタラクティブrebaseによる履歴のクリーンアップ により、軽微な修正(タイプミス、フォーマット)を隠し、機能ごとにコミットをグループ化できます。GitメッセージはConventional Commits規約(fix:、feat:、refactor:、docs:)に従うべきで、これにより自動的にchangelogが生成されます。
Rebase は、誤って適用すると危険な操作です。主なリスクは、公開された履歴を書き換えることです。開発者が他の人がすでにプッシュして使用しているブランチをrebaseすると、それらのローカルコピーが同期しなくなり、データ損失のリスクを伴うforce-pullを実行する必要が生じます。
リスクを最小限に抑える ために、次のルールに従ってください。公開されていない個人ブランチにのみrebaseを使用します。ブランチがすでに共有リポジトリにある場合は、--no-ff付きのmergeを使用します。公開されたブランチをrebaseする必要がある場合は、チームに事前に警告し、force pushを調整してください。
危険なrebaseに対する自動保護 は、サーバーサイドフックを通じて実装されます。Gitサーバーのpre-receiveフックは、プッシュが公開されたコミットを書き換えるかどうかをチェックできます。GitHubとGitLabは保護されたブランチの組み込み保護を提供しており、管理者が保護を解除しない限り、force pushはブロックされます。
よくある質問
ブランチの履歴 が変わります — コミットSHAが異なります。このブランチをすでにプッシュした人や、そこから子ブランチを作成した人は、git pull時に競合が発生します。復旧には手動介入が必要で、コミットが失われる可能性があります。
完了前 — git rebase --abort。完了後 — rebaseが最近行われた場合、git reflogを通じてのみ可能です。reflogはHEADの移動履歴を保存しており、それによってrebase前の状態に戻ることができます:git reset --hard HEAD@{1}。
Rebase は一連のコミットを新しいベースに移動します。Cherry-pick は1つ以上の特定のコミットを現在のブランチに適用します。Rebaseはチェーン全体に対して自動的ですが、cherry-pickは各コミットを手動で選択する必要があります。
推奨されますが、必須ではありません。PR前のrebaseは、ブランチをmain/developの現在の状態に更新し、履歴をクリーンにします。ブランチが最近作成され、更新の必要がない場合は、コミットのクリーンアップのためのインタラクティブrebaseで十分です。
タグはrebase中に移動しません。Rebaseされたコミットにタグがあった場合、そのタグは古いコミットに残り、ブランチ履歴の一部ではなくなります。フィーチャーブランチのコミットにはタグを付けず、mainにのみタグを付けることをお勧めします。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。