Сделайте ваши коммиты более ценными

Git

Постоянно обновляемая заметка на github, адрес ссылки:Front-End-Basics, адрес этой статьи:Сделайте ваши коммиты более ценными.


спецификация фиксации

AngularJS вдокументация для разработчиковВ руководстве по git commit упоминается, что строгая спецификация формата git commit может отображать более удобочитаемую информацию в процессе просмотра истории проекта и может напрямую генерировать журнал изменений AngularJS с информацией о git commit.

спецификация формата сообщений фиксации

фиксировать сообщенияheader,body,footerсочинение.

headerтакже содержитtype,scope,subject.headerтребуется, но один изscopeявляется необязательным.

bodyа такжеfooterМожно опустить.

<type>(<scope>): <subject>
// 空行
<BLANK LINE>
<body>
// 空行
<BLANK LINE>
<footer>

Примечание. Чтобы быть более понятным в github и различных инструментах git, каждая строка сообщения коммита не должна превышать 100 символов.

Header

Type

Тип должен быть одним из следующих:

  • feat:новая функция
  • fix:Исправлена ​​ошибка
  • docs:Только изменить документ
  • style:Измененный формат (пробел, в форматировании пропущена точка с запятой), на работу кода не влияет
  • refactor:Рефакторинг (ни исправление ошибок, ни добавление функций)
  • build:Процесс сборки, изменения внешних зависимостей, такие как обновление пакетов npm, изменение конфигурации веб-пакета и т. д.
  • perf:оптимизация производительности
  • test:Тестовое задание
  • chore:Изменения в процессе сборки или в вспомогательных средствах и библиотеках (например, создание документации)
  • ci:изменения, связанные с ci

Кроме того, существует специальный типrevert, если текущая фиксация должна отменить предыдущую фиксацию, вы должны использоватьrevertв начале, за которым следует отозванный коммитheader,существуетbodyСледует указать:This reverts commit <hash>., hash относится к SHA фиксации, который будет отозван.

// 例如

revert: feat(user): add user type

This reverts commit ca16a365467e17915f0273392f4a13331b17617d.

Scope

Область может указывать область отправленных изменений, которая зависит от проекта.Если модификация затрагивает более одной области, она может быть указана как*.

Subject

subjectОтносится к краткому описанию изменения длиной менее 50 символов, как правило, в соответствии со следующими спецификациями:

  • Начните с глагола, выраженного в настоящем времени от первого лица, например:changeзаменятьchangedилиchanges
  • первая буква строчная
  • Не добавляйте точку (.) в конце

Body

bodyЧасть представляет собой подробное описание локального коммита, которое можно разделить на несколько строк.

а такжеsubjectТочно так же начните с глагола, выраженного в настоящем времени от первого лица, например:changeзаменятьchangedилиchanges.

bodyСледует указать причину модификации и сравнение поведения до и после изменения.

Footer

footerВ основном используется в этих двух ситуациях:

  • Нарушение изменений, обычно используетсяBREAKING CHANGE:start, за которым следует пробел или два символа новой строки. Оставшаяся часть используется для объяснения информации и метода переноса этого изменения.
  • Закрыть выпуск,Пример проблемы с закрытием github
// BREAKING CHANGE: 的例子
BREAKING CHANGE: isolate scope bindings definition has changed and
    the inject option for the directive controller injection was removed.

    To migrate the code follow the example below:

    Before:

    scope: {
      myAttr: 'attribute',
      myBind: 'bind',
      myExpression: 'expression',
      myEval: 'evaluate',
      myAccessor: 'accessor'
    }

    After:

    scope: {
      myAttr: '@',
      myBind: '@',
      myExpression: '&',
      // myEval - usually not useful, but in cases where the expression is assignable, you can use '='
      myAccessor: '=' // in directive's template change myAccessor() to myAccessor
    }

    The removed `inject` wasn't generaly useful for directives so there should be no code using it.



// Closes Issue 例子
Closes #2314, #3421

полный пример

Пример 1: подвиг

feat($browser): onUrlChange event (popstate/hashchange/polling)

