Чому git не визнає, що мій файл змінено, тому git add не працює


98

Я намагаюся надсилати свої файли до github за допомогою bash. Вони вже там, і я завантажую нову версію з новими рядками та кодом і т. Д. Але коли я намагаюся, git addа потім git statusпише:

На майстрі гілки

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

І файл, який я використовую, був щойно змінений.


4
якщо ви вже здійснили комісію, то вам не було б чого робити, перевірте git log.
Граді Граді

2
який результат git diff?
maazza

2
@maazza Я нічого не отримую від git diff
somerandomguy

1
Якщо git diff(або git status) не показує нічого, що пояснює, чому немає чого додати. Тож питання насправді: "Чому git не визнає, що мій файл змінено?"
Суніл Д.

Вибачте, хлопці, я бачу, що відбувається. Git не бачить, що візуальна студія C # змінила це, але бачить, коли щось інше змінило, наприклад notepad ++
somerandomguy

Відповіді:


127

У мене була проблема, коли колись давно я встановив 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 перезавантажити git index з останнього коміту.


18
git add -f path/to/the/fileвін примусово додасть файли для коміту.
Сан,

2
Ця відповідь була єдиною, яка допомогла виправити мою проблему. Не впевнений, що це річ для Windows (у мене ніколи раніше не було таких проблем, як у osx, так і в linux). Тож завдяки @ThorSummoner. До речі, я спробував git add -fфайл, який знаходився у такому "припустимо незмінному" стані, і він не спрацював - мусив або, git update-indexабо git rm --cachedпісля нього a, git resetщоб він працював.
rsenna

1
Крім того, якщо ви дійсно не впевнені у своєму поточному стані репо, зробіть це: git rm --cached -r .а потім git reset ..
rsenna

Є ще один варіант спробувати, git update-index --no-skip-worktree path/to/fileтаким чином я вирішив свою проблему
Fr0sT

1
Працював у мене, але так, лише окремі справи.
Thomas Cheng

24

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

Це виявилося для мене, коли у мене була подібна проблема.


1
Я використовував gitignore.io для створення свого .gitignore, і я знайшов рядок з тим lib/, що змушує git ігнорувати цю папку. З цим немає проблем - принаймні, якщо ця папка не є основною папкою вашого проекту, як, наприклад, те, що сталося зі мною.
Паладіні

І для когось у моєму випадку це був насправді мій глобальний
файл

Спочатку це не спрацьовувало. Але я змусив це працювати. У моєму випадку річ, яку слід ігнорувати, двічі згадувалася у файлі gitignore. Завжди шукайте всі випадки і замінюйте всі.
MasterJoe

8

Звучить божевільно, але іноді ви не в правильному репо, хоча думаєте, що є. Наприклад, ви могли перенести батьківський каталог, але забули змінити репозиторії у текстовому редакторі. Або навпаки: ви знаходитесь у правильному репо в текстовому редакторі, але неправильне репо в командному рядку. У першій ситуації ви вносите зміни у потрібний файл, але це не та сама папка, яка відкрита у вашому командному рядку, тому насправді це неправильний файл. У другій ситуації ви насправді відредагували правильний файл, але ваш командний рядок git не розпізнає зміни, оскільки ви знаходитесь не у правильному каталозі в командному рядку.


8

Як вже було обговорено, файли, ймовірно, були позначені позначкою "взяти-не змінити", що в основному говорить git, що ви не будете модифікувати файли, тому йому не потрібно відстежувати зміни з ними. Однак це може впливати на кілька файлів, і якщо це велика робоча область, ви, можливо, не захочете перевіряти їх усі по одному. У цьому випадку ви можете спробувати: git update-index --really-refresh

згідно з документами:

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

Це в основному змусить git відстежувати зміни всіх файлів незалежно від прапорів "припустити незмінним".


1
Для мене 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:]]'Якщо нічого не допомагає, створіть запитання з додатковою інформацією, щоб ми могли допомогти ви.
Андре Кунья,

7

ну, у нас недостатньо, щоб відповісти на це питання, тому я дам вам кілька здогадок:

1) Ви сховали свої зміни, щоб виправити тип: git stash pop

2) у вас були зміни, і ви їх здійснили, ви мали б змогу побачити своє комітування в git log

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

4) ви перевіряли одне і те ж репо кілька разів, і ви потрапили не в те.


1) не знайдено схованки 2) Я вніс зміни та здійснив комісію, тож чи можу я зробити ще раз? 3) Я цього не зробив 4) Я перебуваю у правильному репо
somerandomguy

якщо у вас були зміни і їх було здійснено, то вам добре перейти до наступного кроку, натиснути або будь-який ваш робочий процес ... Ви можете зробити коміт ще раз, якщо у вас є більше змін, ви можете навіть, git commit --amendякі внесуть ваші нові зміни у ваш останній коміт , не робіть цього, якщо ви вже поділилися своїм комітом.
Граді Грейді

Закриття та повторне відкриття терміналу зробило це для мене після очищення репо проекту.
Едді,

4

Було таке забавне, як це. Git-плагін Eclipse Kepler автоматично позначав усі мої папки проекту як проігноровані в папці .gitignore.

Коли я отримав commitв Teamменю, вони всі готові повернутися до проігноровані. Наскільки я можу зрозуміти, це було тому, що я встановив їх як похідні в батьківському проекті. Позначення їх як derviedвиправлене. Я ніколи раніше не бачив цього на "Індіго". Сподіваюся, це комусь допоможе.


Будь-яка ідея, як цю проблему можна виправити, коли це відбувається в intellij?
MasterJoe

3

TL; DR; Ви навіть у правильному сховищі?

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

Насправді на моїй машині я мав два окремі сховища git repo1і repo2настроював їх в одному кореневому каталозі source. Ці два сховища - це, по суті, сховища двох продуктів, які я розробляю та працюю у своїй компанії. Зараз справа в тому, що як стандартна настанова, структура каталогів вихідного коду всіх продуктів абсолютно однакова в моїй компанії.

Отже, не підозрюючи, я змінив точно такий самий файл, в repo2якому я повинен був змінитись repo1. Таким чином, я просто продовжував працювати команду git statusна repo1і продовжував давати те саме повідомлення

На майстрі гілки

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

півгодини. Потім мій колега спостерігав за нею як за незалежну пару очей і довів це до відома, що я потрапив у неправильне, але схоже схоже сховище. У той момент, коли я перейшов на repo1Git, я почав помічати змінені файли.

Не такий поширений випадок. Але ніколи не знаєш!


3

Це траплялося в Windows під час зміни файлів шляхом передачі відмінностей за допомогою інструмента WinMerge. Очевидно, WinMerge (принаймні так, як це налаштовано на моєму комп'ютері) іноді не оновлює позначки часу файлів, які він змінює.

У Windows git status , серед іншого, використовує позначку часу файлу та зміни розміру файлу, щоб визначити, змінився файл чи ні. Отож, оскільки мітка часу не була оновлена, вона мала лише розмір файлу. На жаль, файл, про який йде мова, був простим файлом версії, вміст якого змінився з 7.1.2 на 7.2.0 . Іншими словами, розмір файлу також залишився незмінним. Інші файли, які також були змінені WinMerge і не оновлювали мітки часу, але мали інший розмір після того, як зміни були виявлені за допомогою стану git .


3

У мене була подібна проблема під час використання Sublime Text-3 . Після внесення нових змін у код та збереження його, коли я спробував команди git add ./status, відповідь була "гілка вже оновлена". Я зрозумів, незалежно від збереження оновлень у текстовому редакторі, файл фактично не змінився. Відкриття файлу в іншому редакторі та збереження змін у мене спрацювали.


Це трапляється і зі мною
Клоар,

2

Ви перемістили каталог з-під вашої оболонки? Це може статися, якщо ви відновили проект із резервної копії. Щоб виправити це, просто cdвийдіть і поверніться:

cd ../
cd -

Ого, це було так. Божевільний Чергові фокуси взагалі не спрацювали!
Макалеле

1

Загалом із цією проблемою спершу перевірте, чи редагуєте ви файл, яким вважаєте себе! У мене була ця проблема, коли я редагував перекладений файл JavaScript замість вихідного файлу (перекладена версія не перебувала під контролем джерела).


дякую, що згадали про це! Я був настільки впевнений, що оновлюю потрібний файл. Ні. долоня на обличчі
Ешлі

1

Мій клієнт Git (Gitg) спричинив цю проблему для мене. Звичайні команди, які я зазвичай виконую, не працювали. Навіть торкання кожного файлу в проекті не спрацювало.

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


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, складений із файлу styl, тому git просто ігнорував його. Коли я змінив джерело стилів, тоді все працювало.

Сподіваюся, це допоможе.


0

Іноді залежить і версія git, і якщо ви забудете це зробити git add ..

Для перевірки змін у сховищі використовуйте завжди git statusте, що показує всі відстежені та змінені файли. Тому що git diffпоказувати лише додані файли.


0

Переконайтеся , що НЕ створювати символічні посилання ( ln -s source dest) з внутрішньої Git Bash для Windows.

Він НЕ робить символічних посилань, але робить ГЛИБОКУ копію джерела до dest

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


0

У мене була та сама проблема. Виявляється, у мене було дві копії проекту, і мій термінал знаходився в неправильній папці проекту!


0

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


Ви знайшли рішення для цього? Я боровся зі своїм git, не розпізнаючи мої змінені файли, коли використовую будь-який інструмент злиття, і єдиний спосіб отримати git, щоб побачити зміни, - це використання nano для мого злиття, що займає набагато більше часу. Конфліктні файли спочатку бачать git, після редагування інструментом злиття вони відображаються у git як "незмінені".
Лукас П.

я не знаю, чому це працює і як це працює, але це працює для мене, дякую
Аміт Бішт

0

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


0

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


-1

У мене було це питання. Мій не працював, оскільки я розміщував свої файли в папці .git у своєму проекті.


-2

У моєму випадку виконую git reset --hardвидалені файли і залишаю кілька порожніх папок. Перевіривши вміст, я помітив, що каталоги порожні.

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


-4

спробуйте використати git add * тодіgit commit


1
Ласкаво просимо до SO! Це, ймовірно, не відповідає на питання, і тут вже є 9 відповідей. Зверніть свої зусилля на запитання, на які потрібно відповісти!
Cris Luengo
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.