コンテンツにスキップ
X

pull vs rebase - ブランチを最新に保つ方法

ブランチで作業中に、main が更新されて自分のブランチが古くなることがあります。そのとき使うのが git pull(プル)と git rebase(リベース)です。どちらもリモートの変更を取り込む手段ですが、履歴の扱い方が異なります。

対象読者: Git を日常的に使っていて、pull と rebase の違いを理解したい方

学習時間の目安: 読了 20分 + 実践 15分

前提知識: ブランチとマージ を理解していること

操作特徴向いている場面
git pull(マージ)履歴をそのまま保持。マージコミットが作成される共有ブランチの更新をそのまま取り込みたいとき
git rebase履歴を直線化。コミットを最新 main の上に再適用自分のローカル専用ブランチを最新化したいとき
main:    A──B──C──────M
                  ↗    ↘
feature:      D──E

マージコミット(M)が作成され、mainfeature 両方の履歴が保持されます。

main:    A──B──C

feature:          D'──E'

feature のコミット(D、E)が main の最新コミット(C)の後に移動(D’、E’)し、履歴が一直線になります。

1. リポジトリをクローンする(初回のみ)

Section titled “1. リポジトリをクローンする(初回のみ)”
git clone https://github.com/someone/repo.git
cd repo
git checkout main
git pull origin main
git checkout my-feature
git rebase main

my-feature ブランチのコミットが、最新の main の後に並べ直されます。

リベース中にコンフリクトが発生した場合の手順です。

  1. コンフリクトが起きたファイルをエディタで開き、<<<<<<< の記号がある箇所を修正する
  2. 修正したファイルをステージングする
git add path/to/file
  1. リベースを続行する
git rebase --continue

中止したい場合は以下で元の状態に戻れます。

git rebase --abort

リベース後のブランチを 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 より安全です。

自分だけが使うブランチ → rebase(履歴がスッキリする)
共有ブランチや main   → pull(マージ)(履歴を壊さない)

⚠️ main や複数人が使うブランチに対して rebase を使うと、他のメンバーの作業履歴を破壊する可能性があります。共有ブランチへの rebase は避けてください。

目的コマンド
main を最新化するgit pull origin main
作業ブランチを main に揃える(マージ)git merge main
作業ブランチを main に揃える(リベース)git rebase main
リベース中のコンフリクト解消後に続行git rebase --continue
リベースを中止git rebase --abort
リベース済みブランチを安全に強制 pushgit push --force-with-lease origin branch
  • rebase: 自分専用ブランチを最新 main に揃えたいとき。履歴が直線化されて見やすくなる。
  • pull(マージ): 共有ブランチの更新を取り込むとき、または履歴をそのまま残したいとき。
  • --force-with-lease: 履歴を書き換えた後の強制 push に使う安全なオプション。単純な -f は避ける。

Q. git pull --rebase というコマンドもありますが、git rebase と何が違いますか?

git pull --rebasegit fetch + git rebase をまとめて行います。リモートの最新コミットを取得して、そこにローカルのコミットを積み直す操作です。効果はほぼ同じですが、git pull --rebase origin main のように一行で書けるため便利です。

Q. rebase をしたら古いコミットが消えましたか?

消えていません。コミットの「ハッシュ値」(ID)は変わりますが、内容は引き継がれます。git log で確認すると、コミットの内容は同じまま新しい位置に移動していることが分かります。

Q. チームで rebase を使う場合のルールはありますか?

一般的なルールは「push 済みのコミットは rebase しない」です。チームで共有するブランチ(maindevelop など)の履歴を書き換えると、他のメンバーの作業に影響が出ます。rebase は自分だけが使うローカルブランチに限定するのが安全です。