Привет, Хабр!

Мы в beeline cloud не только создаем современные цифровые продукты, но и обучаем разработке в облаке студентов нашего курса Base Cloud DevOps. Однако выстроить эффективный процесс невозможно без знания основных инструментов. Один из них — система контроля версий Git. Перевели для вас статью, которая поможет извлечь из работы с этой утилитой еще больше пользы.

Когда-то я и не задумывался о существовании каких-то правил для составления комментариев к коммитам, но потом любознательность взяла верх. Мне казалось, что простых сообщений наподобие «добавлена функция 2», «исправлена ошибка на панели навигации» или просто «foo» вполне достаточно. Однако моя уверенность в том, что комментарии к коммитам, как правило, никто не читает, оказалась ошибкой. Хорошо составленные commit messages очень важны, они помогают нам самим в будущем извлечь максимальную пользу из своих стараний и продуманности.

Почему нужно заботиться о написании корректных комментариев?

Коммиты выполняют роль своеобразных кирпичиков в ремесле программиста. При правильном оформлении они и вовсе превращаются в «глазурь» на тортике из вашего кода и приносят значительную пользу. Хорошо написанные комментарии обеспечивают вам правильный контекст.

Хорошие коммиты свидетельствуют об умении человека работать в команде — Питер Хаттерер, Linux.

Распространенная в среде разработчиков ошибка – отношение к Git-репозиторию как к обычному хранилищу резервных копий. Беспорядочные коммиты, фиксирующие текущее состояние кода, могут затруднить восприятие хронологии изменений при последующем изучении кодовой базы. Коммиты типа «WIP», «Ушел на обед», «Хватит на сегодня», «Устал как лошадь», «Всем хороших выходных» и «Я первый»" только засоряют ваш Git-лог, затрудняя понимание существенных правок, поскольку ни одно из этих сообщений не представляет никакой дополнительной ценности.

Принципиальные ошибки, которых следует избегать при выполнении коммита в удаленный репозиторий

Никогда не фиксируйте изменения разных файлов по отдельности

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

Например, я работаю над интернет-магазином. Вот чего мне ❌ не следует делать:

# Отдельно коммитим изменения в header.js

git add header.js git commit -m "Улучшить верстку header.js"

# Отдельно коммитим изменения в footer.js 

git add footer.js

git commit -m "Улучшить дизайн футера"

Таким образом логи очень скоро превратятся в кучу хлама.

Коммиты должны быть четкими, лаконичными, организованными в логические блоки. Например, после завершения верстки макета и проработки шапки и футера будет правильнее объединить изменения перед коммитом:

# Фиксируем изменения в header.js и footer.js

git add header.js footer.js

# Коммитим взаимосвязанные изменения вместе

git commit -m "Улучшить UI: обновить header.js и footer.js"

Я понимаю, в теории это выглядит проще, чем будет на деле. Именно поэтому стоит вести приватную ветку специально для фиксации небольших изменений, прежде чем консолидировать их в main посредством объединения.

Создайте отдельную ветку для личных коммитов

Создание коммита не обязательно означает, что он должен постоянно находиться в бескрайних просторах вашего git-лога. Воспринимайте приватные ветки как персональный скетчпад программиста, где можно свободно экспериментировать, не опасаясь, что кто-то будет пристально следить за вашей работой.

Представьте себе такой сценарий: вы работаете над кодом, и вам нужно отлучиться на небольшой перерыв, или, возможно, вы собираетесь поужинать. Страх потерять текущий прогресс побуждает вас закоммитить изменения — это идеальный пример использования приватной ветки. Неважно, заканчиваете ли вы работу на сегодня или просто хотите сделать спонтанный коммит, эти изменения окажутся в вашей частной ветке.

commit [commit-hash]

Author: Your Name <your.email@example.com>

Date:   [Timestamp]

   WIP

commit [commit-hash]

Author: Your Name <your.email@example.com>

Date:   [Timestamp]

   Коммичу на всякий случай

commit [commit-hash]

Author: Your Name <your.email@example.com>

Date:   [Timestamp]

   Пора на обед

commit [commit-hash]

Author: Your Name <your.email@example.com>

Date:   [Timestamp]

   Ушел на пописать!

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

Неважно, как — путем корректного именования или договорившись с коллегами напрямую, сделайте очевидным тот факт, что содержимое этой ветки не предназначено для их глаз. Вот хороший пример названия для приватной ветки: private/do-not-use-this.