Added new event to $browser:
- forward popstate event if available
- forward hashchange event if popstate not available
- do polling when neither popstate nor hashchange available

Breaks $browser.onHashChange, which was removed (use onUrlChange instead)

Пример 2: исправить

fix($compile): couple of unit tests for IE9

Older IEs serialize html uppercased, but IE9 does not...
Would be better to expect case insensitive, unfortunately jasmine does
not allow to user regexps for throw expectations.

Closes #392
Breaks foo.bar api, foo.baz should be used instead

Пример 3: стиль

style($location): add couple of missing semi colons

Посмотреть больше примеров

Преимущества стандартизации сообщений коммитов

  • Первая линия - это краткая и практическая ключевая информация, которая удобна для быстрого просмотра в истории Git
  • С подробным телом и нижним колонтитулом вы можете четко видеть цель и влияние фиксации
  • Вы можете отфильтровать информацию, которую хотите найти, по типу или быстро найти похожие материалы по ключевым словам.
  • Журнал изменений может быть сгенерирован непосредственно из коммита.
// 列举几个常用的 log 参数

// 输出 log 的首行
git log --pretty=oneline

// 只输出首行的 commit 信息。不包含 hash 和 合并信息等
git log --pretty=format:%s

// 查找有关“更新菜单配置项”的提交
git log --grep="更新菜单配置项"

// 打印出 chenfangxu 的提交
git log --author=chenfangxu

// 红色的短 hash,黄色的 ref , 绿色的相对时间
git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr)%Creset'

Реализация отправки спецификаций с помощью инструментов

Формат стандартизированной отправки описан выше.Если студентов просят представитьgit commitПри написании в строгом соответствии с вышеизложенными спецификациями в первую очередь отягощается ум, и необходимо помнить, какие разные виды используются для определения,subjectкак писать,bodyкак писать,footerХочешь пиши. Во-вторых, большинство норм для людей антигуманны, поэтому очень вероятно, что некоторые ученики будут постепенно не писать по нормам спустя долгое время. Полагаться на силу воли, чтобы контролировать себя, чтобы писать строго в соответствии со спецификацией, требует некоторой дополнительной энергии, и тратить энергию на такие вещи немного расточительно.

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

Commitizen

Сообщения коммитов в стиле дзен для граждан интернета Мммм~ что-то вроде дзен

Commitizen — это инструмент, помогающий писать канонические сообщения коммитов. у него есть инструмент командной строкиcz-cli, в следующем разделе будет представлено несколько этапов использования Commitizen.

опыт git cz

// 全局安装 Commitizen
npm install -g commitizen

Ваш репозиторий может еще не быть уверенным, в этот моментgit czэффектgit commitТо же самое, то есть никакого эффекта. Однако возможно выполнениеnpx git-czиспытать.

Если вы хотите запустить напрямуюgit czРеализовать семантическое подчинение, которое может быть основано наstreamich/git-czДокумент говорит глобальная установкаgit cz.

// 全局安装 git cz
npm install -g git-cz

В дополнение к этому есть более рекомендуемый способ — сделать ваш репозиторий дружественным к Commitizen.

дружественный к Commitizen

После глобальной установки Commitize инициализируйте свой проект с помощью адаптера cz-conventional-changelog.

// 初始化 cz-conventional-changelog 适配器
commitizen init cz-conventional-changelog --save-dev --save-exact

Приведенная выше инициализация делает три вещи:

  • Установите зависимости cz-conventional-changelog
  • Сохранить зависимость package.jsondependenciesилиdevDependenciesсередина
  • В корневом каталоге package.json добавьте следующееconfig.commitizen
"config": {
    "commitizen": {
      "path": "./node_modules/cz-conventional-changelog"
    }
  }

Или создайте новый файл .czrc в корневом каталоге проекта с содержимым, установленным на

{
  "path": "cz-conventional-changelog"
}

беги сейчасgit czЭффект следующий:

cz-настраиваемая пользовательская китайская конфигурация

Вы можете видеть на скриншоте выше, параметры конфигурации представлены на английском языке, если вы хотите изменить китайский, вы можете использоватьcz-customizableадаптер.

