git commit
Всё о команде git commit: что это такое, как она работает и основные параметры для сохранения изменений в истории репозитория.
Команда git commit записывает проиндексированные изменения в историю репозитория в виде нового снимка. Каждый коммит — это постоянная именованная точка, к которой можно вернуться, сравнить с другими или поделиться с коллегами. На этой странице объясняется, что такое коммит, как устроен рабочий процесс «индексирование → коммит», какие параметры используются чаще всего, как писать хорошие сообщения коммитов и чем модель снимков Git отличается от более старых систем, таких как SVN.
Определение
Команда git commit сохраняет все текущие проиндексированные изменения проекта. Коммиты создаются для фиксации текущего состояния проекта. Зафиксированные снимки считаются безопасными версиями проекта, поскольку они хранятся в локальной истории и Git не изменяет их без вашего ведома. Перед запуском git commit вы используете команду git add, чтобы проиндексировать изменения, которые будет содержать коммит.
Коммит состоит из трёх элементов:
- Снимок всех отслеживаемых файлов на момент создания коммита (не диф — см. раздел Снимки, а не различия ниже).
- Метаданные: автор, метка времени и написанное вами сообщение.
- Указатель на родителя — ссылка на предыдущий коммит, благодаря которой Git выстраивает историю, доступную для просмотра с помощью git log.
Каждый коммит идентифицируется уникальным 40-символьным хэшем SHA-1 (например 9fceb02...), который при обращении к коммиту можно сократить до первых семи символов.
Как это работает
Снимки Git фиксируются в вашем локальном репозитории. Git позволяет накапливать коммиты локально, не отправляя изменения немедленно на центральный сервер. Публикация выполняется позже с помощью git push. Такое разделение даёт ряд преимуществ:
- Разбиение функции на коммиты — каждый шаг остаётся небольшим и удобным для проверки.
- Группировка связанных изменений в один самодостаточный коммит.
- Очистка локальной истории (сплющивание, переименование, переупорядочивание) перед публикацией.
- Работа офлайн — можно делать коммиты в самолёте и отправить их при восстановлении соединения.
Типичный жизненный цикл изменения: рабочий каталог → область индексирования → коммит: вы редактируете файлы, запускаете git add для индексирования нужных частей, затем git commit для их записи. Всё, что не проиндексировано, остаётся в рабочем каталоге и не включается в коммит.
Основные параметры
| git commit -a | Создаёт снимок всех изменений в рабочем каталоге. Учитываются только изменения в уже отслеживаемых файлах. |
|---|---|
| git commit -m "commit message" | Создаёт коммит с переданным сообщением. По умолчанию git commit открывает настроенный текстовый редактор для ввода сообщения. |
| git commit -am "commit message" | Объединяет параметры -a и -m: индексирует все изменённые отслеживаемые файлы и создаёт коммит со встроенным сообщением. |
| git commit --amend | Изменяет последний коммит. Проиндексированные изменения добавляются к предыдущему коммиту, а редактор открывается для изменения сообщения. |
git commit -a (и -am) индексирует только те файлы, которые Git уже отслеживает. Новые файлы никогда не подхватываются автоматически — их необходимо предварительно добавить через git add. При необходимости используйте git status.
Сохранение изменений с помощью коммита
В следующем примере у нас есть файл w3docs.txt с изменённым содержимым в текущей ветке. Чтобы зафиксировать проиндексированный снимок файла, сначала нужно проиндексировать его командой git add.
Команда git add
git add w3docs.txtВыполнение git add переместит файл w3docs.txt в область индексирования Git. Используйте команду git status для просмотра результата.
git status
git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: w3docs.txtВывод указывает, что w3docs.txt будет сохранён при следующем коммите. Коммит создаётся выполнением:
Git commit
git commitЗапуск git commit открывает текстовый редактор (его можно настроить через git config) с запросом сообщения коммита и списком фиксируемых изменений:
git commit в редакторе
# Enter the commit message of your changes. Lines that start
# with '#' will be ignored, an empty message breaks off the commit.
# On branch master
# Changes needed to be committed:
# (use "git reset HEAD ..." to unstage)
#
#modified: w3docs.txtСтандартный формат сообщения коммита в Git — краткое описание изменения в первой строке (не более 50 символов), затем пустая строка и подробное объяснение. Например:
Сообщение git commit
Change the message displayed by w3docs.txt
- Update the sayHello() function to get the username
- Change the sayGoodbye() function to a more welcoming messageПервая строка — это тема; остальное — тело. Сохраните и закройте редактор для завершения коммита.
Как писать хорошее сообщение коммита
Чёткое сообщение делает историю удобной для поиска и упрощает проверку. Широко используемое соглашение:
- Ограничивайте строку темы 50 символами и пишите её в повелительном наклонении («Add login form», а не «Added» или «Adds»).
- Не завершайте тему точкой.
- Оставляйте пустую строку между темой и телом — многие инструменты на это полагаются.
- Переносите строки тела примерно через 72 символа и объясняйте почему было сделано изменение, а не только что именно изменилось.
Коммит со встроенным сообщением
Для небольших однозадачных изменений редактор обычно пропускают и передают сообщение напрямую:
git commit -m "Update greeting in w3docs.txt"Используйте git commit -am "...", чтобы проиндексировать все изменённые отслеживаемые файлы и выполнить коммит за один шаг.
Как обновить (изменить) коммит
git commit --amend заменяет последний коммит вместо добавления нового. Это полезно, когда вы забыли проиндексировать файл или хотите исправить опечатку в последнем сообщении. Редактор открывается с уже заполненным предыдущим сообщением:
git add и git commit
git add w3docs.txt
git commit --amendЧтобы изменить только сообщение без открытия редактора:
git commit --amend -m "Corrected commit message"Изменение перезаписывает последний коммит и присваивает ему новый хэш. Изменяйте только те коммиты, которые вы ещё не отправили и не опубликовали — перезапись публичной истории вынудит всех остальных согласовывать свои копии. Чтобы отменить коммит, который вы ещё не отправили, используйте git reset.
Git commit vs svn commit
SVN — это централизованная модель приложения, тогда как Git — распределённая. SVN commit отправляет изменения с локального клиента в централизованный репозиторий. В Git снимки фиксируются в локальном репозитории. Коммиты Git можно отправлять в произвольные удалённые репозитории.
Снимки, а не различия
Git основан на снимках, тогда как SVN отслеживает различия в файлах. Команда svn commit записывает диф, применяемый к исходному файлу в репозитории. Git записывает полное состояние проекта в каждом коммите. При сохранении состояния проекта Git делает снимок текущих файлов и сохраняет ссылку на этот снимок. Если файл не изменился, Git не хранит его повторно, что оптимизирует использование хранилища.


Связанные команды
- git add — проиндексируйте изменения перед коммитом.
- git status — посмотрите, что проиндексировано, а что нет.
- git log — просмотрите историю сделанных коммитов.
- git reset — снимите файлы с индексирования или отмените коммит.
- git push — опубликуйте локальные коммиты в удалённый репозиторий.