Git: как вернуть 2 файла, которые упорно застряли на "изменено, но не зафиксировано"?


у меня есть РЕПО, которое имеет два файла, которые предположительно я изменил локально.

так что я застрял с этим:

$ 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")

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

интересно, что я не помню, как менял эти файлы локально. Это РЕПО используется с одним удаленным РЕПО (private, at GitHub.com, Чистки рядов).

независимо от того, что я пробовал, я не могу отказаться от этих локальных изменений. Я перепробовал все:

$ 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 файла остаются застрявшими как "измененные, но не зафиксированные".

Что, черт возьми, приведет к тому, что два файла будут застрять, как это и, казалось бы, "un-revert-table"??

P. S. В список выше показывает команды я уже пробовал, я по ошибке написал git revert когда я имел в виду git checkout. Извините и спасибо тем из вас, кто ответил, что я должен попробовать checkout. Я отредактировал вопрос, чтобы исправить его. Я определенно уже пробовал checkout.

10 73

10 ответов:

Что окончания строк в файлах? Держу пари, что они CRLF. Если они есть, проверьте это руководство:http://help.github.com/line-endings/

короче говоря, вам нужно убедиться, что git настроен на преобразование окончаний строк в LF при фиксации, а затем зафиксировать эти файлы. Файлы в репо всегда должны быть LF, извлеченные файлы должны быть родными для ОС, если вы правильно установили git.

Я потратил часы, пытаясь решить аналогичную проблему-удаленную ветку, которую я проверил, которая упорно показывала четыре файла как "измененные, но не обновленные", даже при удалении всех файлов и запуске git checkout -f снова (или другие варианты из этого поста)!

эти четыре файла были необходимы, но, конечно, не были изменены мной. Мое окончательное решение-убедить Гита, что они не были изменены. Следующие работы для всех извлеченных файлов, показывая "измененный" статус-убедитесь, что вы уже совершили / спрятали все, что действительно было изменено!:

git ls-files -m | xargs -i git update-index --assume-unchanged "{}"

на Mac OSX, однако xargs работает немного по-другому (thx Daniel для комментария):

git ls-files -m | xargs -I {} git update-index --assume-unchanged {}

я добавил Это в качестве заполнителя для себя в следующий раз, но я надеюсь, что это поможет кому-то еще тоже.

- Al

вот как я исправил ту же проблему в моем случае: открыть.gitattributes по изменение:

* text=auto

to:

#* text=auto

сохранить и закрыть , а затем вернуться или сбросить, спасибо @Simon East за подсказку

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

git diff dir1 / foo.aspx

и он покажет вам изменения режима файла. Однако это все равно не позволит вам вернуть их. Для этого используйте либо

git config core.содержит filemode ложь

или измените свой git .настройка в текстовом редакторе путем добавления

[ядро]

filemode = false

после того, как вы сделаете это, вы можете использовать

git сброс головки dir1 / foo.aspx

и файл должен исчезнуть.

(Я получил все это из ответа как заставить git игнорировать изменения режима (chmod)?)

попытаться откатить локальные изменения:

git checkout -- dir1/foo.aspx
git checkout -- dir2/foo.aspx

у меня были некоторые фантомные измененные файлы, которые показывались как измененные, но на самом деле были идентичны.

запуск этой команды иногда работает:
(Отключает "умные", но часто бесполезные преобразования в конце строки git)

git config --local core.autocrlf false

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

git checkout dir1/foo.aspx
git checkout dir2/foo.aspx

для меня вопрос был не об окончаниях строк. Речь шла об изменении регистра в имени папки (Reset_password -> Reset_Password). Это решение помогло мне: https://stackoverflow.com/a/34919019/1328513

Я думаю, что было бы полезно дать подсказку о том, как воспроизвести проблему, чтобы лучше понять проблему:

$ git init
$ echo "*.txt -text" > .gitattributes
$ echo -e "hello\r\nworld" > 1.txt
$ git add 1.txt 
$ git commit -m "committed as binary"
$ echo "*.txt text" > .gitattributes
$ echo "change.." >> 1.txt

# Ok let's revert now

$ git checkout -- 1.txt
$ git status
 modified:   1.txt

# Oooops, it didn't revert!!


# hm let's diff:

$ git diff
 warning: CRLF will be replaced by LF in 1.txt.
 The file will have its original line endings in your working 
 directory.
 diff --git a/1.txt b/1.txt
 index c78c505..94954ab 100644
 --- a/1.txt
 +++ b/1.txt
 @@ -1,2 +1,2 @@
 -hello
 +hello
  world

# No actual changes. Ahh, let's change the line endings...

$ file 1.txt 
 1.txt: ASCII text, with CRLF line terminators
$ dos2unix 1.txt
 dos2unix: converting file 1.txt to Unix format ...
$ git diff
 git diff 1.txt
 diff --git a/1.txt b/1.txt
 index c78c505..94954ab 100644
 --- a/1.txt
 +++ b/1.txt
 @@ -1,2 +1,2 @@
 -hello
 +hello
  world

# No, it didn't work, file is still considered modified.

# Let's try to revert for once more:
$ git checkout -- 1.txt
$ git status
 modified:   1.txt

# Nothing. Let's use a magic command that prints wrongly committed files.

$ git grep -I --files-with-matches --perl-regexp '\r' HEAD

HEAD:1.txt

2-ой способ размножения: В приведенном выше скрипте замените эту строку:
echo "*.txt -text" > .gitattributes
с
git config core.autocrlf=false
и держите остальные строки как есть


что все вышесказанное говорит? текстовый файл можете (при некоторых обстоятельствах) быть привержен с возврата каретки и перевода строки (например,-text на .gitattributes / или core.autocrlf=false).

когда мы позже хотим обработать тот же файл, что и текст (-text ->text) это должно быть совершено снова.
Конечно, вы можете временно вернуть его (как правильно ответил Абу-Ассар). В нашем случае:

echo "*.txt -text" > .gitattributes
git checkout -- 1.txt
echo "*.txt text" > .gitattributes

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


Для справки:

чтобы проверить, какие файлы могут вызвать эту проблему в вашем РЕПО, выполните следующую команду (git должен быть скомпилирован с --with-libpcre):

git grep -I --files-with-matches --perl-regexp '\r' HEAD

фиксируя файл (ы) (предположим, что вы хотите рассматривать их как текст), это то же самое, что делать то, что предлагается в этой ссылке http://help.github.com/line-endings/ для устранения таких проблем. Но вместо того, чтобы снять .git/index и исполнительского reset, вы просто измените файл(ы), а затем выполните git checkout -- xyz zyf а затем совершить.

У вас также могла возникнуть проблема, связанная с каталогами именования буквенных регистров. Некоторые из ваших колледжей могли бы изменить имя каталога от т. е. myHandler до MyHandler. Если бы вы позже нажали и вытащили некоторые файлы исходного каталога, у вас было бы 2 отдельных каталогах на удаленном репозитории и только один на вашем локальном компьютере так как в Windows u может быть только один. И ты в беда.

чтобы проверить, так ли это, просто посмотрите, имеет ли удаленный репозиторий двойную структуру.

чтобы исправить это, создайте резервную копию родительского каталога за пределами РЕПО, затем удалить папку, нажмите на нее. Сделайте тянуть (вот когда второй помеченный как удаленный должен появиться на статус) и нажмите еще раз. После этого воссоздайте всю структуру из резервной копии и снова нажмите изменения.