У меня есть репо, в котором есть два файла, которые я предположительно изменил локально.
Итак, я застрял в этом:
$ git status
# On branch master
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: dir1/foo.aspx
# modified: dir2/foo.aspx
#
no changes added to commit (use "git add" and/or "git commit -a")
Doing git diff
говорит, что все содержимое файла изменилось, даже если на глаз это кажется неправдой (похоже, есть общие диапазоны строк, которые diff, похоже, не видит).
Что интересно, я не помню, чтобы эти файлы менялись локально. Это репо используется с одним удаленным репо (частным, на GitHub.com, FWIW).
Что бы я ни пробовал, я не могу отказаться от этих локальных изменений. Я пробовал все:
$ git checkout -- .
$ git checkout -f
$ git checkout -- dir1/checkout_receipt.aspx
$ git reset --hard HEAD
$ git stash save --keep-index && git stash drop
$ git checkout-index -a -f
Другими словами, я испробовал все, что описано в разделе Как отменить неустановленные изменения в Git?плюс еще. Но 2 файла остаются "измененными, но не зафиксированными".
Что, черт возьми, могло привести к тому, что два файла застряли вот так и, казалось бы, "не вернули таблицу" ??
PS В приведенном выше списке с командами, которые я уже пробовал, я ошибочно написал, git revert
когда имел в виду git checkout
. Прошу прощения и благодарю тех из вас, кто ответил, что я должен попробовать checkout
. Я отредактировал вопрос, чтобы исправить. Я определенно уже пробовал checkout
.
git diff --ignore-space-change
илиgit diff --ignore-all-space
сделать разницу в выходеgit diff
?git diff
что файлы идентичны.git config --global core.autocrlf false
вместо «истина».Ответы:
Какие окончания строк в файлах? Держу пари, что они CRLF. Если да, ознакомьтесь с этим руководством: http://help.github.com/line-endings/
Короче говоря, вам нужно убедиться, что git настроен на преобразование окончаний строк в LF при фиксации, а затем зафиксировать эти файлы. Файлы в репо всегда должны быть LF, извлеченные файлы должны быть собственными ОС, если вы правильно установили git.
источник
git config --global core.autocrlf true
и другая сторона, продвигающая репо на GitHub.<pre>
блоке этого руководства, чтобы исправить файлы в репо.Я провел часы, пытаясь решить подобную проблему - удаленный филиал, что я проверил, что упорно показывал четыре файла, как «Измененные но не обновляется», даже при удалении всех файлов и запуска
git checkout -f
снова (или другие вариации этого поста)!Эти четыре файла были необходимы, но я определенно не изменял их. Мое окончательное решение - убедить Git, что они не были изменены. Следующее работает для всех извлеченных файлов, показывая статус «изменено» - убедитесь, что вы уже зафиксировали / сохранили все, что действительно было изменено !:
Однако в Mac OSX xargs работает немного иначе (спасибо Дэниелу за комментарий):
Я добавил это в качестве заполнителя для себя в следующий раз, но надеюсь, что это поможет и кому-то другому.
-Al
источник
git ls-files -m | xargs -I {} git update-index --assume-unchanged {}
git ls-files -v|grep '^h' | cut -c3- | xargs -i git update-index --no-assume-unchanged "{}"
assume-unchaged
, как в случае с @ RodH257. Я считаю, что наиболее правильным ответом в случае, когда команды нравятсяgit checkout -- file
,git stash
аgit reset --hard HEAD
не работают, является, как уже было.gitattributes
вот как я исправил ту же проблему в моем случае: open .gitattributes change:
кому:
сохранить и закрыть, затем вернуться или сбросить, спасибо @Simon East за подсказку
источник
text=auto
параметра в .gitattributes сработало для меня, а затем после того, как яgit reset --hard
вернул этот параметр, файлы больше не отображались как измененные!text=auto
настройкой. Я работаю в репозиториях с коммитами из нескольких ОС, и я до сих пор не понял, что вызывает у меня больше проблем: сохранить или отбросить.Другая возможность заключается в том, что разница (которая не позволяет вам вернуть эти файлы с помощью команды проверки) является одним из файлового режима. Вот что случилось со мной. В моей версии git вы можете обнаружить это, используя
И он покажет вам изменения режима файла. Однако он по-прежнему не позволит вам их вернуть. Для этого используйте либо
или измените свой git .config в текстовом редакторе, добавив
После этого вы можете использовать
и файл должен исчезнуть.
(Я получил все это из ответа на вопрос, как заставить git игнорировать изменения режима (chmod)? )
источник
core.filemode
уже было установлено значение false). В моем случае исправление / обходное решение было тем, что было в ответе Алана Форсайта .Попробуйте отменить локальные изменения :
источник
checkout
. Я уже пробовалcheckout
. В любом случае спасибо за ваш ответ. Это был хороший ответ на мой первоначальный вопрос, поэтому я буду поддерживать его.У меня были фантомно измененные файлы, которые показывались как измененные, но на самом деле были идентичными.
Выполнение этой команды иногда срабатывает:
(Отключает "умные", но часто бесполезные преобразования git в конце строки)
Но в другом случае я обнаружил, что это произошло из-за
.gitattributes
файла в корне, в котором присутствовали некоторые настройки окончания строки, которые пытались применитьautocrlf
к определенным файлам, даже когда он был выключен. На самом деле это не помогло, поэтому я удалил.gitattributes
, зафиксировал, и файл больше не отображался как измененный.источник
text=auto
параметра в .gitattributes сработало для меня, а затем после того, как яgit reset --hard
вернул этот параметр, файлы больше не отображались как измененные!источник
checkout
. Я уже пробовалcheckout
. В любом случае спасибо за ответ. Это был хороший ответ на мой первоначальный вопрос, поэтому я буду поддерживать его.У вас также могла быть проблема, связанная с каталогами с именами буквенных регистров. Некоторые из ваших коллег могли изменить имя каталога, например, с myHandler на MyHandler . Если позже вы нажмете и вытащите некоторые файлы из исходного каталога, у вас будет 2 отдельных каталога в удаленном репозитории И только один на вашем локальном компьютере, поскольку в Windows у вас может быть только один. И у тебя проблемы.
Чтобы проверить, так ли это, просто посмотрите, имеет ли удаленный репозиторий двойную структуру.
Чтобы исправить это, сделайте резервную копию родительского каталога вне репо, затем удалите родительский каталог, нажмите на него. Сделайте тягу (вот когда в статусе должен появиться второй помеченный как удаленный) и нажмите еще раз. После этого воссоздайте всю структуру из своей резервной копии и снова внесите изменения.
источник
Я думаю, было бы полезно дать подсказку, как воспроизвести проблему , чтобы лучше понять проблему:
2-й способ воспроизведения: в приведенном выше скрипте замените эту строку:
echo "*.txt -text" > .gitattributes
на
git config core.autocrlf=false
и оставьте остальные строки как есть
Что все это говорит? Текстовый файл может (при некоторых обстоятельствах) быть зафиксирован с помощью CRLF (например,
-text
в.gitattributes
/ илиcore.autocrlf=false
).Когда позже мы захотим обработать тот же файл как текст (
-text
->text
), его нужно будет снова зафиксировать.Конечно, вы можете временно отменить его (как правильно ответил Абу Ассар ). В нашем случае:
Ответ : вы действительно хотите это сделать, потому что это будет вызывать одну и ту же проблему каждый раз, когда вы меняете файл.
Для записи:
Чтобы проверить, какие файлы могут вызвать эту проблему в вашем репо, выполните следующую команду (git должен быть скомпилирован с --with-libpcre):
При фиксации файла (ов) (предположим, что вы хотите рассматривать их как текст), это то же самое, что делать то, что предлагается по этой ссылке http://help.github.com/line-endings/ для устранения таких проблем. . Но вместо удаления
.git/index
и выполненияreset
вы можете просто изменить файл (ы), затем выполнитьgit checkout -- xyz zyf
и затем зафиксировать.источник
У меня была такая же проблема с тем интересным дополнением, что файлы были изменены в Windows, но не при просмотре их из WSL. Никакое возня с окончанием строки, сбросом и т. Д. Не могло изменить это.
В конце концов, я нашел решение в этом ответе . Ниже приводится текст для удобства:
Я решил эту проблему, выполнив следующие действия
1) Удалите каждый файл из индекса Git.
2) Перепишите индекс Git, чтобы учесть все новые окончания строк.
Решение было частью шагов, описанных на сайте git https://help.github.com/articles/dealing-with-line-endings/
источник
Для меня проблема заключалась не в окончании строк. Речь шла об изменении регистра в имени папки (Reset_password -> Reset_Password). Мне помогло это решение: https://stackoverflow.com/a/34919019/1328513
источник
Эта проблема также может быть вызвана тем, что git рассматривает различия в использовании заглавных букв как разные файлы, но Windows рассматривает их как один и тот же файл. Если в имени файла было изменено только его заглавные буквы, то каждый пользователь Windows этого репо окажется в этой ситуации.
Решение состоит в том, чтобы подтвердить правильность содержимого файлов, а затем повторно подтвердить его. Нам пришлось объединить содержимое двух файлов вместе, поскольку они были разными. Затем потяните, и возникнет конфликт слияния, который вы можете разрешить, удалив дубликат файла. Повторно подтвердите разрешение слияния, и вы вернетесь в стабильное состояние.
источник