できない.dev

Git で「Your local changes would be overwritten by checkout」でブランチを切り替えられない

未コミットの変更が切替先と衝突すると checkout が中断する仕様。
stash か commit で退避するか、捨ててよいなら restore してから切り替える。

公開:

要約

error: Your local changes to the following files would be overwritten by checkout は、作業ツリーに未コミットの変更があり、切り替え先のブランチでは同じファイルが異なる内容になっているときに出る。

Git は変更を黙って上書きしないよう、切り替え自体を中断して保護してくれる。
退避(stash / commit)するか、捨ててよいなら破棄してから切り替えれば通る。

よくある原因

  1. 未コミットの衝突: 編集中のファイルが、切替先ブランチでは別内容になっている。
  2. 退避なしの切替: stash も commit もせずに git switch / git checkout <branch> を実行した。
  3. 追跡すべきでないファイル: node_modules やビルド生成物を追跡してしまい、ブランチ間で毎回ぶつかる。

解決策

1. 変更を stash で退避する

git stash
git switch feature
git stash pop

切り替えの前に stash で作業を退避すれば、切り替え後に git stash pop で戻せる。
衝突したら通常のコンフリクト解決と同じ手順になる。

2. 変更を確定させる

git add -A
git commit -m "WIP"
git switch feature

残す価値のある変更なら commit してから切り替える。
ブランチを間違えても、後から git cherry-pickgit reset で移動できる。

3. 変更を破棄する

git restore .
# 特定ファイルだけなら
git restore path/to/file

要らない変更なら git restore で作業ツリーを HEAD の状態に戻す。
破棄すると元に戻せないので、消える内容を git diff で確認してから実行する。

4. 追跡すべきでないファイルを外す

echo "dist/" >> .gitignore
git rm -r --cached dist

生成物や環境依存ファイルが原因なら、.gitignore に加えて追跡から外す。
以降はブランチを切り替えても衝突しなくなる。

この記事は役立ちましたか?