タイトル: Cannot rebase: You have unstaged changes. Please commit or stash them.
SEOタイトル: Cannot rebase: You have unstaged changes. のエラー対処
| この記事の要点 |
|---|
|
エラーの状況
git rebase を実行したときに、以下のメッセージが出ます:
$ git rebase main
Cannot rebase: You have unstaged changes.
Please commit or stash them.
これは「ワーキングディレクトリに未コミットの変更がある状態で rebase はできない」という意味です。rebase はコミット履歴を書き換える操作なので、未保存の変更があると消える危険があるため、git が保護のために止めています。
状況確認
まず、何が変更されているかを確認:
$ git status
On branch feature/foo
Your branch is up to date with 'origin/feature/foo'.
Changes not staged for commit:
(use "git add ..." to update what will be committed)
(use "git restore ..." to discard changes in working directory)
modified: src/main.py
no changes added to commit
対処方法
方法 1: stash で一時退避(推奨・もっとも安全)
# 変更を退避
$ git stash
Saved working directory and index state WIP on feature/foo: abc1234 ...
# rebase 実行
$ git rebase main
Successfully rebased and updated refs/heads/feature/foo.
# 退避した変更を復元
$ git stash pop
On branch feature/foo
Changes not staged for commit:
modified: src/main.py
注意: stash pop で競合(conflict)が起きる場合があります。その場合は手動で解決:
# 競合発生
$ git stash pop
Auto-merging src/main.py
CONFLICT (content): Merge conflict in src/main.py
# 競合を編集して解決後
$ git add src/main.py
$ git stash drop # 退避を削除(pop は自動削除されないので明示)
方法 2: 変更をコミットしてから rebase
# WIP コミットを作っておく
$ git add .
$ git commit -m "WIP: 作業中"
$ git rebase main
# ... rebase 完了 ...
# 後で WIP コミットを修正したい場合
$ git commit --amend # メッセージ修正
# または
$ git reset --soft HEAD~ # コミットを取り消してステージング状態に
方法 3: 変更を破棄して rebase
注意: 変更は完全に失われます。本当に不要な場合のみ。
# 変更を完全に破棄
$ git checkout . # トラッキング済みファイルの変更を破棄
$ git clean -fd # 未追跡ファイルを削除
# または
$ git reset --hard HEAD # 全変更を破棄してコミット状態に戻す
$ git rebase main
rebase 中に競合が発生したら
rebase 実行中に競合が起きると以下のメッセージ:
CONFLICT (content): Merge conflict in src/main.py
error: could not apply abc1234... commit message
Resolve all conflicts manually, mark them as resolved with
"git add/rm ", then run "git rebase --continue".
競合の解決手順
- 競合ファイルを編集:
<<<<<<</=======/>>>>>>>マーカーで挟まれた部分を修正 - 解決済みをマーク:
git add 解決したファイル - rebase 継続:
git rebase --continue - すべてのコミットを処理し終わるまで 1-3 を繰り返す
rebase を中断したい
$ git rebase --abort
# rebase 前の状態に戻る
関連エラー
Cannot pull with rebase: You have unstaged changes—git pull --rebaseで同じエラー、同じ対処Your local changes to the following files would be overwritten by merge— checkout / merge / pull 時の同種エラーCannot checkout: You have unstaged changes— ブランチ切替時の同種
予防策
- こまめにコミット: WIP コミットでもよいので作業中の変更を残す
- 作業前に状態確認:
git statusを習慣化 - pull の前に commit / stash: 作業中に他の人の変更を取り込む前に整理
- git config で自動 stash:
git config --global rebase.autoStash trueで rebase 時に自動 stash / 復元