pull vs rebase - ブランチを最新に保つ方法
ブランチで作業中に、main が更新されて自分のブランチが古くなることがあります。そのとき使うのが git pull(プル)と git rebase(リベース)です。どちらもリモートの変更を取り込む手段ですが、履歴の扱い方が異なります。
対象読者: Git を日常的に使っていて、pull と rebase の違いを理解したい方
学習時間の目安: 読了 20分 + 実践 15分
前提知識: ブランチとマージ を理解していること
pull(マージ)と rebase の違い
Section titled “pull(マージ)と rebase の違い”| 操作 | 特徴 | 向いている場面 |
|---|---|---|
git pull(マージ) | 履歴をそのまま保持。マージコミットが作成される | 共有ブランチの更新をそのまま取り込みたいとき |
git rebase | 履歴を直線化。コミットを最新 main の上に再適用 | 自分のローカル専用ブランチを最新化したいとき |
pull(マージ)の履歴イメージ
Section titled “pull(マージ)の履歴イメージ”main: A──B──C──────M
↗ ↘
feature: D──Eマージコミット(M)が作成され、main と feature 両方の履歴が保持されます。
rebase の履歴イメージ
Section titled “rebase の履歴イメージ”main: A──B──C
↘
feature: D'──E'feature のコミット(D、E)が main の最新コミット(C)の後に移動(D’、E’)し、履歴が一直線になります。
ステップバイステップ手順
Section titled “ステップバイステップ手順”1. リポジトリをクローンする(初回のみ)
Section titled “1. リポジトリをクローンする(初回のみ)”git clone https://github.com/someone/repo.git
cd repo2. ローカル main を最新化する
Section titled “2. ローカル main を最新化する”git checkout main
git pull origin main3. 作業ブランチへのリベース
Section titled “3. 作業ブランチへのリベース”git checkout my-feature
git rebase mainmy-feature ブランチのコミットが、最新の main の後に並べ直されます。
4. コンフリクトの解消
Section titled “4. コンフリクトの解消”リベース中にコンフリクトが発生した場合の手順です。
- コンフリクトが起きたファイルをエディタで開き、
<<<<<<<の記号がある箇所を修正する - 修正したファイルをステージングする
git add path/to/file- リベースを続行する
git rebase --continue中止したい場合は以下で元の状態に戻れます。
git rebase --abort5. push する
Section titled “5. push する”リベース後のブランチを push します。
git push -u origin my-feature⚠️ リベースは履歴を書き換えます。すでに push 済みのブランチをリベースした場合、通常の
git pushでは拒否されます。自分だけが使うブランチであれば--force-with-leaseを使います。
git push --force-with-lease origin my-feature--force-with-lease は、他の人がリモートブランチに push していた場合にエラーを出す安全な強制プッシュです。単純な -f より安全です。
どちらを使うべきか
Section titled “どちらを使うべきか”自分だけが使うブランチ → rebase(履歴がスッキリする)
共有ブランチや main → pull(マージ)(履歴を壊さない)⚠️
mainや複数人が使うブランチに対してrebaseを使うと、他のメンバーの作業履歴を破壊する可能性があります。共有ブランチへの rebase は避けてください。
pull と rebase コマンドの対応表
Section titled “pull と rebase コマンドの対応表”| 目的 | コマンド |
|---|---|
| main を最新化する | git pull origin main |
| 作業ブランチを main に揃える(マージ) | git merge main |
| 作業ブランチを main に揃える(リベース) | git rebase main |
| リベース中のコンフリクト解消後に続行 | git rebase --continue |
| リベースを中止 | git rebase --abort |
| リベース済みブランチを安全に強制 push | git push --force-with-lease origin branch |
- rebase: 自分専用ブランチを最新 main に揃えたいとき。履歴が直線化されて見やすくなる。
- pull(マージ): 共有ブランチの更新を取り込むとき、または履歴をそのまま残したいとき。
--force-with-lease: 履歴を書き換えた後の強制 push に使う安全なオプション。単純な-fは避ける。
Q. git pull --rebase というコマンドもありますが、git rebase と何が違いますか?
git pull --rebase は git fetch + git rebase をまとめて行います。リモートの最新コミットを取得して、そこにローカルのコミットを積み直す操作です。効果はほぼ同じですが、git pull --rebase origin main のように一行で書けるため便利です。
Q. rebase をしたら古いコミットが消えましたか?
消えていません。コミットの「ハッシュ値」(ID)は変わりますが、内容は引き継がれます。git log で確認すると、コミットの内容は同じまま新しい位置に移動していることが分かります。
Q. チームで rebase を使う場合のルールはありますか?
一般的なルールは「push 済みのコミットは rebase しない」です。チームで共有するブランチ(main、develop など)の履歴を書き換えると、他のメンバーの作業に影響が出ます。rebase は自分だけが使うローカルブランチに限定するのが安全です。