Почему git не распознает, что мой файл был изменен, поэтому git add не работает

100

Я пытаюсь отправить свои файлы в github с помощью bash. Они уже там, и я загружаю более новую версию с новыми строками, кодом и т. Д. Но когда я пытаюсь, git addа потом появляется сообщение git status:

О мастере филиала

ничего не фиксировать, рабочий каталог чист

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

какой-то случайный парень
источник
4
Если вы уже совершили коммит, вам нечего будет коммитить, проверьте журнал git.
Grady Player
2
что выводит git diff?
maazza 07
2
@maazza Я ничего не получаю от git diff
somerandomguy 07
1
Если git diff(или git status) не показывает ничего, что объясняет, почему нечего добавить. Итак, вопрос действительно таков: «Почему git не распознает, что мой файл был изменен?»
Сунил Д.
Извините, ребята, я вижу, что происходит. Git не видит, что Visual Studio C # изменила его, но он видит, когда что-то еще изменило его, например notepad ++
somerandomguy

Ответы:

129

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

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

git update-index --no-assume-unchanged path/to/file

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


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

git rm --cached path/to/file
git reset path/to/file

В git rm --cachedсредстве для только удалить файл из индекса, и resetговорит мерзавец перезагрузить индекс GIT от последней фиксации.

ThorSummoner
источник
18
git add -f path/to/the/fileон принудительно добавит файлы для фиксации.
Сан,
2
Этот ответ был единственным, который помог решить мою проблему. Не уверен, что это связано с Windows (у меня никогда не было подобных проблем в прошлом, ни в OSX, ни в Linux). Так что спасибо @ThorSummoner. Между прочим, я попробовал git add -fфайл, который находился в этом состоянии «предположить неизменным», и он не сработал - нужно было либо, git update-indexлибо git rm --cachedпосле него, git resetчтобы он заработал.
rsenna 08
2
Кроме того, если вы действительно не уверены в текущем состоянии своего репо, сделайте следующее: git rm --cached -r .а затем git reset ..
rsenna 08
Есть еще один вариант, чтобы попробовать, git update-index --no-skip-worktree path/to/fileвот как я решил свою проблему
Fr0sT
1
У меня сработало, но да только дела с одним файлом.
Thomas Cheng
24

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

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

Марк Элиот Штайн
источник
1
Я использовал gitignore.io для создания своего .gitignore и нашел строку с lib/, что заставляет git игнорировать эту папку. С этим нет проблем - по крайней мере, если эта папка не является основной папкой вашего проекта, как то, что случилось со мной.
Paladini
И для всех в моем случае это был мой глобальный
файл excludesfile
Сначала это не сработало. Но я заставил его работать. В моем случае вещь, которую нужно игнорировать, дважды упоминалась в файле gitignore. Всегда ищите все вхождения и заменяйте все.
MasterJoe 01
9

Как уже говорилось, файлы, вероятно, были помечены флажком "предположить-без изменений", который в основном сообщает git, что вы не будете изменять файлы, поэтому ему не нужно отслеживать изменения с их помощью. Однако это может повлиять на несколько файлов, и если это большое рабочее пространство, вы можете не захотеть проверять их все по одному. В этом случае вы можете попробовать: git update-index --really-refresh

согласно документам:

Like --refresh, but checks stat information unconditionally, without regard to the "assume unchanged" setting.

По сути, это заставит git отслеживать изменения всех файлов, независимо от флагов «предполагать без изменений».

Андре Кунья
источник
2
Для меня git statusговорит, что файлы не меняются, но git add .добавляет два файла и git update-index --really-refreshговорит, что эти два нуждаются в обновлении, но, похоже, ничего не делает. Любая идея?
someonewithpc
2
git status игнорирует файлы с флагом без изменений. Однако использование git update-index --really-refresh очистит этот флаг, и теперь файлы будут отображаться. Попробуйте запустить git status еще раз, чтобы проверить, не изменились ли изменения. Если вы ничего не видите, следуйте за этим сообщением: stackoverflow.com/questions/2363197/… в первую очередь команда для отображения списка файлов, которые имеют предположение-без изменений: git ls-files -v | grep '^[[:lower:]]'если ничего не помогает, вам следует создать вопрос с более подробной информацией, чтобы мы могли помочь вы.
Андре Кунья
8

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

Монро Манн
источник
7