Каждый коммит, который становится частью вашей публичной ветки, должен представлять собой хорошо продуманную, самодостаточную, обратимую и четко описанную единицу работы.

Рассмотрим на живом примере: разработка функции корзины интернет-магазина

Давайте взглянем на проект интернет-магазина, который мы начали «разрабатывать» выше. Здесь мы выступаем в качестве фронтенд-разработчика, отвечающего за добавление в магазин функции корзины. Далее ваша работа будет строиться так:

Вы начали с улучшения CSS для раздела корзины и выполнили соответствующий коммит. По мере продвижения вы внедрили в корзину код на JavaScript, и это привело к еще одному коммиту. В стремлении к совершенству вы заметили проблему с центровкой текста и уделили время доработке CSS, после чего выполнили еще один коммит.

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

Давайте-ка взглянем на логи:

commit [commit-hash-1]

Author: Your Name <your.email@example.com>

Date:   [Timestamp]

   Улучшить CSS для корзины

commit [commit-hash-2]

Author: Your Name <your.email@example.com>

Date:   [Timestamp]

   Добавить в корзину JavaScript функциональность

commit [commit-hash-3]

Author: Your Name <your.email@example.com>

Date:   [Timestamp]

   Исправить ошибки в CSS, ломающие центровку текста в корзине

commit [commit-hash-4]

Author: Your Name <your.email@example.com>

Date:   [Timestamp]

   Поправить баг в работе счетчика товаров корзины

commit [commit-hash-5]

Author: Your Name <your.email@example.com>

Date:   [Timestamp]

   Добавить анимацию к кнопке оформления заказа

Если все эти изменения включить в основную ветку фич наряду с другими фиксами, то процесс рецензирования здорово осложнится.

Как сделать логи более читаемыми

Начните со смены рабочей ветки:

git checkout feature/cart-section

Затем объедините все коммиты из вашей ветки private/do-not-use-this в feature/cart-section с помощью единого коммита:

git merge - squash private/do-not-use-this

После слияния необходимо составить ясный и содержательный комментарий:

# Напишите качественный комментарий

git commit -v -m "Фича: Разработать корзину с анимацией при оформлении заказа

обновлены CSS корзины, исправлены ошибки в выравнивании текста, верстка изменена для улучшения внешнего вида и читаемости"

7 стандартных правил написания идеального комментария к коммиту

Приведенные здесь правила содержат рекомендации и лучшие практики для обеспечения правильного форматирования комментариев и донесения информации в понятном виде. Разные правила могут содержать разночтения в части написания текста/темы коммита, однако их конечная цель состоит в улучшении читабельности и понятности комментариев к коммитам в системе контроля версий Git.

Правило 1: Ограничьте тему до 50 символов

При формировании темы коммита рекомендуется придерживаться краткости и фокусировки на главном. Строка темы служит кратким изложением цели коммита и в идеале не должна превышать 50 символов.

Если вы не можете уложиться в 50-символьный лимит, это может свидетельствовать о том, что цель коммита не сформулирована. Между тем, коммиты должны быть ясными, краткими и самодостаточными. Придерживаясь этого правила, вы вынуждены будете выделять лишь наиболее важную информацию, что позволит вашей команде и вам самим с первого взгляда понять суть изменений.

Правило 2: Пишите с заглавной буквы только первую букву темы

При составлении комментария оставьте только одну заглавную букву — с нее должна начинаться тема. Остальную часть сообщения, включая все дополнительные сведения, оставьте в нижнем регистре.

Правило 3: Не ставьте точку в конце темы

Причина, по которой в строке темы не ставится точка, отчасти имеет исторические корни, а отчасти заключается в сохранении единого стиля. Принято рассматривать строку темы как заголовок или команду, поэтому она пишется в повелительном наклонении (например, «Добавить функцию или «Исправить ошибку», а не «Добавлена функция» или «Исправлена ошибка»). Отсутствие точки в конце помогает соблюсти это правило и сохранить лаконичность.

git commit -v -m "Создать функциональность корзины с анимацией"

Правило 4: Оставьте между темой и телом комментария пустую строку

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

git commit -v -m "Создать функциональность корзины с анимацией

тело комментария...

"

Правило 5: В теле комментария нельзя писать больше 72 символов в одной строке

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

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

