🍛

[Angular Commit Message Format] 森羅万象を飲み込むchoreからの脱却

2024/12/20に公開

導入:なぜ単一目的のコミットを作成することが重要なのか

チーム開発では、単一目的の単位でコミットを作成することが、レビュアーの負荷軽減や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が設定されています。

https://github.com/angular/angular/pull/59127

ci

ワークフローファイルに変更が入っています。

https://github.com/angular/angular/pull/59025

perf

キャッシュの挙動が改善されています。

https://github.com/angular/angular/pull/59170

まとめ

必ずしも、Angular wayなやり方をそのまま踏襲する必要はありません。
どうしてもマッチするtypeが見つからず、choreを使いたいケースもあるでしょう。
そんな場合は愚直にchoreを使えば良いです。
あるいは、チーム独自のtypeやルールを設定するのも良いでしょう。

大事なのは、チームで統一されたルールに則り、無駄な迷いを減らしていくことです。
そして、統一されたルールに則って開発を進めていけば、コードレビューや過去の履歴を追うときに、負荷を減らしてくれることでしょう。

14日目の記事は@scrpgilさんによる個人制作サイトを Angular 17→19 にアップデートした記録です!

脚注
  1. Should I use past or present tense in git commit messages? ↩︎

Discussion