Git pull: error: запись foo не отменяется. Невозможно объединить

Я пытаюсь обновить свое репо из удаленной ветки и продолжать получать эту ошибку, когда выполняю "git pull". Я не внес никаких локальных изменений, и даже если у меня есть, мне не нужно их хранить.

Я пробовал:

git reset --hard

и я получаю ту же проблему

Единственное, что, похоже, работает, это удаление файла-нарушителя и повторное нажатие git.

Я также пробовал "git stash", а затем "git pull". Нет.

edit: используя PortableGit-1.6.4-preview20090729, чтобы все предыдущие ошибки с ложными ошибками были исправлены.

Ответ 1

Есть несколько способов исправить это, но я нашел git stash работает хорошо для меня. Он временно помещает ваши локальные изменения в другое место. Затем вы можете тянуть, чтобы получить последние изменения. И затем вы можете вернуть свои локальные изменения.

Точно так же:

$ git pull
...
...
file your_file.rb not up to date, cannot merge.

$ git stash
$ git pull
$ git stash pop

Ответ 2

Эта проблема часто возникает из-за попытки вытащить из репозитория, который имеет два имени файла, которые отличаются только в случае. Если вы находитесь в FAT, NTFS в режиме без учета регистра (по существу, в любое время, когда он используется под Windows) или HFS + в режиме без учета регистра, и имеют два файла "foobar" и "FOOBAR", тогда Git будет видеть два разных файла, но файловая система увидит только один, что вызовет всевозможные проблемы. Git проверит, скажем, "FOOBAR", а затем проверит "foobar", который файловая система видит как просто заменяющую содержимое "FOOBAR", но оставляя его на месте. Теперь к Git, кажется, что "FOOBAR" был заменен содержимым "foobar", а "foobar" исчез.

Есть две различные проявления этой основной проблемы. Один из них заключается в том, что ваш репозиторий фактически содержит два файла, которые отличаются только случаем. В этом случае вам нужно работать с файловой системой, чувствительной к регистру, или вам нужно будет отредактировать репозиторий, чтобы убедиться, что никаких конфликтов такого рода не происходит; файловая система без учета регистра просто не может хранить содержимое этого репозитория.

В другом случае, когда вы можете обходным путем, возникает переименование, которое изменяет случай файла. Скажем, например, что репозиторий Git содержит переименование из "ПРИМЕР" в "пример". Перед тем, как Git проверит новую версию, он попытается проверить и убедиться, что он не перезапишет какой-либо существующий файл, который у вас есть на вашем диске. Поскольку он считает, что "пример" является новым именем файла, он будет запрашивать файловую систему, если он существует, и файловая система увидит "ПРИМЕР" и скажет "да", поэтому Git откажется от проверки новой версии, так как считает, что она будет перезаписывать невоспроизводимые файлы. В этом случае, если у вас нет каких-либо локальных изменений, о которых вы беспокоитесь, простого git reset --hard <revision-to-checkout>, как правило, будет достаточно, чтобы прервать эту проблему и новую редакцию. Просто попробуйте не переименовывать файлы в другие имена, которые отличаются только в том случае, если вы находитесь в файловой системе без учета регистра, так как это вызовет такие проблемы.

Ответ 3

Вообще говоря, это означает, что у вас есть изменения в локальных файлах, которые не были привязаны к вашему локальному репозиторию. Вы также можете увидеть этот fooobar.com/questions/8399/... для более подробной информации.

Ответ 4

Для дальнейшего уточнения на пост @Brian Campbell (поскольку reset hard тоже не работал), я хочу указать на краевой регистр, который останавливал меня.

Я переместил файл OldFile в другую папку и переименовал его NewFile. Затем я отметил файл как assume-unchanged.

Это мешало мне переключаться между ветвями, и не было никакого задержек для сохранения или фиксации. Проблема заключалась в том, что я не фиксировал это изменение файла с новым именем перед установкой флага assume-unchanged. Поэтому я вернул его в no-assume-unchanged, зафиксировал его, а затем вернул его к assume-unchanged, и я смог снова переключить ветки.

Ответ 5

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

Ответ 6

Стоит попробовать:

Не могли бы вы установить только для этого обновления параметр config core.trustctime на false?

core.trustctime

Если false, различия в ctime между индексом и рабочей копией игнорируются; полезно, когда время изменения inode регулярно изменяется чем-то вне Git (сканеры файловой системы и некоторые системы резервного копирования).

Ответ 7

У меня была аналогичная проблема (Windows 10): я был на branchA и хотел перейти в master. У меня были некоторые неуправляемые изменения, поэтому сначала я git stash, затем git checkout -f master, но я все еще получил Entry 'fileName' not uptodate. Cannot merge.

git status ничего не показывал для совершения.

В конце концов я просто удалил файл вручную, и я смог перейти в другую ветку (это, конечно же, заставило мой файл вернуться), поэтому, я думаю, в git была ошибка.

Ответ 8

У меня на самом деле такая же проблема. Это всегда происходит, когда я обновляю свое зеркало кода ядра Linux, которое я не изменяю. Выполнение "git stash" позволило продолжить, но теперь я получаю следующее, когда пытаюсь сделать "git stash pop".

"Нельзя применять к грязному рабочему дереву, пожалуйста, выполните свои изменения"

Когда я выполняю "git status" после pull, я вижу следующее:

linux-2.6:git status
# On branch master
# Changed but not updated:
#   (use "git add ..." to update what will be committed)
#   (use "git checkout -- ..." to discard changes in working directory)
#
#   modified:   Documentation/io-mapping.txt
#   modified:   include/linux/netfilter/xt_connmark.h
#   modified:   include/linux/netfilter/xt_dscp.h
#   modified:   include/linux/netfilter/xt_mark.h
#   modified:   include/linux/netfilter/xt_rateest.h
#   modified:   include/linux/netfilter/xt_tcpmss.h
#   modified:   include/linux/netfilter_ipv4/ipt_ecn.h
#   modified:   include/linux/netfilter_ipv4/ipt_ttl.h
#   modified:   include/linux/netfilter_ipv6/ip6t_hl.h
#   modified:   net/ipv4/netfilter/ipt_ecn.c
#   modified:   net/netfilter/xt_connmark.c
#   modified:   net/netfilter/xt_dscp.c
#   modified:   net/netfilter/xt_hl.c
#   modified:   net/netfilter/xt_mark.c
#   modified:   net/netfilter/xt_rateest.c
#   modified:   net/netfilter/xt_tcpmss.c
#
no changes added to commit (use "git add" and/or "git commit -a")

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