Перейти к содержимому

git commit

Определение

Команда git commit сохраняет все изменения, находящиеся в текущей области подготовки (staging area) проекта. Коммиты создаются для фиксации текущего состояния проекта. Зафиксированные снимки считаются безопасными версиями проекта, поскольку Git запрашивает подтверждение перед их изменением. Перед выполнением команды git commit используется команда git add для помещения изменений в область подготовки, откуда они будут сохранены в коммите.

Как это работает

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

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

git commit -aФиксирует снимок всех изменений в рабочей директории. Включаются только модификации отслеживаемых файлов.
git commit -m "commit message"Создает коммит с переданным сообщением. По умолчанию git commit открывает локально настроенный текстовый редактор, в котором нужно ввести сообщение коммита.
git commit -am "commit message"Объединяет опции -a и -m для помещения в область подготовки всех измененных отслеживаемых файлов и создания коммита с сообщением, указанным в строке.
git commit --amendИзменяет последний коммит. Изменения из области подготовки добавляются к предыдущему коммиту. Эта команда открывает системный текстовый редактор и позволяет изменить ранее указанное сообщение коммита.

Сохранение изменений с помощью коммита

В следующем примере у нас есть файл w3docs.txt с измененным содержимым на текущей ветке. Чтобы зафиксировать снимок файла, сначала нужно поместить его в область подготовки с помощью команды git add.

Команда git add

bash
git add w3docs.txt

Выполнение git add переместит файл w3docs.txt в область подготовки Git. Используйте команду git status, чтобы увидеть результат.

git status

bash
git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: w3docs.txt

Результат указывает на то, что w3docs.txt будет сохранен следующим коммитом. Коммит создается путем выполнения:

Git commit

bash
git commit

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

git commit в редакторе

bash
# 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 (conventional commit) кратко описывает изменение в первой строке (до 50 символов), за которой следует пустая строка и подробное объяснение. Например:

Сообщение git commit

bash
Change the message displayed by w3docs.txt

- Update the sayHello() function to get the username
- Change the sayGoodbye() function to a more welcoming message

Первая строка сообщения коммита — это заголовок (subject), остальное — его тело (body).

Как обновить (изменить) коммит

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

git add и git commit

bash
git add w3docs.txt
git commit --amend

Git commit vs svn commit

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

Снимки, а не различия

Git основан на снимках, тогда как SVN отслеживает различия в файлах. svn commit записывает diff, который применяется к исходному файлу в репозитории. Git записывает полное состояние проекта в каждом коммите. При сохранении состояния проекта Git делает снимок текущих файлов и сохраняет ссылку на этот снимок. Если файл не изменился, Git не сохраняет его повторно, что оптимизирует хранение.

git file diff

Snapshots

Practice

Какие характеристики и опции у команды 'git commit'?

Считаете ли это полезным?

Предпросмотр dual-run — сравните с маршрутами Symfony на продакшене.