Почему я получаю различия, от которых я не могу избавиться при переключении ветвей в git, и как это исправить?

Вот какой улокальный вывод из командной строки (с пошитом, показывающим статус):

[Branch1]> git checkout Branch2
Switched to branch 'Branch2'
[Branch2 +0 ~3 -0]> 
[Branch2 +0 ~3 -0]> git diff --ignore-space-at-eol
[Branch2 +0 ~3 -0]> git checkout .
[Branch2 +0 ~3 -0]>

Я попробовал решения, предложенные в этом вопросе

[Branch2 +0 ~3 -0]> git reset --hard
HEAD is now at c8be749 some comment
[Branch2 +0 ~3 -0]> git reset HEAD
Unstaged another commit:
M       Src/somefile
M       Src/someotherfile.cs
M       Src/athirdfile.cs
[Branch2 +0 ~3 -0]>

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

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

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

Что я могу сделать, чтобы попытаться устранить эту все более раздражающую проблему?

Ответ 1

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

Я видел проблемы, подобные этим, из-за:

  • line-endings (Windows vs Mac vs Linux)

    Исправить это с помощью основных. * crlf settings и .gitattributes файлов. Страница справки github для этого и справочная страница gitattributes - это большие ресурсы для этого.

    Попытка исправить линейные окончания с помощью git filter-branch, но не повезло https://help.github.com/articles/dealing-with-line-endings https://www.kernel.org/pub/software/scm/git/docs/gitattributes.html

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

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

  • файловые системы без регистра, когда файлы /dirs с несогласованным случаем уже существуют

    В частности, что Src dir выглядит особенно подозрительно для меня. Обычно это происходит потому, что кто-то переименовал файл в репо с тем же именем, но использовал другой случай для одной или нескольких букв. Затем кто-то обновляет локальное репо и рабочий каталог, git сообщает файловой системе (case-insenstive filesystem), что файл /dir уже существует, но другой git код будет обрабатывать файл /dir как новый.

    Попробуйте сделать новый клон в новый или пустой каталог. Посмотрите, отличаются ли имена букв имени/имени файла между путями проблемных файлов в вашем новом клоне и вашем исходном клоне (посмотрите в директории Src - это может быть Src в репо. Если доступно, d сделать новый клон в системе Unix/Linux.

  • Юникодовые символы в именах файлов

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

    Смотрите Git очистить не удалять файл для описания проблемы, с которой кто-то еще сталкивался с Unicode в именах файлов.

Ответ 2

Эта проблема может быть вызвана предпочтениями окончания строки в разных операционных системах.

Если вы Unix/Mac пользователь, тогда установите конфигурацию ниже

git config --global core.autocrlf input
git config --global core.safecrlf true

Если вы находитесь на Windows, попробуйте выполнить настройку ниже

git config --global core.autocrlf true
git config --global core.safecrlf true

После выполнения этой настройки, как только вы переключаете ветки, тогда git status не должен жаловаться ни на что.

Ответ 3

git clean -id должен делать то, что вы ищете.

i позволит вам проверить, что будет удалено, пока d сообщит об этом, чтобы удалить дополнительные каталоги. Просто будьте осторожны, чтобы он не чистил слишком много и вынимал все, что вы хотите сохранить.