Ошибка. Следующие файлы без обработки файлов дерева будут перезаписаны

Когда я делаю git status, он говорит nothing to commit, working directory clean

И затем я делаю git pull --rebase, он говорит:

First, rewinding head to replay your work on top of it...
error: The following untracked working tree files would be overwritten by checkout:
    includes/resources/moduledata/12/_Fr4_02_Invention_IPA_SR_la-Fête.pdf
Please move or remove them before you can switch branches.
Aborting
could not detach HEAD

Аналогичная ошибка при выполнении git pull origin master

 * branch            master     -> FETCH_HEAD
error: The following untracked working tree files would be overwritten by merge:
    includes/resources/moduledata/12/_Fr4_02_Invention_IPA_SR_la-Fête.pdf
Please move or remove them before you can merge.
Aborting

Мой .gitignore файл:

→ cat .gitignore 
.htaccess
bower_components/

Этот файл постоянно появляется, и когда я удаляю его из файловой системы, git скажет, что я удалил этот файл, а в других сообщениях он говорит, что он не отслеживается. Как это можно было не отслеживать и отслеживать одновременно?

Ответ 1

Без полной картины репо, то, что следует, скорее всего, является догадкой, чем чем-либо еще, но это может объяснить ситуацию. Скажем, ваша история выглядит следующим образом:

A -- C [origin/master]
  \ 
   B [HEAD, master]

Вы пишете:

Этот файл постоянно появляется, и когда я удаляю его из файловой системы, git скажет, что я удалил этот файл, а в других сообщениях он говорит, что он не проверен.

Я предполагаю, что вы, возможно, запустили

git rm --cached <file-in-question>

и зафиксировал удаление в commit B; поэтому файл больше не отслеживается в вашем локальном репо, но он все еще присутствует в вашем рабочем дереве.

В то же время ветка восходящего потока получила commit C от одного из ваших соавторов, в котором <file-in-question> не был удален из контроля версий. Что вы пытаетесь сделать с помощью

git pull --rebase

выглядит примерно так:

 A -- C [origin/master]
       \ 
        B' [HEAD, master]

Однако, как говорится в сообщении,

Исправленное рабочее дерево [...] не обработано [файл] будет перезаписано checkout

В самом деле, перематывание commit C (чтобы воспроизвести B поверх него) приведет к пересмотру <file-in-question> (from commit C), который будет извлечен в вашем рабочем дереве, в котором одноразовый файл с неизменным именем уже существует. Содержимое этого невоспроизводимого файла может быть ценным; вы можете не захотеть, чтобы этот файл был перезаписан другой версией. Поэтому git останавливается на своем треке и сообщает вам, что не так.

Изменить. Вот пример ребенка, который воспроизводит ситуацию...

cd ~/Desktop
mkdir test
cd test
git init
touch README.md
git add README.md
git commit -m "add README"

# simulate a remote branch moving ahead by one commit
# (that doesn't remove the README)
git checkout -b origin_master
printf "This is a README.\n" > README.md
git add README.md
git commit -m "add description in README"

# remove the README and create a new commit on master
git checkout master
git rm --cached README.md
git commit -m "remove README"

# simulate an attempt to rebase master to its "upstream" branch, origin_master
git rebase --onto origin_master master

Эта последняя команда выводит из строя следующее:

First, rewinding head to replay your work on top of it...
error: The following untracked working tree files would be overwritten by checkout:
    README.md
Please move or remove them before you can switch branches.
Aborting
could not detach HEAD

Я предлагаю вам запустить

git fetch
git log --stat origin/master..master -- <file-in-question>

чтобы проверить, произошло ли что-то подобное.

Ответ 2

Это также может произойти из-за изменения случая в имени файла. У меня была та же проблема, и это то, что разрешило это для меня.

git config core.ignorecase true

Истина для Mac или ПК.

Альтернативные решения по адресу: Следующие неиспользуемые рабочие файлы дерева будут перезаписаны кассой

Ответ 3

Удалите все необработанные файлы (осторожно):

git clean  -d  -fx ""