3.

Cannot rebase: You have unstaged changes. のエラー対処

編集
この記事の要点
  • Cannot rebase: You have unstaged changes作業中の変更があるまま rebase しようとしたエラー
  • 対処 ①: git stash で一時退避 → rebase → git stash pop で復元
  • 対処 ②: 変更を git add + commit してから rebase
  • 対処 ③: 変更を破棄して良ければ git checkout . または git reset --hard
  • rebase 中の競合解決は git rebase --continue / 中断は git rebase --abort

 

エラーの状況

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".

競合の解決手順

  1. 競合ファイルを編集: <<<<<<< / ======= / >>>>>>> マーカーで挟まれた部分を修正
  2. 解決済みをマーク: git add 解決したファイル
  3. rebase 継続: git rebase --continue
  4. すべてのコミットを処理し終わるまで 1-3 を繰り返す

rebase を中断したい

$ git rebase --abort
# rebase 前の状態に戻る

関連エラー

  • Cannot pull with rebase: You have unstaged changesgit 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 / 復元

関連記事

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. fatal: remote origin already exists.
  2. fatal: '~' does not appear to be a git repository
  3. Cannot rebase: You have unstaged changes. Please commit or stash them.
  4. remote: error: denying non-fast-forward refs/heads/master (you should pull first)
  5. error: pathspec ... did not match any file(s) known to git.
  6. The following untracked working tree files would be overwritten by checkout
  7. fatal: Not a valid object name: 'master'.
  8. Unlink of file 'ファイル名' failed. Should I try again? (y/n)
  9. Another git process seems to be running in this repository, ~
  10. error: Your local changes to the following files would be overwritten by checkout: