Сохранение изменений

Сохранение изменений

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

Процессы сохранения в Git и SVN также отличаются. Коммиты, или «фиксации», в SVN — это операции передачи на централизованный удаленный сервер. Это означает, что для «сохранения» изменений в проекте коммитам SVN необходим доступ в Интернет. Коммиты Git можно создавать и выполнять локально, а затем по мере необходимости отправлять на удаленный сервер с помощью команды git push -u origin main. Различие этих двух методов объясняется фундаментальными отличиями в архитектуре. В Git реализована модель распределенного приложения, а в SVN — модель централизованного приложения. Обычно распределенные приложения более устойчивы, поскольку не имеют единой точки отказа, такой как централизованный сервер.

В Git имеется дополнительный механизм сохранения, который называется «stash». Stash — это временная область для хранения изменений, не готовых к коммиту. Команда stash работает с рабочим каталогом (первым из трех деревьев) и имеет множество вариантов применения. Подробнее см. на странице команды git stash.

Репозиторий Git можно настроить на игнорирование определенных файлов или каталогов. В этом случае Git не будет сохранять изменения в игнорируемом контенте. В Git имеется несколько способов настройки для управления списком игнорирования. Более подробно настройка игнорирования в Git рассматривается на странице git ignore.

git add

Команда git add добавляет изменение из рабочего каталога в раздел проиндексированных файлов. Она сообщает Git, что вы хотите включить изменения в конкретном файле в следующий коммит. Однако на самом деле команда git add не оказывает существенного влияния на репозиторий: изменения регистрируются в нем только после выполнения команды git commit.

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

Порядок действий

Команды git add и git commit составляют основу рабочего процесса Git. Эти две команды должен изучить и понимать каждый пользователь Git, независимо от модели совместной работы, принятой в его команде. Эти команды используются для записи версий проекта в историю репозитория.

Работа над проектом ведется по стандартной схеме «редактирование — индексирование — коммит». Сначала вы редактируете файлы в рабочем каталоге. Когда вы будете готовы сохранить копию текущего состояния проекта, вы индексируете изменения командой git add. Затем вы вызываете команду git commit, которая добавляет проиндексированный снимок состояния в историю проекта. Для отмены коммита или проиндексированного снимка состояния используется команда git reset.

Для полноценного процесса совместной работы в Git помимо git add и git commit необходима третья команда — git push. git push используется для отправки подтвержденных изменений в удаленные репозитории для совместной работы, чтобы к набору сохраненных изменений могли получить доступ другие участники команды.

Обучающий материал по Git: иллюстрация команды git add

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

Раздел проиндексированных файлов

Основное назначение команды git add состоит в переносе ожидающих изменений из рабочего каталога в раздел проиндексированных файлов Git. Раздел проиндексированных файлов — это уникальная возможность Git, и если вы прежде работали с SVN (или даже с Mercurial), вам потребуется некоторое время, чтобы освоить ее. Этот раздел удобно рассматривать как буфер между рабочим каталогом и историей проекта. Раздел проиндексированных файлов является одним из «трех деревьев» Git, наряду с рабочим каталогом и историей коммитов.

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

Распространенные опции

git add <file>

Проиндексировать все изменения в файле <file> для следующего коммита.

git add <directory>

Проиндексировать все изменения в каталоге <directory> для следующего коммита.

git add -p

Начать интерактивный сеанс индексирования, во время которого вы сможете выбрать части файла, которые будут добавлены в следующий коммит. Команда представит фрагмент изменений и предложит вам ввести команду. Введите y, чтобы проиндексировать фрагмент; n, чтобы игнорировать фрагмент; s, чтобы разбить его на более мелкие фрагменты; e, чтобы вручную отредактировать фрагмент; q, чтобы завершить работу с командой.

Примеры

Когда вы только начинаете новый проект, команда git add выполняет ту же функцию, что и svn import. Чтобы создать первичный коммит текущего каталога, используйте следующие две команды:

git add .
git commit

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

git add hello.py
git commit

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

Резюме

Подведем итоги. Команда git add — это первая команда в цепочке операций, предписывающей Git «сохранить» снимок текущего состояния проекта в истории коммитов. Когда git add используется как отдельная команда, она переносит ожидающие изменения из рабочего каталога в раздел проиндексированных файлов. Команда git status проверяет текущее состояние репозитория; с ее помощью можно убедиться, что команда git add добавила нужные изменения. Команда git reset используется для отмены команды git add. Команда git commit сохраняет снимок состояния из раздела проиндексированных файлов в истории коммитов репозитория.

Готовы изучить Git?

Ознакомьтесь с этим интерактивным обучающим руководством.

Начните прямо сейчас