Выполните следующую команду,Обратите внимание, что он был инициализирован однажды, и на этот раз для инициализации вам нужно добавить--forceпокрытие

npm install cz-customizable --save-dev

commitizen init cz-customizable --save-dev --save-exact --force

Теперь в package.jsonconfig.commitizenПоля:

"config": {
    "commitizen": {
      "path": "./node_modules/cz-customizable"
    }
  }

Есть три способа найти конфигурационные файлы в документе cz-customizable: согласно первому, мы создаем его в корневом каталоге проекта..cz-config.jsдокумент. по приведенному примеруcz-config-EXAMPLE.jsПишем наш конфиг. тип фиксации может относиться кconventional-commit-types.

Вы можете нажать, чтобы просмотреть мои настроенные файлыqiqihaobenben/commitizen-git/.cz-config.jsПодробные замечания.

Проверка проверки

Как указано в документации Commitizen, Commitize может запускатьgit commitПодсказка может быть дана перед хуком, но также полезно дать понять, что проверка сообщений коммита при коммите тоже полезна. В конце концов, даже если Commitzen используется, его можно обойти, поэтому очень важно представить окончательную проверку.

commitlintВы можете проверить, соответствуют ли сообщения фиксации стандартному формату фиксации. Требуется конфигурация проверки. Рекомендуется.@commitlint/config-conventional.

npm i --save-dev @commitlint/config-conventional @commitlint/cli

Создайте файл commitlint.config.js в корневом каталоге проекта и установите правила проверки:

module.exports = {
  extends: ["@commitlint/config-conventional"],
  // rules 里面可以设置一些自定义的校验规则
  rules: {},
};

Установите husky в проект и создайте новый файл husky.config.js в корневом каталоге проекта, добавив следующие настройки:

// 安装 husky
npm install --save-dev husky


// husky.config.js 中加入以下代码
module.exports = {
  "hooks": {
    "commit-msg": "commitlint -E HUSKY_GIT_PARAMS"
  }
}

Примечание: потому что@commitlint/config-conventionalПравила проверки соответствуют спецификации Angular, поэтому, когда мы используем cz-customizable для настройки китайской конфигурации, мы следуем данному примеру, который соответствует спецификации Angular.cz-config-EXAMPLE.jsзаписывать.cz-config.jsиз. Но если ваша пользовательская конфигурация Commitizen не соответствует спецификации Angular, вы можете использоватьcommitlint-config-czУстановите правила проверки. (Рекомендуется выполнять настраиваемую конфигурацию cz в соответствии со спецификацией Angular)

// 安装 commitlint-config-cz
npm install commitlint-config-cz --save-dev


// commitlint.config.js 改为
module.exports = {
  extends: [
    'cz'
  ]
};

git commit запускает git cz

При подаче мы все привыклиgit commit, хотя заменен наgit czНе сложно, но если вы позволите разработчикамgit commitнечувствительный триггерgit czконечно лучше, И это также может избегать людей, которые не знакомы с проектом напрямую.git commitОтправьте некоторую несоответствующую информацию.

Мы можем установить в husky.config.js:

"hooks": {
  "prepare-commit-msg": "exec < /dev/tty && git cz --hook || true",
}

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

Создать журнал изменений

standard-versionэто использованиеsemverа такжеconventional-commitsУтилита, поддерживающая создание CHANGELOG для контроля версий. standard-version может не только генерировать CHANGELOG, но и выполнять контроль версий в соответствии с типом коммита.

// 安装 standard-verison
npm i --save-dev standard-version

// 在 package.json 中的 scripts 加入 standard-version
{
  "scripts": {
    "release": "standard-version"
  }
}

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

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

После того, как конфигурация может посмотреть, реализация результатов GIT Commit.

расширять

Более сложные пользовательские подсказки

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

Если вы действительно хотите это сделать, сделайте копиюcz-conventional-changelogилиcz-customizableизменить, Или написать адаптер самостоятельно.

Дружественный значок Commitizen

Если репозиторий настроен как дружественный к Commitizen, его можно найти вREADME.mdДобавьте этот маленький значок в:Commitizen friendly

Справочная документация