Вы упоминаете, что используете MacOS. MacOS по умолчанию имеет регистр в чувствительных файловых системах. То есть, если вы сначала создадите файл с именем, скажем, ReadMe.txt
, а затем попытаетесь создать новый и другой файл с именем README.TXT
, ОС откажется выполнить то, что вы просили. Вместо этого он просто перезаписывает ваш ReadMe.txt
файл.
Теперь в ваших нескольких git status
выходных данных у нас есть две строки:
modified: src/scss/components/_featureddiscussionsmodule.scss
modified: src/scss/components/_featuredDiscussionsModule.scss
Обратите внимание на два разных имени файла.
При коммиты сохраняются как Git, файлы хранятся в специальном, только для чтения, Git только сжатом формате. Это не обычные файлы ОС. У них нет имен файлов на уровне операционной системы. 1 Таким образом, Git может хранить два совершенно разных файла, один с именем src/scss/components/_featuredDiscussionsModule.scss
, а другой - с именем в нижнем регистре. .
Ваша файловая система MacOS просто не может хранить оба файла. Это означает, что когда вы Git извлекаете этот коммит в ваше рабочее дерево, чтобы вы могли просматривать и работать с файлами, один из файлов перезаписывает другой.
Вы можете легко:
- полностью игнорировать эту ситуацию (просто никогда не используйте и не изменяйте этот файл и позволяйте ему, по-видимому, случайным образом перелистывать назад и вперед), или
- удалите один из двух файлов, который заканчивается с тем же имя, когда вы работаете с этим коммитом, а затем делаете новый коммит, или
- создаете чувствительную к регистру файловую систему: см. мой ответ на Как изменить регистр имен нескольких файлов, уже зафиксированных ?
Последний метод, вероятно, лучший, поскольку он позволяет вам работать с коллегами, возможно, используя Linux, который, вероятно, создал эту ситуацию в первую очередь.
(В то же время, вы, возможно, захотите сообщить им - коллегам, которые изначально это настраивали), что они столкнулись с ситуацией, когда этот репозиторий не может быть использован правильно. по умолчанию MacOS или Windows, где файловая система нечувствительна к регистру и поэтому не может извлекать оба файла.)
1 Git использует форму хранилища объектов , в котором данные каждого объекта хранятся под идентификаторами ha sh. Сам коммит имеет идентификатор ha sh, и данные этого коммита содержат идентификатор ha sh объекта tree . Древовидные данные кодируют имена файлов - как данные, а не как имена ОС - и содержимое каждого файла хранится под еще одним ha sh ID. Таким образом, все, что видит операционная система, имеют имена с sh идентификаторами, и даже это происходит только с потерянными объектами: объекты в конечном итоге получают упакованные , чтобы сжимать их еще дальше, после чего остается только один файл упакованных объектов на уровне файлов ОС.