error: The following untracked working tree files would be overwritten by checkout

Git 操作で時々タイトルのエラーが発生し、毎度困惑してしまうので、再現手順とエラー発生時の解消方法をまとめました。

以下の 2 つのブランチがあるリポジトリを想定します。

master ブランチ

2 つのファイルがコミットされている。

  • a.txt
  • b.txt

dev ブランチ

masterc.txt ファイルが追加され、コミットされている。

  • a.txt
  • b.txt
  • c.txt

このリポジトリの master ブランチをチェックアウトした状態で c.txt ファイルを作成します(ステージに追加していない、つまり git add していません)。

$ git status
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

    c.txt

nothing added to commit but untracked files present (use "git add" to track)

ここで git checkout dev を実行するとタイトルのエラーが発生します。
dev ブランチにすでに c.txt が存在していて、master ブランチの c.txt と衝突してしまうからです。

$ git checkout dev
error: The following untracked working tree files would be overwritten by checkout:
    c.txt
Please move or remove them before you switch branches.
Aborting

c.txt がステージに追加されている場合には、エラーメッセージが少し変わり以下のようになる。

$ git checkout dev
error: Your local changes to the following files would be overwritten by checkout:
    c.txt
Please commit your changes or stash them before you switch branches
Aborting

ここで git reset HEAD を実行すると、dev.txt がアンステージされる(git add が取り消される)。
また上記の代わりに git reset --hard HEAD と、 --hard オプションを付けて実行すると dev.txt がアンステージされると共に削除されて、リポジトリは master ブランチの最新状態になります。

git clean -f

もう一度初期の c.txt が作成された状態を考えます。
この時に git clean -f を実行すると、c.txt は削除され、master ブランチの最新状態になります。

$ git clean -f
Removing c.txt

ファイルがステージに追加されている場合には git clean -f を実行しても何も変わりません。

git checkout -f

またまた初期の c.txt が作成された状態に戻して、今度は git checkout -f dev を実行すると、c.txt は削除され dev ブランチに切り替わります。

$ git checkout -f dev
Switched to branch 'dev'

ファイルがステージに追加されている場合でも dev ブランチに切り替わります(master ブランチへの変更は破棄される)。

Last updated on May 18, 2018