git checkout - не отбрасывает изменения?

у меня есть изменения в моем рабочем каталоге, которые я пытаюсь отбросить (сбросить до текущей индексированной версии файлов), однако,git checkout -- <file> не отменить изменения. Я попытался вручную удалить файлы (rm -r files) запустите git checkout -- ., который отображает файлы как измененные снова.

$ git checkout -- .
$ git status
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   files/Hulk.png
#   modified:   files/Hulk_2.png
#
no changes added to commit (use "git add" and/or "git commit -a")

под управлением git diff показывает, что файлы изменены...

diff --git a/files/Hulk.png b/files/Hulk.png
index 1c256cb..1d37fe0 100644
Binary files a/files/Hulk.png and b/files/Hulk.png differ
diff --git a/files/Hulk_2.png b/files/Hulk_2.png
index 1c256cb..0717199 100644
Binary files a/files/Hulk_2.png and b/files/Hulk_2.png differ

Примечание: некоторые люди сказали бежать git checkout ., однако это приведет к тому же результату, что и git checkout -- .. The -- - это просто обозначение, используемое в команде git checkout для различения точек treeish / commit от файлов / путей.

OS: OSX 10.6 Git: 1.7.10.2

11 ответов


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


ты

git config --global core.autocrlf false

или

git config --global core.filemode false

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

git config core.ignorecase false

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

git init /tmp/test && cd /tmp/test
git config core.ignorecase false
echo test>test && git add test && git commit -m "lowercase t"
mv test Test

теперь git status не показывает никаких различий в test:

git status -s
 ?? Test

Commit Test и использовать git ls-files чтобы увидеть, что мы теперь отслеживание:

git add Test && git commit -m "uppercase T"
git ls-files
 Test
 test

что значит ls отчет? Ну, просто "тест", естественно:

ls
 Test

наконец, что происходит, когда мы изменяем тест?

echo garbage>Test
git status -s
 M Test
 M test

Какой ужас.


использовать . вместо...

git checkout .

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


Если вы хотите отменить все внесенные изменения, просто используйте

git checkout .

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

1-используйте другой Клон для изменения строки, заканчивающейся на UNIX 2-сдуть Клон, где проблема появлялась и повторно клонировать его.


чтобы избежать этой проблемы в следующий раз, я решил преобразовать файловую систему в регистр.

Я был приятно удивлен, что это довольно легко на Mac OS (10.13.4).

можно быстро создать новый диск с другой файловой системой:

  • запустить Дисковую утилиту
  • нажмите на контейнер
  • нажмите на громкости (+)

Я назвал новый том "проекты" и установил формат в APFS (Чувствительный к регистру.)

после этого я перевел все проекты на Новый том.


что помогло в моем случае: (также улучшая ответ vinboxx х)

Я был настроен .gitattributes следующим образом:

* text eol=crlf

(Я хотел-X перенормировать, чтобы автоматически использовать правильный формат после слияния)

после временного комментирования этой строки вместе с настройкой git config core.autocrlf false. Все вернулось на круги своя.


Я использовал git checkout -- .

также git checkout .

== то же самое, что сказал op оба работали на Mac OSX 10.7 и Linux, работали на обоих

с Git версии 1.7.7.5 (Apple Git-26) и git 1.7.1 скомпилирован

попробуйте другое РЕПО и посмотрите, получите ли вы те же результаты. Может быть, ошибка команды в версии git?


когда вы удаляете файл из файловой системы с помощью "rm-r file", вы не удаляете его из репозитория. Йо нужно сделать Де же в git используя "git rm"