git commit -v -m "Создать функциональность корзины с анимацией

улучшены CSS раздела "Корзина", устранены проблемы с выравниванием текста, доработан дизайн

для улучшения внешнего вида

и читабельности."

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

Правило 6: Используйте повелительное наклонение

Очень полезно составлять комментарии с оглядкой на то, что при выполнении коммита будет выполнено определенное действие. Постройте комментарий таким образом, чтобы он логически завершал предложение «Применение коммита позволит...». 

Например, вместо git commit -m "Исправлены баги в верстке" ❌, используйте следующее git commit -m "Исправить баги в верстке" ✔.

То есть, если применить этот коммит, он действительно позволит исправить ошибку на странице макета.

Правило 7: Объясняйте «Что» и «Почему», а не «Как»

Если ограничить смысловую нагрузку комментария вопросами «что сделано?» и «почему сделано?», получится краткое, но информативное объяснение каждого изменения. Разработчики, которым интересно, как был реализован код, могут обратиться непосредственно к кодовой базе. Поэтому подчеркните, что именно было изменено и каковы причины этого изменения. И не забудьте упомянуть, какой компонент или участок кода были затронуты.

Пример из практики: Приемы работы с коммитами, принятые в Angular

Angular является ярким примером эффективного применения комментариев. Команда разработки придерживается специальных префиксов, таких как "chore: , "docs: ," "style: ," "feat: ," "fix: , "refactor: ," и "test: ." Благодаря включению этих префиксов в тему коммита, беглого взгляда на историю достаточно, чтобы понять, какие изменения производились в коде.

Рекомендации

Не забывайте, что главным приоритетом является обеспечение прозрачности и осмысленности каждого коммита. Хорошо составленный комментарий выполняет роль исторического документа, объясняющего «что, «почему», но не «как» было сделано в проекте. Помните, что история коммитов — это средство организации эффективной совместной работы. Возьмите за правило создавать информативные, краткие и последовательные комментарии.

Хотите углубить свое понимание Git'а? Ознакомьтесь с этими ресурсами:

beeline cloud — secure cloud provider. Разрабатываем облачные решения, чтобы вы предоставляли клиентам лучшие сервисы.

Комментарии (31)


  1. Vamp
    20.09.2023 11:32
    +9

    Уж сколько видел рекомендаций по составлению идеальных коммитов, но нелепое правило 72 символов так и кочует от статьи к статье. Авторы этих текстов хоть сами пробовали сжать консоль до 72 символов или просто копипастят рекомендации не глядя? Я ещё могу понять такую рекомендацию во времена SVGA мониторов с резрешением 800х600 пикселей или в мире, где фичу с переносом слов ещё не изобрели.

    Посмотреть на консоль шириной 72

    В этом коммит мессадже длина строки не ограничена, но в консоли шириной 72 символа всё выглядит вполне прилично и читабельно.

    Для сравнения, комментарий ниже следует какому-то ограничению (но не 72) и выглядит это явно хуже:

    Но с ограничением длины первой строки согласен. Первая строка должна максимально кратко и ёмко описывать суть изменений. Чтобы при просмотре списка коммитов можно было быстро сориентироваться, не тратя время на прочтение полного текста каждого коммита. Разве что 50 символов - это чересчур мало.

    Ещё кратко коснулись стиля angular, но об отдельном стандарте, выросшим из данного стиля, совсем ни слова. Всем рекомендую ознакомиться - https://www.conventionalcommits.org/


    1. delphinpro
      20.09.2023 11:32
      +1

      ограничение 72 подразумевается все же для консоли шириной 80 (8 про запас, на отступы там или что, может стандартная табуляция в начале). впрочем это ничего не меняет, с вами я согласен.


    1. ggo
      20.09.2023 11:32
      +2

      Зависит от команды. Если команда согласна на 172 символа - вперед.

      У нас в команде есть пользователи, любящие и умеющие эффективно работать на мелких ноутах. Для них ограничение в 72 символа - очень важно.

      Для себя лично пришел к выводу: мне может и не важно ограничение в 72 символа, но придерживаться почти ничего не стоит. И кто и когда будет листать этот репозитарий, я не знаю, поэтому на всякий случай лучше придерживаться рекомендаций, в том числе и на длину строки, чтобы им было приятно.


      1. Vamp
        20.09.2023 11:32
        +1

        Коммит всегда будет выглядеть плохо на экранах и размерах меньших, чем принятое в команде ограничение. Коммит без ограничений будет выглядеть хорошо на любых размерах. Под спойлером я как раз привёл пример для сравнения.


  1. tenzink
    20.09.2023 11:32
    +13

    Я бы добавил рекомендацию ссылаться на задачу в трекере. Очень помогает в археологических изысканиях


    1. dopusteam
      20.09.2023 11:32
      +1

      Удобно ветку называть по номеру задачи и прикрутить хук, который будет название ветки в начало коммита подставлять. Очень удобно и очень просто настраивается


      1. tenzink
        20.09.2023 11:32
        +2

        Если иметь 1-1 соответствие ветки и задачи, то можно всё делать через pull requests (merge commits). Тогда достаточно, чтобы номер задачи был в описании merge commit'а


        1. dopusteam
          20.09.2023 11:32
          +1

          Не сработает, если rebase применяется))


          1. tenzink
            20.09.2023 11:32

            Согласен, тут разве всё squash'ить в один коммит перед rebase


  1. sheshanaag
    20.09.2023 11:32

    В случае российских программистов главное правило - грамотный английский с адекватной терминологией, чтобы читать без боли и смеха.


    1. storoj
      20.09.2023 11:32
      +5

      а зачем в России мучаться и писать по-англиски?


      1. sheshanaag
        20.09.2023 11:32

        Ну так и писали бы по-русски, а то превращают код в комедию своими комментариями. Именование сущностей - тоже проблема: бедный и неграмотный лексикон убивает желание читать программу даже если она технически корректна.


        1. Newbilius
          20.09.2023 11:32

          А можете привести пример подобного, когда выбор слов в коде "мог бы быть и лучше"?


  1. geher
    20.09.2023 11:32
    +5

    Пишите с заглавной буквы только первую букву темы

    И какую проблему это решает?

    По-моему, это снизит читаемость коммитов за счет того, что имена собственные и аббревиатуры потеряют привычный вид. Да и начала предложений в комментарии тоже должны выделяться.

    Используйте повелительное наклонение

    А вот это правило сильно раздражает. Коммит - это решение задачи, а не ее постановка.


    1. speshuric
      20.09.2023 11:32

      В английском использование повелительного наклонения может быть разумным (но тогда не надо было переводить текст сообщений коммитов). Если сообщения коммитов на русском, то это вредная рекомендация, и причастие в прошедшем времени более удачно смотрится.


      1. Fedorkov
        20.09.2023 11:32

        причастие в прошедшем времени

        Тогда уж глагол.

        Upd: А, ну или краткое причастие типа "сделано то-то".


        1. speshuric
          20.09.2023 11:32
          +1

          Глаголы так себе вариант. Начиная с того, что у них есть количество или род. А вот краткие причастия "исправлено", "сделано", "реализованы N и M" и т. п. - в самый раз.


          1. Fedorkov
            20.09.2023 11:32

            Я имею в виду «добавил», «исправил», «удалил». В женском роде тоже норм.


  1. Fedorkov
    20.09.2023 11:32
    +2

    Используйте повелительное наклонение

    В английском повелительное наклонение имеет начальную форму (без суффиков), и это соответствует общей тенденции упрощать технические надписи — убирать артикли, местоимения и т. д. (типа “no step”). В русском прошедшее время всё же выглядит более уместным.


    1. ritorichesky_echpochmak
      20.09.2023 11:32
      +2

      Я не понимаю, почему коммит мне приказывает вместо того чтобы рассказать что и почему в нём было выполнено)

      Conventional Commits (автор, видимо, не в курсе как это называется, приводя в пример Angular) тоже выглядят иногда не очень удобно, особенно если коммитать из какой-нибудь IDE где работа с коммитами делается из-за угла в маленькой панельке и становится без дополнительных действий вообще непонятно, а что же там вообще происходит, потому что места там на 4-5 слов. Да и не вижу я смысла 100500 раз писать feat: если и так очевидно, что это по дефолту для большинства задач, а фиксы всё равно будуть содержать слово fix в контексте. То же самое если смотришь изменения через какой-нибудь Tig. По этой же причине, если нет каких-то требований на конкретном проекте, номер задачи я стараюсь добавлять в конце заголовка коммита и тогда он читается как "Что сделали, почему (какую задачу решали)"


    1. RomeoGolf
      20.09.2023 11:32
      +1

      Ну, шестое правило вообще переведено некорректно. Подстрочно может быть и точно, но некорректно. Если "… чтобы логически завершал предложение «Применение коммита позволит...» ", то повелительное наклонение там вообще никаким боком: "позволит исправьте ошибку". И в примере используется именно инфинитив.


      Не надо чисто языковые правила цельнотянуто тащить из языка в язык. Ни человеческий, ни ЯП. Лично я комментарии на английском начинаю с инфинитива ("replace foos with bars"), а если на русском, то объясняю, что сделано ("Перекрашена кнопка", "Исправлен квиксорт на пузырек")


  1. trabl
    20.09.2023 11:32

    Не увидел рекомендаций писать коммиты на английском языке.


    1. iamkisly
      20.09.2023 11:32

      Я думаю, что в отдаленном будущем мы увидим как какой-нибудь IntelliJ IDEA переводит сопроводительный комментарий комита на лету и дает рекомендации если они пустые. Во всяком случае в тех репах по которым я шарюсь очень много комментов и описания коммитов на упрощенном китайском. Вполне логично, что однажды их переведут чтобы разработчики сосредотачивались на коде, а не на тексте коммитов.


  1. iamkisly
    20.09.2023 11:32

    Если лучший код - тот который не написан, то лучший коммит это тот который не отправлен ?


  1. antirek
    20.09.2023 11:32

    первая рекомендация: понять на каком этапе ваш проект

    если проект на начальной стадии - например, вы работаете один, вы тестируете гипотезы, что-то тестируете, и при этом результаты фиксируете в репозиторий - то никто не будет читать ваши коммиты - забейте и пишите что хотите

    если проект растет и вас два-три человека - но вы общаетесь, обсуждаете, все в курсе всего - никто не читает коммиты - забейте и пишите что хотите

    если ваш проект подрос, начал использоваться вами в рабочей среде, вы стали реже в него писать - о, да, пора писать суть в коммитах, но если там пару опечаток поправили - забейте и напишите fix

    если уже проект подзаматерел, работает, вы начали версионировать, да и команда побольше и проект стал частью чего-то большего - пора применять правила написания коммитов )))


    1. Fedorkov
      20.09.2023 11:32
      +1

      вы работаете один, вы тестируете гипотезы, что-то тестируете, и при этом результаты фиксируете в репозиторий - то никто не будет читать ваши коммиты

      Изучая новый для себя проект, я одним из первых шагов пытаюсь выяснить логику тех или иных архитектурных решений. Для этого обычно приходится читать первые коммиты.


      1. antirek
        20.09.2023 11:32

        и сильно помогает? со временем логика архитектурных решений меняется, особенно в длительных проектах


        1. Fedorkov
          20.09.2023 11:32
          +1

          Помогает. Обычно в истории есть несколько ключевых коммитов, связанных с масштабными рефакторингами (они выглядят как первый коммит в истории сразу многих файлов). Если какое-то место в коде противоречит логике последующих рефакторингов, то значит, перед нами техдолг.


    1. ritorichesky_echpochmak
      20.09.2023 11:32

      А зачем тогда вообще репозиторий? Ну накалякали на локалхосте, сделали "Папка 1", "Ещё один папка", "Папка в папке", как диды в школе завещали - и хватит. Нафиг эту культуру разработки, привыкать к нормальному как к чему-то подразумевающемуся по умолчанию...


  1. geher
    20.09.2023 11:32
    +1

    Правило номер 0.

    Если в проекте уже приняты какие-либо правила оформления коммитов, используйте их, даже если это полностью противоречит вашему любимому своду правил. Безобразно, зато единообразно.


  1. nureinname
    20.09.2023 11:32
    +1

    git commit -m "Улучшить UI: обновить header.js и footer.js"

    Мне кажется, комментарии, где главное смысловое слово - "улучшить" и/или "обновить", совсем не информативны. Что, разве кто-то сознательно ухудшает код или дизайн? Все делается для улучшения, иначе это саботаж)

    Постройте комментарий таким образом, чтобы он логически завершал предложение «Применение коммита позволит...»

    Правило 6 про использование повелительного наклонения, на мой вкус, выглядит странно. Это, скорее, относится к постановке задачи - сделать что-то. На практике с такой логикой про "применение коммита позволит" не приходилось сталкиваться.