Почему «git commit» не сохраняет мои изменения?


251

Я сделал git commit -m "message"так:

> git commit -m "save arezzo files"
# 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:   arezzo.txt
#       modified:   arezzo.jsp
#
no changes added to commit (use "git add" and/or "git commit -a")

Но потом, когда я это делаю, git statusон показывает те же измененные файлы:

> 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:   arezzo.txt
#       modified:   arezzo.jsp
#
no changes added to commit (use "git add" and/or "git commit -a")

Что я делаю не так?


16
Используйте git commit -am "save arezzo files"для автоматического добавления всех изменений (относительно .gitignore). Вы можете добавить только определенные файлы / git add file.src
каталоги

Ответы:


400

Как говорится в сообщении:

изменения не добавлены в коммит (используйте «git add» и / или «git commit -a»)

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


Для вашего конкретного примера вы можете использовать:

git commit -am "save arezzo files"

(обратите внимание на дополнительное aв флагах, также можно записать как git commit -a -m "message"- оба делают одно и то же)

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

Вы также можете найти общую документацию и учебные пособия по использованию git на странице документации git, которая даст более подробную информацию о концепции размещения / добавления файлов.


Еще одна вещь, о которой стоит знать, это интерактивная подготовка. Она позволяет добавлять части файла в область подготовки, поэтому, если вы внесли три разных изменения кода (для связанных, но разных функций), вы можете использовать интерактивный режим для разделения вносить изменения и добавлять / фиксировать каждую часть по очереди. Может быть полезно иметь такие конкретные коммиты меньшего размера.


@PeterBoughton Вы имели в виду «интерактивное добавление» вместо «интерактивное добавление»?
djb

3
Нет, я имел в виду интерактивное добавление.
Питер Боутон

2
Локальный репозиторий сам по себе является своего рода промежуточной областью перед передачей кода в удаленный репозиторий. Зачем добавлять еще один «слой» перед внесением изменений, не слишком ли это сложно? Я новичок в git, но я думаю, что 99,99% разработчиков всегда используют commit -am, потому что изменения все равно не выходят за пределы их локальной среды.
PawelRoman

2
Я думаю, что только что столкнулся с этим, потому что я привык к тому, что моя IDE заботится обо мне. Не уверен, почему это необходимый шаг, но опять же, есть много о мерзавце, которого я не понимаю ... Я имею в виду мерзавец ...
trpt4him

49

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

git add filename1 filename2

или добавьте все изменения (из корневого пути проекта)

git add .

или используйте сокращение -aпри совершении:

git commit -a -m "message".

Кроме того, я настоятельно призываю пользователей использовать интерактивные добавления. Особенно, когда вы пытаетесь делать хорошие небольшие коммиты, которые легко обратимы.
жер

40

Ты должен сделать:

git commit . -m "save arezzo files"

4
Похоже, это правильный ответ на вопрос ОП. Он не хотел «добавлять», он хотел зафиксировать то, что было изменено.
VectorVortec

8

Я скопировал небольшой подпроект, который у меня был под управлением исходного кода Git, в другой проект и забыл удалить папку .git. Когда я пошел к фиксации, я получил то же сообщение, что и выше, и не мог его очистить, пока не удалил .gitпапку.

Это немного глупо, но стоит проверить, что у вас нет папки .git в папке, которая не фиксируется.


7

Вы могли бы сделать:

git add -u -n

Чтобы проверить, какие файлы вы изменили и собираетесь добавить (пробный запуск: -n опция), а затем

git add -u

Чтобы добавить только измененные файлы


4

Я обнаружил, что эта проблема появляется, когда я сделал git add .в подкаталоге ниже, где находится мой .gitignoreфайл (так сказать, домашний каталог моего хранилища). Попробуйте изменить каталоги на самый верхний каталог и запустить, git add .а затем git commit -m "my commit message".


4

Может быть, очевидная вещь, но ...

Если у вас есть проблемы с индексом, используйте git-gui . Вы получите очень хорошее представление о том, как на самом деле работает индекс (область подготовки).

Другим источником информации, который помог мне понять индекс, был Скотт Чаконс «Getting Git», стр. 259 и далее.

Я начал с командной строки, потому что большая часть документации показала, что ...

Я думаю, что git-gui и gitk на самом деле заставляют меня работать быстрее, и я избавился от вредных привычек, таких как, например, «git pull» ... Теперь я всегда сначала выбираю ... Посмотрите, какие новые изменения есть на самом деле, прежде чем я сливаюсь.


3

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

rm -rf .git

В моем случае у меня было приложение WordPress, и папка, которую я добавил внутри, была темой. Поэтому мне пришлось перейти в корень темы и удалить файл Git, чтобы весь проект теперь отслеживался родителем, приложением WordPress.


1

если у меня есть больше файлов в моем случае, у меня есть 7000 файлов изображений, когда я пытаюсь добавить их из папки маршрута проекта, он не добавил их, но когда я иду в папку изображений, все в порядке. Пройдите через целевую папку и введите команду abows

git add .
git commit -am "image uploading"
git push origin master

git push origin master Перечисление объектов: 6574, сделано. Подсчет объектов: 100% (6574/6574), сделано. Дельта-сжатие с использованием до 4-х потоков. Сжатие объектов: 100% (6347/6347), сделано. Письменные объекты: 28% (1850/6569), 142,17 МиБ | 414,00 КиБ / с


0

У меня была проблема, когда я делал это commit --amendдаже после выдачи, git add .и она все еще не работала. Оказывается, я сделал некоторые .vimrcнастройки, и мой редактор не работал правильно. Исправление этих ошибок так, чтобы vimвозвращался правильный код, решило проблему.


0

У меня была очень похожая проблема с тем же сообщением об ошибке. «Изменения не сделаны для коммита», но когда я делаю разницу, это показывает различия. Я наконец понял, что некоторое время назад я изменил дело с каталогами. ех. «PostgeSQL» - «postgresql». Как я сейчас помню, иногда git оставляет один или два файла в старом каталоге case. Затем вы передадите новую версию новому делу.

Таким образом, мерзавец не знает, на кого положиться. Чтобы решить эту проблему, мне пришлось зайти на сайт GitHub. Тогда вы сможете просмотреть оба случая. И вы должны удалить все файлы в неправильном каталоге. Убедитесь, что у вас сохранена правильная версия в правильном каталоге.

Как только вы удалите все файлы в старом каталоге, весь этот каталог исчезнет. Затем сделайте коммит.

На этом этапе вы сможете выполнять Pull на локальном компьютере и больше не видеть конфликтов. Таким образом, возможность совершить снова. :)


0

Если у вас есть подпапка, которая была клонирована из другого git-Repository, сначала вы должны удалить файл $ .git $ из child-Repository: rm -rf .git после этого вы можете перейти в родительскую папку и использовать git add -A.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.