Эта статья — шпаргалка по команде commit и сопутствующим ей командам: add, rm, reset. Здесь рассказывается, как отправить файлы в локальный репозиторий (commit), как подготовить их к отправке (add), как отменить последний снимок (с помощью команды reset) и как удалить отдельные файлы из индекса или даже из снимка.
Команда git add
Команда commit отправляет файлы в локальный репозиторий.
Однако перед выполнением команды commit надо подготовить файлы — составить список тех из них, которые будут отправлены в репозиторий. Команда git add позволяет это сделать — добавляет файлы и папки в индекс (область staging area). В GIT есть понятие staged files — это файлы, которые попадут в следующий снимок при выполнении команды commit.
Дело в том, что в параметрах commit не указывается, какие файлы включать в снимок. Это делается заранее в команде add, а в команде commit пишется просто комментарий и в репозиторий отправляются все подготовленные файлы из индекса (staging area).
Можно добавлять в индекс как файлы, так и папки. Например, эта команда подготовит для будущего снимка папку <имя_папки1> и файл <имя_файла1>:
git add <имя_файла1> <имя_папки1>
При этом все остальные файлы, даже если они отслеживаются в репозитории (tracked files) и были отредактированы (edited files), в следующий снимок не попадут.
Есть удобные вариации команды add:
git add -A добавляет все файлы (вновь созданные, измененные и удаленные) git add . добавляет вновь созданные и измененные файлы, но не удаленные git add -u добавляет измененные и удаленные, но не вновь созданные
Нетрудно заметить, что команда:
git add -A
эквивалентна двум поочередно выполненным командам:
git add . git add -u
Удаление файлов из репозитория и с диска
Возможно, вам покажется странной фраза «добавляет удаленные файлы». На самом деле это нормально: чтобы удалить файл из локального репозитория, недостаточно просто удалить его с диска. Надо после этого еще выполнить определенную команду git.
Если речь идет об отдельном файле, то команда:
git rm <имя_файла>
добавляет файл <имя_файла> в индекс как удаленный. При этом файл удаляется и с диска, если еще не был удален оттуда.
А команда:
git add -u
позволяет выполнить git rm для всех удаленных с диска файлов одновременно, то есть отправить их в индекс.
Удаление файлов только из репозитория
Бывает надо удалить файлы из репозитория, но не удалять с диска. Например, мы отправили в репозиторий логи, которым там не место.
А на диске они должны оставаться. Чтобы добавить этот лог в индекс как удаленный, но оставить его при этом на диске, выполним команду:
git rm --cached mylogfile.log
То же самое для папки делается так:
git rm --cached -r mydirectory
Что войдет в следующий снимок
Чтобы посмотреть, что же вы итоге подготовили для снимка, выполните команду:
$ git diff --name-only --cached
Благодаря параметру —name-only выведутся только названия файлов.
Команда git commit
А дальше просто — отправьте в локальный репозиторий все находящиеся в индексе файлы, комментарий обязателен:
$ git commit -m "комментарий"
Эта команда создает новый snapshot — снимок репозитория. К этому снимку можно будет вернуться в будущем. Ваши данные и комментарий будут также доступны при просмотре истории.
add и commit одной строкой
Бывает удобным отправлять файлы в репозиторий побыстрее, не выполняя по очереди add и commit. Можно выполнить эти команды и вместе:
git commit -a -m "комментарий"
Вышеприведенная команда — это то же самое, что выполненные по очереди команды:
git add . git commit -m "комментарий"
Кратко это звучит как «добавь в индекс все измененные файлы и сделай снимок с указанным комментарием».
Обратите внимание, что удаленные файлы затронуты не будут.
Но можно создать в конфигурации любую команду из комбинации add и commit (правда, это редко используется):
git config --global alias.add-commit '!git add -A && git commit'
Мы создали команду add-commit. И с помощью нее можем выполнять действия:
git add-commit -m 'комментарий'
Как отменить последний commit
Чтобы отменить последний локальный commit, выполните команду:
git reset HEAD~1
HEAD~1 указывает на предыдущую ревизию, так что команда вернет репозиторий к предыдущему состоянию.
Как отменить git add
Чтобы удалить все файлы из staging area, выполните команду:
git reset
Чтобы удалить конкретный файл, выполните команду:
git reset <имя_файла>
Как удалить некоторые файлы из снимка
Специальной команды тут нет. Для этого надо отменить последнюю команду commit. Эта команда сдвигает указатель на предыдущее состояние:
git reset HEAD~1
В индексе останутся файлы. Надо удалить из индекса нежелательный файл:
git reset path/to/unwanted_file
Подробнее о команде reset читайте здесь.
И затем снова отправить файлы в репозиторий. Следующая команда позволит задействовать при отправке метаданные предыдущего коммита, в том числе предыдущий комментарий:
git commit -c ORIG_HEAD
ORIG_HEAD — ссылка на предыдущий снимок.
Как исправить комментарий снимка
Допустим, мы уже отправили изменения в локальный репозиторий, но надо исправить комментарий, так как в него закралась ошибка. Делаем так:
git commit --amend -m 'новый комментарий'