Что ж, у нас недостаточно ответов на этот вопрос, поэтому я дам вам несколько предположений:

1) вы сохранили свои изменения, чтобы исправить тип: git stash pop

2) у вас были изменения и вы их зафиксировали, вы должны увидеть свою фиксацию в git log

3) у вас были какие-то git reset --hardизменения, ваши изменения могут быть там в журнале ссылок, введите, git reflog --allа затем проверьте или выберите ссылку, если вы когда-нибудь ее найдете.

4) вы проверяли одно и то же репо несколько раз и ошиблись.

Grady Player
источник
1) тайник не найден 2) Я внес изменения и зафиксировал, могу ли я сделать коммит еще раз? 3) Я этого не делал 4) Я
участвую
если у вас были изменения и вы их зафиксировали, тогда вы можете перейти к следующему шагу, нажать или что бы там ни было ... Вы можете зафиксировать еще раз, если у вас есть больше изменений, вы даже можете, git commit --amendчто поместит ваши новые изменения в вашу последнюю фиксацию , не делайте этого, если вы уже поделились своим коммитом.
Grady Player
Закрытие и повторное открытие терминала сделали это для меня после очистки репозитория проекта.
Эдди
4

Произошла такая странная вещь. Плагин Eclipse Kepler git автоматически отмечал все мои папки проекта как игнорируемые в папке .gitignore.

Когда я заходил commitв Teamменю, все они снова игнорировались. Насколько я могу судить, это произошло потому, что я установил их как производные в родительском проекте. Снятие отметки с них как derviedисправлено. Я никогда раньше не видел этого на Индиго. Надеюсь, это кому-то поможет.

Джозеф похоть
источник
Есть идеи, как исправить эту проблему, когда это происходит в intellij?
MasterJoe 05
3

TL; DR; Вы вообще находитесь в правильном репозитории?

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

На самом деле на моей машине, у меня было два отдельных GIT репозиториев repo1и repo2настроен в том же корневом каталоге с именем source. Эти два репозитория по сути являются репозиториями двух продуктов, над которыми я работаю в своей компании. Дело в том, что, как правило, структура каталогов исходного кода всех продуктов в моей компании одинакова.

Поэтому, не осознавая, я изменил файл с точно таким же именем, в repo2котором я должен был изменить repo1. Таким образом, я просто продолжал работать команду git statusна repo1и продолжал давать то же сообщение

О мастере филиала

ничего не фиксировать, рабочий каталог чист

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

Не такой уж и частый случай. Но мало ли!

RBT
источник
3

У нас это происходило в Windows при изменении файлов путем передачи различий с помощью инструмента WinMerge. Очевидно, WinMerge (по крайней мере, так, как он настроен на моем компьютере) иногда не обновляет временные метки файлов, которые он изменяет.

В Windows git status использует, среди прочего, отметку времени файла и изменения размера файла, чтобы определить, изменился ли файл. Таким образом, поскольку отметка времени не обновлялась, оставался только размер файла. К сожалению, рассматриваемый файл был простой версией файла, содержание которого изменилось с 7.1.2 на 7.2.0 . Другими словами, размер файла также не изменился. Другие файлы, которые также были изменены WinMerge и не имели обновленных меток времени, но имели другой размер после того, как изменение было обнаружено git status, просто отлично.

Antred
источник
3

У меня была аналогичная проблема при использовании Sublime Text-3 . После внесения новых изменений в код и его сохранения, когда я попробовал команды git add ./status, я получил ответ «ветка уже обновлена». Я понял, что, несмотря на сохранение обновлений в текстовом редакторе, файл фактически не изменился. Открытие файла в другом редакторе и сохранение изменений у меня сработали.

Балрадж Гилл
источник
Это тоже происходит со мной,
Клоар
2

Вы переместили каталог из-под оболочки? Это может произойти, если вы восстановили свой проект из резервной копии. Чтобы исправить это, просто cdвойдите и вернитесь:

cd ../
cd -
SilverWolf - Восстановить Монику
источник
Вау, это было так. Псих. Остальные трюки вообще не сработали!
Makalele
1

В общем, с этой проблемой сначала убедитесь, что вы редактируете файл, который, как вы думаете, вы редактируете! У меня возникла эта проблема, когда я редактировал транспилированный файл JavaScript вместо исходного файла (транспилированная версия не находилась в системе контроля версий).

