W3docs

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 file diff

Snapshots

Связанные команды

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

Практика

Практика
Каковы характеристики и параметры команды 'git commit'?
Каковы характеристики и параметры команды 'git commit'?
Was this page helpful?