git rebase

自分のコミットを、別のブランチの先頭の後ろへ付け替えて、履歴をまっすぐにそろえる。

実行前の状態

feature ブランチで app.py をコミットしているあいだに、main が進んだ場面です。feature のコミットを、main の最新の後ろへ付け替えて、履歴をまっすぐにしたいときに打ちます。付け替えるのは、まだ push していないコミットだけです。

この状態を手元で作るなら、次の順に打ちます。git switch -q -c feature は、feature ブランチを作って移る操作です。

ターミナル

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 feature
echo "print('hi')" > app.py
git add app.py
git commit -q -m "app.py を足す"
git switch -q main
echo "start" >> README.md
git commit -q -a -m "README に説明を足す"
git switch -q feature

最小の例と結果

付け替えたいブランチ (feature) にいる状態で、土台にしたいブランチの名前を書きます。

ターミナル

git rebase main
Successfully rebased and updated refs/heads/feature.

Successfully rebased は、feature のコミットを main の先頭の後ろへ付け替え終えたという意味です。付け替えたコミットは作り直されるので、番号が変わります。

成功の確認

履歴が 1 本につながっていれば付け替わっています。分かれた線は残りません。

ターミナル

git log --oneline --graph
* a1b2c3d app.py を足す
* 9f8e7d6 README に説明を足す
* 3c4d5e6 README を作る

ターミナル

git status -s

衝突で止まったとき

付け替える先で、同じファイルの同じ行が変わっていると、rebase は途中で止まります。続けて、その様子を見ます。

ターミナル

git switch -q main
echo "色は白" > color.txt
git add color.txt
git commit -q -m "白色"
git switch -q -c blue
echo "色は青" > color.txt
git commit -q -a -m "青色"
git switch -q main
echo "色は赤" > color.txt
git commit -q -a -m "赤色"
git switch -q blue
git rebase main
Auto-merging color.txt
CONFLICT (content): Merge conflict in color.txt
error: could not apply a1b2c3d... 青色
hint: Resolve all conflicts manually, mark them as resolved with
hint: "git add/rm <conflicted_files>", then run "git rebase --continue".
hint: You can instead skip this commit: run "git rebase --skip".
hint: To abort and get back to the state before "git rebase", run "git rebase --abort".
hint: Disable this message with "git config set advice.mergeConflict false"
Could not apply a1b2c3d... # 青色

ターミナル

git status -s
UU color.txt

UU は、直し終えていないファイルです。直さずにやめるなら、付け替える前の状態へ戻します。

ターミナル

git rebase --abort
git status -s

何も出なければ、元の状態に戻っています。

構文と主要オプション

書き方すること
git rebase <ブランチ名>いまのブランチのコミットを、そのブランチの先頭の後ろへ付け替える
git rebase --continue衝突を直して git add したあと、付け替えの続きへ進む
git rebase --abort付け替えをやめて、始める前の状態へ戻す
git rebase --skip衝突したコミットを捨てて、続きへ進む
git rebase -i HEAD~3直近 3 つのコミットを、並べ替え、まとめ、書き直す

失敗時の戻し方

push 済みのブランチでは使わない

rebase は、コミットを作り直して番号を変えます。push したブランチに使うと、ほかの人の手元にある元のコミットと食い違います。そのあと push しようとすると弾かれ、強制 push で通すと、相手のコミットが消えます。付け替えるのは、まだ自分の手元にしかないコミットだけにします。

衝突で止まっているとき

やめるなら git rebase --abort です。merge の途中でやめる git merge --abort とは別のコマンドで、rebase の途中では使えません。

衝突を直して続けるなら、直したファイルを git add して、git rebase --continue を打ちます。merge のように git commit は打ちません。

付け替えを終えたあとで、取り消したいとき

git reflog で、付け替える前の位置の番号を探して戻します。rebase (start) の行の、すぐ下にある行が、付け替える前の位置です。

ターミナル

git reflog
a1b2c3d HEAD@{0}: rebase (finish): returning to refs/heads/feature
a1b2c3d HEAD@{1}: rebase (pick): app.py を足す
9f8e7d6 HEAD@{2}: rebase (start): checkout main
3c4d5e6 HEAD@{3}: checkout: moving from main to feature

付け替える前の番号 (この例では 3c4d5e6) へ、戻します。

ターミナル

git reset --hard 3c4d5e6

--hard は、作業中のファイルの変更まで消します。先に git status で、変更が残っていないかを確かめます。

よくある疑問

rebase の途中で、何をしているか分からなくなりました

git status を打ちます。rebase in progress と出ていたら、付け替えの途中です。衝突したファイルが both modified と出ているので、直して git add し、git rebase --continue で進みます。全部をやり直したいなら、git rebase --abort で始める前に戻れます。

merge と rebase は、どちらを使いますか

履歴が分かれた形を残してよいなら merge です。push 済みのブランチにも使えます。まだ push していない自分のブランチを、main の最新に合わせて 1 本にしたいなら rebase です。迷ったら merge を選びます。

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

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

確かめた Git の版 2.50.1 (Apple Git-155)確認日 2026年10月17日正本は Git 公式マニュアル (英語)

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