2021-03-18 12:10:03 +01:00
---
draft: false
aliases: ["/ru/"]
---
# Соглашение о коммитах 1.0.0
## Главное
Спецификация «Соглашение о коммитах» — простое соглашение о том, как нужно
писать сообщения коммитов. Оно описывает простой набор правил для создания
понятной истории коммитов, а также позволяет проще разрабатывать инструменты
автоматизации, основанные на истории коммитов. Данное соглашение совместимо с
2021-08-13 10:11:50 +02:00
[Семантическим Версионированием ](https://semver.org/lang/ru/ ), описывая новые функции, исправления и
2021-03-18 12:10:03 +01:00
изменения, нарушающие обратную совместимость в сообщениях коммитов.
Сообщения коммитов должны быть следующей структуры:
---
```
< тип > [необязательный контекст]: < описание >
[необязательное тело]
[необязательная(ые) сноска(и)]
```
---
< br / >
Коммит содержит следующие структурные элементы для передачи намерений
пользователям вашей библиотеки:
1. **fix:** коммит _типа _ `fix` исправляет б а г в вашем коде (соответствует
2021-08-13 10:11:50 +02:00
[`PATCH` ](https://semver.org/lang/ru/#%D0%BA%D1%80%D0%B0%D1%82%D0%BA%D0%BE ) в Cе ма нтиче с ко м Версионировании).
2021-03-18 12:10:03 +01:00
1. **feat:** коммит _типа _ `feat` добавляет новую функцию в ваш код
2021-08-13 10:11:50 +02:00
(соответствует [`MINOR` ](https://semver.org/lang/ru/#%D0%BA%D1%80%D0%B0%D1%82%D0%BA%D0%BE ) в Cе ма нтиче с ко м Версионировании).
2021-03-18 12:10:03 +01:00
1. **BREAKING CHANGE:** коммит, который имеет _с но с ку _ `BREAKING CHANGE` или
коммит, заканчивающийся восклицательным знаком (`!`) после _типа _ или
_ко нте кс та _ , вводящий изменение(я), нарушающие обратную совместимость
2021-08-13 10:11:50 +02:00
(соответствует [`MAJOR` ](https://semver.org/lang/ru/#%D0%BA%D1%80%D0%B0%D1%82%D0%BA%D0%BE ) в Cе ма нтиче с ко м Версионировании).
2021-03-18 12:10:03 +01:00
`BREAKING CHANGE` может быть частью коммита любого _типа _ .
1. Другие _типы_ коммитов разрешены. Например,
2021-08-13 10:11:50 +02:00
[@commitlint/config-conventional ](https://github.com/conventional-changelog/commitlint/tree/master/%40commitlint/config-conventional ) (основан
на [соглашении Angular ](https://github.com/angular/angular/blob/22b96b9/CONTRIBUTING.md#-commit-message-guidelines )) рекомендует `build` , `chore` ,
2021-03-18 12:10:03 +01:00
`ci` , `docs` , `style` , `refactor` , `perf` , `test` и другие.
2021-08-13 10:11:50 +02:00
1. Другие _с но с ки_ коммитов могут быть аналогичны соглашению [git trailer format ](https://git-scm.com/docs/git-interpret-trailers ).
2021-03-18 12:10:03 +01:00
Дополнительные _типы_ не требуются «Соглашению о коммитах» и не имеют неявного
2021-08-13 10:11:50 +02:00
эффекта в семантическом версионировании (если только они не включают
2021-03-18 12:10:03 +01:00
`BREAKING CHANGE` ).
< br / > < br / >
_К о нте кс т_ может быть добавлен к _типу _ коммита, чтобы предоставить
дополнительную контекстную информацию; она содержится в скобках. Например,
`feat(parser): add ability to parse arrays` .
## Примеры
### Сообщение коммита с _о пис а ние м_ и _с но с ко й_ `BREAKING CHANGE`
```
feat: allow provided config object to extend other configs
BREAKING CHANGE: `extends` key in config file is now used for extending other config files
```
2021-09-28 18:23:20 +02:00
### Сообщение коммита с `!` для привлечения внимания к `BREAKING CHANGE`
2021-03-18 12:10:03 +01:00
```
2021-11-15 20:03:03 +01:00
feat!: send an email to the customer when a product is shipped
2021-03-18 12:10:03 +01:00
```
2021-09-28 18:23:20 +02:00
### Сообщение коммита с _ко нте кс то м_ и `!` для привлечения внимания к `BREAKING CHANGE`
2021-07-28 21:38:57 +02:00
```
2021-11-15 20:03:03 +01:00
feat(api)!: send an email to the customer when a product is shipped
2021-07-28 21:38:57 +02:00
```
2021-09-28 18:23:20 +02:00
### Сообщение коммита вместе с `!` и _с но с ко й_ `BREAKING CHANGE`
2021-03-18 12:10:03 +01:00
```
2021-11-15 20:03:03 +01:00
chore!: drop support for Node 6
2021-03-18 12:10:03 +01:00
2021-11-15 20:03:03 +01:00
BREAKING CHANGE: use JavaScript features not available in Node 6.
2021-03-18 12:10:03 +01:00
```
### Сообщение коммита без _те ла _
```
docs: correct spelling of CHANGELOG
```
2021-09-28 18:23:20 +02:00
### Сообщение коммита с _ко нте кс то м_
2021-03-18 12:10:03 +01:00
```
feat(lang): add polish language
```
### Сообщение коммита с _те ло м_ из нескольких абзацев и несколькими _с но с ка ми_
```
2021-10-05 13:03:33 +02:00
fix: prevent racing of requests
2021-03-18 12:10:03 +01:00
2021-10-05 13:03:33 +02:00
Introduce a request id and a reference to latest request. Dismiss
incoming responses other than from latest request.
2021-03-18 12:10:03 +01:00
2021-10-05 13:03:33 +02:00
Remove timeouts which were used to mitigate the racing issue but are
obsolete now.
2021-03-18 12:10:03 +01:00
Reviewed-by: Z
2021-10-05 13:03:33 +02:00
Refs: #123
2021-03-18 12:10:03 +01:00
```
## Спецификация
Слова «MUST», «MUST NOT», «REQUIRED», «SHALL», «MAY» и «OPTIONAL» в данном
2021-08-13 10:11:50 +02:00
документе должны интерпретироваться как в [RFC 2119 ](https://www.ietf.org/rfc/rfc2119.txt ).
2021-03-18 12:10:03 +01:00
2021-08-13 10:11:50 +02:00
1. Коммиты должны (MUST) начинается с _типа _ , который является существительным:
`feat` , `fix` и т.д. З а ним следует необязательный (OPTIONAL) _ко нте кс т_ ,
2021-03-18 12:10:03 +01:00
необязательный (OPTIONAL) восклицательный знак (`!`) и обязательные
(REQUIRED) двоеточие (`:`) и пробел (` `).
1. _Т ип_ `feat` должен (MUST) использоваться, когда коммит добавляет новый
функционал в ваше приложение или вашу библиотеку.
1. _Т ип_ `fix` должен (MUST) использоваться, когда коммит исправляет б а г в
вашем приложении или вашей библиотеке.
1. _К о нте кс т_ может (MAY) следовать после _типа _ . _К о нте кс т_ должен (MUST)
быть существительным, заключённым в круглые скобки, описывающий часть
кодовой базы, которую затронул коммит. Например, `fix(parser)` .
1. _О пис а ние _ должно (MUST) следовать сразу за двоеточием (`:`) и пробелом
(` `) после _типа _ или _ко нте кс та _ . _О пис а ние _ представляет собой краткое
изложение изменений кода. Например, `fix: array parsing issue when multiple
spaces were contained in string`.
1. _Т е ло _ коммита может (MAY) следовать после короткого _о пис а ния_ , добавляя
дополнительную контекстную информацию о б изменениях в коде. _Т е ло _ должно
(MUST) отделяться от _о пис а ния_ одной пустой строкой.
1. _Т е ло _ коммита имеет произвольную форму и может (MAY) состоять из любого
количества абзацев, разделённых новой строкой.
1. В одной или нескольких _с но с ка х _ может (MAY) быть одна пустая строка после
_те ла _ . Каждая _с но с ка _ должна (MUST) состоять из токена слова, за которым
следует разделитель `:<пробел>` или `<пробел>#` , за которым следует
2021-08-13 10:11:50 +02:00
строковое значение (основано на [git trailer format ](https://git-scm.com/docs/git-interpret-trailers )).
2021-03-18 12:10:03 +01:00
1. Токен _с но с ки_ должен (MUST) использовать `-` вместо пробельных символов.
Например, `Acked-by` (это помогает отличить раздел _с но с ки_ от е г о _те ла _ ,
состоящего из нескольких абзацев). Исключение составляет `BREAKING CHANGE` ,
которое может (MAY) также использоваться как токен.
2021-08-13 10:11:50 +02:00
1. _С но с ка _ может (MAY) содержать пробелы и символы новой строки, а считывание
должно (MUST) завершаться при обнаружении следующей допустимой пары
2021-03-18 12:10:03 +01:00
токен-разделитель _с но с ки_ .
2021-08-13 10:11:50 +02:00
1. Критические изменения должны (MUST) быть указаны в _типе _ , _ко нте кс те _ или
2021-03-18 12:10:03 +01:00
_с но с ке _ коммита.
1. Если `BREAKING CHANGE` включено в _с но с ку _ , то оно должно (MUST) состоять из
прописного текста `BREAKING CHANGE` , за которым следует двоеточие (`:`),
пробел (` `) и _о пис а ние _. Например, ` BREAKING CHANGE: environment
variables now take precedence over config files`.
1. Если критические изменения находятся в _типе _ или _ко нте кс те _ , то они должны
(MUST) быть обозначены восклицательным знаком (`!`), непосредственно перед
двоеточием (`:`). Если используется восклицательный знак (`!`), то
`BREAKING CHANGE` может (MAY) быть опущен в _с но с ке _ , а _о пис а ние _ коммита
должно (SHALL) использоваться для описания критического изменения.
1. В ваших сообщениях коммитов могут (MAY) использоваться _типы_ , отличные от
`feat` и `fix` . Например, `docs: updated ref docs` .
1. Единицы информации, которые составляют «Соглашение о коммитах», не должны
(MUST NOT) обрабатываться разработчиками как чувствительные к регистру, за
исключением `BREAKING CHANGE` , которое должно (MUST) быть прописными.
1. `BREAKING-CHANGE` должен (MUST) быть синонимом `BREAKING CHANGE` при
использовании в качестве токена в _с но с ке _ .
## Зачем использовать «Соглашение о коммитах»
* Автоматическое создание списков изменения.
* Автоматическое определение семантического повышения версии (на основе _типо в_
совершённых коммитов).
* Информирование товарищей по команде, общественности и других заинтересованных
сторон о характере изменений.
* Запуск процессов сборки и публикации.
* Упростите людям участие в ваших проектах, позволив им изучить более
структурированную историю коммитов.
## FAQ (часто задаваемые вопросы)
### Как мне поступать с сообщениями коммитов на начальном этапе разработки?
Мы рекомендуем действовать так, как если бы вы уже выпустили продукт. Обычно
*кто-то*, даже если это ваши коллеги-разработчики программного обеспечения,
использует ваше программное обеспечение. Они захотят знать, что исправлено,
что ломается и т. д.
### _Т ипы_ в заголовке коммита должны быть прописными или строчными?
Выберите тот, который больше всего вам нравится, и строго ему следуйте.
### Что мне делать, если коммит соответствует более чем одному _типу _?
По возможности вернитесь назад и сделайте несколько коммитов. Частью
преимущества «Соглашения о коммитах» является способность побуждать нас делать
2021-08-13 10:11:50 +02:00
более организованные коммиты и PRs (pull requests, или
2021-03-18 12:10:03 +01:00
запросы на вытягивание).
### Разве это не препятствует интенсивной разработке и быстрой итерации?
Это препятствует быстрому неорганизованному движению. Это поможет вам быстро
продвигаться в долгосрочной перспективе в нескольких проектах с разными
участниками.
### Может ли «Соглашение о коммитах» привести разработчиков к ограничению _типо в_ совершаемых ими коммитов, потому что они будут думать в соответствии с предоставленными _типа ми_?
«Соглашение о коммитах» побуждают нас делать больше определённых _типо в_
2021-08-13 10:11:50 +02:00
коммитов, таких, как `fix` . Помимо этого, гибкость «Соглашения о коммитах»
2021-03-18 12:10:03 +01:00
позволяет вашей команде придумывать свои собственные _типы_ и с о временем
изменять их.
2021-08-13 10:11:50 +02:00
### Как это связано с Семантическим Версионированием?
2021-03-18 12:10:03 +01:00
Коммиты _типа _ `fix` должны быть переведены в выпуски `PATCH` , `feat` — в
2021-03-26 16:02:47 +01:00
`MINOR` , `BREAKING CHANGE` , независимо от _типа _ , — в `MAJOR` .
2021-03-18 12:10:03 +01:00
### Как мне довести свои расширения до спецификации «Соглашение о коммитах». Например, `@jameswomack/standard-commit-spec`?
2021-08-13 10:11:50 +02:00
Мы рекомендуем использовать Семантическое Версионирование для выпуска
2021-03-18 12:10:03 +01:00
ваших собственных расширений для этой спецификации (и призываем вас создавать
эти расширения!).
### Что мне делать, если я случайно использовал неправильный _тип_ коммита?
2021-08-13 10:11:50 +02:00
#### Когда вы использовали неправильный _тип_, но соответствующий спецификации. Например, `fix` вместо `feat`
2021-03-18 12:10:03 +01:00
Перед объединением или выпуском ошибки мы рекомендуем использовать `git rebase
-i` для редактирования истории коммитов. После выпуска редактирование будет
отличаться в зависимости от того, какие инструменты и процессы вы используете.
#### Когда вы использовали _тип_, не указанный в спецификации. Например, `feet` вместо `feat`
В худшем случае это ещё не конец света, если коммит не соответствует
спецификации «Соглашения о коммитах». Это просто означает, что коммит будет
пропущен инструментами, основанными на спецификации.
### В с е ли мои участники должны использовать спецификацию «Соглашения о коммитах»?
2021-03-26 16:02:47 +01:00
Нет! Если вы используете рабочий процесс на основе соединения (squash)
коммитов в Git, то ведущие специалисты по сопровождению могут приводить в
порядок сообщения коммитов по мере их слияния (merge), не добавляя нагрузки для
обычных коммиттеров. Обычный рабочий процесс для этого состоит в том, чтобы
ваша система Git автоматически соединяла коммиты из PR и представляла форму для
ведущего сопровождающего, чтобы ввести более подходящее сообщение коммита для
слияния.
2021-03-18 12:10:03 +01:00
### Как «Соглашение о коммитах» обрабатывает отмену коммитов?
Отмена изменений кода может быть сложным:
- Вы отменяете изменения нескольких коммитов?
- Если вы отмените изменения новых функций, должен ли следующий выпуск быть
патчем?
«Соглашение о коммитах» не делает явных попыток определить поведение отмены
изменений. Вместо этого мы оставляем авторам инструментов использовать
гибкость _типо в_ и _с но с о к_ для разработки своей логики для обработки отмены
изменений.
Одна из рекомендаций — использовать _тип_ `revert` и _с но с ку _ , которая
ссылается на отменяемые хэш-суммы коммитов. Например:
```
revert: let us never again speak of the noodle incident
Refs: 676104e, a215868
```