[Angular Commit Message Format] 森羅万象を飲み込むchoreからの脱却
導入:なぜ単一目的のコミットを作成することが重要なのか
チーム開発では、単一目的の単位でコミットを作成することが、レビュアーの負荷軽減やPRのマージ速度向上につながり、生産性を高める重要なポイントです。
また、コミットメッセージにガイドラインを設けているチームも少なくないでしょう。
筆者の主観ではJosh Buchea氏のSemantic Commit Messagesや、Conventional Commitsを採用しているチームが多い感覚を持っています。
そんな中で本記事では、AngularレポジトリへのContributeで使用されているCommit Message Formatの優れた点について解説していきます。
コミットメッセージのガイドラインが無い場合にありがちな事態
そもそもコミットメッセージにガイドラインが無いと、多くのチームで以下のような状況が起こります。
現在形と過去形が統一されていない
どちらに統一するかは議論が分かれる部分ですね。[1]
ただし、プロジェクト内で現在形・過去形のどちらを使うかを意思決定し、統一した方が可読性の観点から望ましいです。
個人的には「そのコミットを取り込むことによって何が変更されるのか」を示すものだと捉え、現在形を使うべきだと考えています。
feat(app): 機能Aのコントローラーを作成した
冗長なsummary
summaryは短く変更を現したいです。
fix(app): AAAしている場合に、BBBがCCCという状態になってしまうため、DDDを追加し、EEEの表示条件を変更する
文末の句読点。
summaryはタイトル・件名であると捉え、句読点は使わない方向で統一したほうが望ましいでしょう。
refactor(app): 可読性の高い記法に書き換える。
Commit Typeにchoreが濫用される
例えばSemantic Commit Messages
では、typeのExampleとして以下が記載されています。
- feat
- fix
- docs
- style
- refactor
- test
- chore
そしてこれらのみを愚直に使うと、いくつか抜け落ちている要素があることに気付くはずです。
- 依存パッケージに変更を加える時はどのtype?
- CIのワークフローファイルに変更を加える時はどのtype?
- 振る舞いは変えないけど、速度を向上する変更を加える時はどのtype?
等々…。
上記のExampleから合致しそうなtypeを探しても、見つかりません。
そして大抵は熟慮の末に chore
が選定され、コミット履歴に刻み込まれます。
chore(npm): update react version
chore(github-actions): run e2e in parallel
chore(app): reduce calculation amount
AngularのCommit Message Formatとは
特徴としては以下が挙げられます。
- header, body, footerから構成されている
- headerはtype, scope, short summaryから構成されている
- summaryは命令形・現在形を使う
- 最初の文字を大文字にしない
- 文末にピリオドを使わない
bodyに「なぜ」その変更をするのかを記述することで、summaryが冗長になることを防いでいます。
また、headerのtypeには独自のものが用意されており、痒い所に手が届くラインナップです。
AngularレポジトリのPRを実際に見てみよう
typeの使用例として、実際にPRを見ていきましょう。
build
babelのバージョンを上げていますね。
こちらはdependenciesに影響を与えるため、typeとしてbuildが設定されています。
ci
ワークフローファイルに変更が入っています。
perf
キャッシュの挙動が改善されています。
まとめ
必ずしも、Angular wayなやり方をそのまま踏襲する必要はありません。
どうしてもマッチするtypeが見つからず、choreを使いたいケースもあるでしょう。
そんな場合は愚直にchoreを使えば良いです。
あるいは、チーム独自のtypeやルールを設定するのも良いでしょう。
大事なのは、チームで統一されたルールに則り、無駄な迷いを減らしていくことです。
そして、統一されたルールに則って開発を進めていけば、コードレビューや過去の履歴を追うときに、負荷を減らしてくれることでしょう。
14日目の記事は@scrpgilさんによる個人制作サイトを Angular 17→19 にアップデートした記録です!
Discussion