Skip to content

Instantly share code, notes, and snippets.

@DmitriiNazimov
Forked from bibendi/gist:7941823
Last active May 6, 2024 21:34
Show Gist options
  • Save DmitriiNazimov/f9cf7d0631d12c19827518b8bd8134c4 to your computer and use it in GitHub Desktop.
Save DmitriiNazimov/f9cf7d0631d12c19827518b8bd8134c4 to your computer and use it in GitHub Desktop.
Оформление коммитов #git

Как писать коммиты

Источники

В качестве основы используется Angular Git commit Message Convention - это наиболее авторитетный источник. Все остальные вариации конвенций по коммитам ссылаются на эту.

Также достаточно авторитетным источником является conventionalcommits.org

Ниже находится краткая выжимка того, как я понял эти конвенции.

Шаблон коммита

Для оформления сообщения коммита следует использовать следующий шаблон:

<type>(<scope>): <description>
<BLANK LINE>
<body> 
<BLANK LINE>
<footer>

Type, scope и description вместе составляют заголовок коммита (header).

  • Type - тип коммита (рефакторинг, исправление багов, новая фича и т.п.)
  • Scope - область действия (где были изменения). Это может быть отдельный файл, директория или затронутая часть проекта (rendering, routing и т.д.). Не обязательно для заполнения (но желательно).
  • Description - описание сути коммита. Обычно отвечает на вопрос "что было изменено/добавлено/удалено?" Например: add comment section
  • Blank line - пустая строка, ей отделяется тело коммита от заголовка, и тело от футера.
  • Body - не обязательно для заполнения. Здесь обычно отвечают на вопрос "Зачем были изменения?" и "Почему сделаны именно такие изменения?" (почему не стоит делать по-другому).
  • Footer - не обязательно для заполнения. Может содержать информацию о критических изменениях (breaking changes), а также является местом для указания задач из бэклога, GitHub issues, тикетов, и других проблем, которые этот коммит закрывает или с которыми он связан.

Пример коммита

//header
chore: drop Node 6 from testing matrix

//body
see the issue for details on the typos fixed

//footer
BREAKING CHANGE: dropping Node 6 which hits end of life in April
closes issue #12

Примеры заголовков коммитов

Плохо:

Changed render method in Block

Лучше:

refactor: Changed render method in Block

Хорошо:

refactor(Block.ts): update render method

Несколько коротких правил

  1. Коммиты пишутся на английском языке.
  2. Заголовок коммита пишется с маленькой буквы.
  3. Точка в конце не ставится.
  4. Длина заголовка не должна превышать 100 символов, а лучше 50. Подробности коммита выносятся в тело и футер.
  5. Description начинается с глагола. Глагол указывается в настоящем времени, например: add, update, improve, remove (не added, updates) и тд.

Как писать коммит при Pull Request

  1. Сообщение коммита при merge PR формируется по такому же принципу как описано выше.
  2. В конец заголовка коммита включается номер PR в скобочках после основного сообщения. Например: refactor(Block.ts): update render method (#67)
  3. Все сообщения коммитов из сливаемой ветки вносятся в тело коммита.

В итоге получается примерно так:

docs(readme.md): add documentation about project (#3) 

* docs(workFlow.md): fix name of developing branch
* chore(package.json): add commitlint to devDependencies
Some extra notes.

Плагин VS Code

Чтобы было проще писать коммиты по всем правилам для VS Code есть плагин "Commit Message Editor". Если использовать его для написания текста коммитов, то ошибиться невозможно.

У плагина две вкладки - edit as text и edit as form. Безошибочный вариант - это edit as form.

Тип коммита

  • feat - используется при добавлении новой функциональности.
  • fix - исправление багов.
  • refactor - изменения кода, которые не исправляет баги и не добавляют функционал.
  • chore - изменение конфигов, системы сборки, обновление зависимостей и т.д.
  • test - всё, что связано с тестированием.
  • style - исправление опечаток, изменение форматирования кода (переносы, отступы, точки с запятой и т.п.) без изменения смысла кода.
  • docs - изменения только в документации.

Наиболее часто используемый тип - refactor.

Эти типы расширяют вышеописанные, но их использовать не обязательно:

  • perf - изменения кода, повышающие производительность.
  • build - изменения, влияющие на систему сборки или внешние зависимости (webpack, npm).
  • ci - изменения в файлах конфигурации.

BREAKING CHANGE (критические изменения)

BREAKING CHANGE: указывается в футере и автоматически добавляется в конец заголовка. Критические изменения - это изменения, нарушающие обратную совместимость. Может быть частью коммита любого типа.

Должен начинаться с фразы BREAKING CHANGE:, за которой следует краткое изложение критического изменения, пустая строка и подробное описание критического изменения.

Причесываем коммиты

Перед тем как пушить коммиты на сервер стоит их проверить:

  • Соответствуют ли они всем правилам?
  • Будут ли понятны коммиты другим разработчикам?
  • Нет ли лишних коммитов, которые не несут смысловой нагрузки для коллег?

Если какие-то проблемы есть, то их желательно исправить.

Непонятным или не совсем корректным коммитам стоит обновить текст сообщения, а лишние коммиты можно обьединить с другими коммитами.

Как исправить проблемы?

Использовать команду git rebase -i. С помощью нее можно расставить коммиты в правильном порядке, объединить их, переименовать, и т.д. Но с этой командой нужно быть осторожным и действовать аккуратно.

Нельзя использовать rebase в публичных (уже запушенных) ветках! Только в локальных ветках разработки, которые еще не были запушены.

Видео-инструкция как работать с командой git rebase -i.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment