できない.dev

git pull が「Your local changes would be overwritten」でできない

未コミットのローカル変更が pull で取り込む差分と同じファイルにあると、git は上書きを避けて中断する。
変更を commit するか git stash で退避してから pull するのが安全。

#pull#merge#stash#restore#local-changes

要約

error: Your local changes to the following files would be overwritten by merge は、未コミットのローカル変更と、pull で取り込む変更が同じファイルを触っている ために git が安全装置として merge を止めた状態。
ローカルの変更を commit するか git stash で退避してから git pull すれば進む。
捨ててよい変更なら git restore で消す。

よくある原因

  1. 編集中ファイルの衝突: 自分が直しているファイルを、リモート側も更新していた
  2. 追跡対象の誤り: ビルド生成物や .env をコミット対象にしてしまい、毎回差分が出る
  3. 改行・権限差分: CRLF/LF や実行ビットの違いで、実質変更していないのに変更扱いになる
  4. 履歴の書き換え: 共有ブランチへの force push で差分の範囲が想定より広がっている

解決策

1. 変更を commit してから pull

git add -A
git commit -m "wip"
git pull

残したい変更はこれが最も素直。
pull 後にコンフリクトが出たら通常の merge 解消に移る。

2. stash で退避する

git stash push -m "before pull"
git pull
git stash pop

コミットするほど固まっていない作業は stash で逃がす。git pull の挙動は git-pull 公式ドキュメント に、退避の詳細は git-stash ドキュメント に記載がある。pop で衝突したら解消後に git stash drop する。

3. 変更を破棄する

git restore path/to/file        # 特定ファイルだけ捨てる
git restore .                   # 全部捨てる(取り返せないので注意)
git pull

不要な変更だと確信できる場合のみ。restore は元に戻せないため、対象を限定して打つ。

4. そもそも追跡から外す

echo "dist/" >> .gitignore
git rm -r --cached dist
git commit -m "stop tracking build output"

生成物や個人設定が原因なら、追跡をやめれば再発しない。
これが根本対策になることが多い。

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