git rebase と git merge の違い

どちらもブランチの変更をまとめる。履歴を残すなら merge、一本にそろえるなら rebase。

実行前の状態

main が進んだあとで、手元の作業ブランチに main の最新を取り込みたい場面です。同じ状態から、merge と rebase の両方を試して、履歴の形を比べます。

この状態を手元で作るなら、次の順に打ちます。by-merge と by-rebase は、同じ位置から出した 2 本のブランチです。

ターミナル

git init -q -b main hello
cd hello
echo "# hello" > README.md
git add README.md
git commit -q -m "README を作る"
git switch -q -c by-merge
echo "print('hi')" > app.py
git add app.py
git commit -q -m "app.py を足す"
git branch by-rebase
git switch -q main
echo "start" >> README.md
git commit -q -a -m "README に説明を足す"

最小の例と結果

by-merge には merge、by-rebase には rebase で、main の最新を取り込みます。

ターミナル

git switch -q by-merge
git merge --no-edit main
Merge made by the 'ort' strategy.
 README.md | 1 +
 1 file changed, 1 insertion(+)

ターミナル

git switch -q by-rebase
git rebase main
Successfully rebased and updated refs/heads/by-rebase.

成功の確認

2 本の履歴を図にして並べます。merge は 2 つの流れが合流し、rebase は 1 本につながります。

ターミナル

git log --oneline --graph by-merge
*   a1b2c3d Merge branch 'main' into by-merge
|\  
| * 9f8e7d6 README に説明を足す
* | 3c4d5e6 app.py を足す
|/  
* 1b2c3d4 README を作る

ターミナル

git log --oneline --graph by-rebase
* 5e6f7a8 app.py を足す
* 9f8e7d6 README に説明を足す
* 1b2c3d4 README を作る

rebase のほうは、app.py を足す の番号が変わっています。付け替えたコミットは、作り直されるためです。

比べる表

観点mergerebase
履歴の形分かれて合流した跡が残る1 本にそろう
元のコミットそのまま残る作り直されて番号が変わる
push 済みのブランチ使える使わない
衝突を直す回数1 回コミットごとに起きうる
取り消し打ち消すコミットを足すreflog で戻る

使い分け

まだ push していない自分のブランチを、main の最新に合わせるとき

rebase を選ぶと、履歴が 1 本になって読みやすくなります。

push 済みのブランチ、ほかの人と共有しているブランチ

merge を選びます。rebase はコミットの番号を変えるので、相手の手元の履歴と食い違い、通常の push は弾かれます。強制 push で通すと、相手のコミットが消えます。

main への取り込み

チームが決めた方法に従います。迷うときは merge にします。merge は、やり直しの手段が単純で、履歴を壊しません。

途中で止まったとき

merge は git merge --abort、rebase は git rebase --abort で、始める前に戻ります。2 つは別のコマンドで、取り違えるとエラーになります。

よくある疑問

結果の中身のファイルは変わりますか

衝突が無ければ、どちらも同じファイルの中身になります。違うのは履歴の形だけです。

rebase のあと、push が弾かれました

push 済みのブランチを rebase した結果です。相手の履歴と食い違うので、通常の push は弾かれます。強制 push は相手のコミットを消すので、先に取り消して、merge でやり直します。取り消しかたは git rebase の失敗時の戻し方にあります。

どちらも使いたいときはありますか

あります。手元のブランチは rebase で整え、main への取り込みは merge で行う、という使い方です。整えるのは push の前だけにします。

確かめた Git の版 2.53.0確認日 2026年10月20日正本は Git 公式マニュアル (英語)

Git コマンド辞典の索引へ戻る