【Git】pullで「untracked working tree files would be overwritten by merge」の解決方法完全ガイド

git pullを実行したら、こんなエラーメッセージが表示されて止まってしまった…

$ git pull
error: The following untracked working tree files would be overwritten by merge:
        config.ini
        data/settings.json
Please move or remove them before you merge.
Aborting
このエラーの意味:リモートブランチにある変更が、ローカルの未追跡ファイル(untracked files)と衝突するため、マージを中断した。Gitが勝手にファイルを上書きしないよう保護している。

この記事では、エラーの原因から状況別の解決方法まで5つのパターンを解説します。

スポンサーリンク

エラーの原因

このエラーは次の状況で発生します。

  • リモートリポジトリには存在するファイルが、ローカルでは git addgit commit もされていない状態で存在している
  • git pullによるマージがそのファイルを変更・作成しようとしている

要するに「リモートが更新しようとするファイルと同名のファイルがローカルに野良で存在している」状態です。

注意:下手に操作するとローカルの変更が消えます。まずエラーに表示されているファイルに大切な変更が含まれているかを確認しましょう。

現在の状態を確認する

まず git status でどのファイルが問題なのかを把握します。

$ git status
On branch main
Your branch is behind 'origin/main' by 2 commits, and can be fast-forwarded.
  (use "git pull" to update your local branch)

Untracked files:
  (use "git add ..." to include in what will be committed)
        config.ini
        data/settings.json

nothing added to commit but untracked files present

「Untracked files」として表示されているファイルが原因です。

解決方法1: ファイルを削除する(変更が不要な場合)

エラーに表示されているファイルが不要であれば、削除してから再度 git pull を実行します。

# ファイルを削除
$ rm config.ini
$ rm data/settings.json

# 再度pull
$ git pull

Windowsの場合は del コマンドを使います。

del config.ini
del data\settings.json
ファイルを削除するとリモートからの最新版が取得されます。元のファイルは消えますが、pullによってリモートの最新版が配置されます。

解決方法2: git stashで一時保存する(変更を残したい場合)

ファイルに手を加えていて変更を残したい場合は、git stashで一時退避させます。ただし、untrackedファイルは通常のstashでは保存されないため -u オプションが必要です。

# untrackedファイルも含めてstash
$ git stash -u
Saved working directory and index state WIP on main: abc1234 前回のコミット

# pullを実行
$ git pull

# stashを戻す(競合する場合は手動マージ)
$ git stash pop
git stash -u の -u とは:–include-untracked の略。追跡されていないファイルもstash対象に含めます。競合がある場合は git stash pop 後に手動でマージが必要です。

解決方法3: ファイルをバックアップして移動する

削除は怖いが変更もない、というケースでは別の場所に移動するのが安全です。

# Linuxの場合
mv config.ini config.ini.bak
mv data/settings.json data/settings.json.bak

# Windows(コマンドプロンプト)
ren config.ini config.ini.bak
ren data\settings.json settings.json.bak
# その後pull
$ git pull

pullが成功したら、バックアップと新しいファイルを比較して必要な変更をマージできます。

解決方法4: .gitignoreに追加する

そのファイルを今後もGit管理外にしたい場合は .gitignore に追加します。ただし、これだけではpullのエラーは解決しません。先にファイルを削除または移動してからpullし、その後.gitignoreに追加する流れになります。

# まずファイルを削除
$ rm config.ini

# pullを実行
$ git pull

# .gitignoreに追加
$ echo "config.ini" >> .gitignore
$ git add .gitignore
$ git commit -m "Add config.ini to .gitignore"

解決方法5: git checkout –force(強制チェックアウト)

untracked filesを含むすべてのローカル変更を捨ててリモートと完全に一致させたい場合に使います。

# リモートの最新を取得
$ git fetch origin

# 強制的にリモートの状態に合わせる
$ git checkout --force origin/main
注意:この方法はローカルの未コミット変更がすべて消えます。大切な変更がある場合は使わないでください。

複数ファイルが一括で対象になる場合

エラーに大量のファイルが列挙される場合、以下のコマンドで一括削除できます。

# Gitが追跡していないファイル・フォルダを一括削除(確認付き)
$ git clean -nd   # まず削除対象を確認(ドライラン)
$ git clean -fd   # 実際に削除(ファイルとディレクトリ)
git clean -fd は元に戻せません。必ず git clean -nd で削除対象を確認してから実行してください。

解決方法の選び方まとめ

状況 推奨する方法
ファイルが不要(自動生成物など) 削除してpull
変更を残したい git stash -u → pull → stash pop
念のためバックアップしたい 別名でコピー → 元を削除 → pull
今後もGit管理外にしたい 削除 → pull → .gitignore追加
ローカル変更をすべて捨てたい git checkout –force

よくある質問(FAQ)

Q. git stash popで競合が発生したらどうすればいいですか?
A. stash popで競合が起きたらgit statusで競合ファイルを確認し、手動でマージしてください。解消後はgit addしてからgit stash dropでstashを削除します。
Q. 「would be overwritten」と「would be deleted」の違いは?
A. 「overwritten」はリモートがそのファイルを更新しようとしている場合、「deleted」はリモートがそのファイルを削除しようとしている場合です。どちらもローカルのuntrackedファイルが影響を受けるため同様の手順で対処できます。
Q. git clean -fdと rm の違いは?
A. git clean -fdはGitが追跡していないすべてのファイル・ディレクトリを削除します。rmは指定したファイルだけを削除します。特定のファイルだけ消したい場合はrmを使うほうが安全です。
Q. .gitignoreに追加すればpullのエラーを防げますか?
A. .gitignoreは「Gitが新たにファイルを追跡しないようにする」設定です。すでにリモートで追跡されているファイルには効きません。リモートに存在するファイルと同名のuntrackedファイルがある場合は削除または移動が必要です。
Q. このエラーが頻繁に出る場合、根本的な対策はありますか?
A. ビルド成果物・ログファイル・設定ファイルなど自動生成されるファイルを.gitignoreに最初から登録しておくことで予防できます。チームで使うリポジトリでは.gitignoreを充実させることが重要です。

関連記事

まとめ

「untracked working tree files would be overwritten by merge」の解決ポイント:
① 変更不要なら削除してpull
② 変更を残したいなら git stash -u → pull → stash pop
③ 念のためバックアップしてから削除→pull
④ 今後も除外したいなら削除→pull→.gitignore追加
⑤ すべて捨てるなら git checkout --force