Крис Хэлкроу
источник
спасибо, что упомянули об этом! Я был так уверен, что обновляю нужный файл. Неа. лицо ладонь
Эшли
1

Мой клиент Git (Gitg) вызвал у меня эту проблему. Обычные команды, которые я обычно выполнял, не работали. Даже прикоснуться к каждому файлу в проекте не сработало.

Я нашел способ исправить это, но до сих пор не уверен, чем это вызвано. Скопируйте каталог вашего проекта. Недостающие файлы появятся в скопированном каталоге git status. Переименование может сделать то же самое.

Kagronick
источник
1

Заглянул в проблему, но это было всего два каталога, и мне неизвестно, что оба эти каталога были настроены как подмодули git. Как это произошло, я понятия не имею, но процесс заключался в том, чтобы следовать некоторым инструкциям по этой ссылке, но НЕ удалять каталог (как он делает в конце), а скорее сделатьgit add path/to/dir

Эндрю Ланк
источник
1

Когда вы редактируете файл в Visual Studio, он мгновенно появляется в списке изменений git, даже если файл не сохранен. Итак, все, что вам нужно сделать, это просто сохранить файл вручную (Ctrl + S для текущего отображаемого файла или Ctrl + Shift + S для всех файлов проекта), и git bash заберет их.

Яугенка
источник
У меня это сработало при добавлении комментариев к .jsфайлу, работая с Visual Studio Code. Спасибо.
SnuKies
0

Какой файл вы пытались загрузить? Теперь я трачу почти час на загрузку своей модификации css. Но этот css скомпилирован из файла стиля, поэтому git просто проигнорировал его. Когда я сменил источник стила, все заработало.

Надеюсь, это поможет.

Пакси
источник
0

Иногда зависит и от версии git, и если вы забыли это сделать git add ..

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

Onalbi
источник
0

Убедитесь , что не создавать символические ссылки ( ln -s source dest) из внутренней Git Bash для Windows.

Он НЕ создает символические ссылки, но делает ГЛУБОКУЮ копию источника в dest

Я испытал то же поведение, что и OP на терминале MINGW64 из Git Bash для Windows (версия 2.16.2), чтобы понять, что мои `` отредактированные '' изменения на самом деле были в исходном каталоге, а мои команды git bash были из глубокой копии, которая осталась без изменений.

Стивен Вернер CS
источник
0

У меня такая же проблема. Оказывается, у меня было две копии проекта, и мой терминал находился не в той папке проекта!

зар
источник
0

Со мной тоже случилось, что я пробовал вышеупомянутые методы, и ничего не помогло. Тогда решением было изменить файл через терминал, а не через графический интерфейс. Я не знаю, почему это сработало, но сработало. После того, как я отредактировал файл через nano с терминала, git распознал его как измененный, и я смог добавить его и зафиксировать.

Zed895
источник
Вы придумали решение для этого? Я борюсь с тем, что мой git не распознает мои измененные файлы, когда я использую какой-либо инструмент слияния, и единственный способ заставить git увидеть изменения - использовать nano для моих слияний, что занимает гораздо больше времени. Конфликтующие файлы изначально видны для git, а после того, как они отредактированы с помощью инструмента слияния, они отображаются в git как "неизмененные".
Лукас П.
Я не знаю, почему это работает и как это работает, но это работает для меня, спасибо
Амит Бишт,
0

У меня такая же проблема, VS2015 не распознал мои изменения файлов js, удаление пультов из настроек репозитория, а затем повторное добавление пути удаленного URL-адреса решило мою проблему.

Музафар Хасан
источник
0

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

Пкришна
источник
-1

У меня была эта проблема. Мой не работал, потому что я помещал свои файлы в папку .git внутри своего проекта.

Lafsnb
источник
-2

В моем случае делаю git reset --hardудаленные файлы и оставляю пустые папки. Изучив содержимое, я заметил, что каталоги пусты.

Однако git игнорирует пустые папки. (Исправление, git игнорирует все каталоги, поскольку он отслеживает содержимое, пустые папки не являются содержимым.)

мусор
источник
-4

попробуйте использовать git add * тогдаgit commit

Тих Хаур
источник
1
Добро пожаловать в SO! Скорее всего, это не ответ на вопрос, и здесь уже есть 9 ответов. Пожалуйста, направьте свои усилия на вопросы, на которые нужно ответить!
Крис