📝

Conventional Commitsを意識してコミットを分割する

に公開

TL;DR

  • コミットメッセージ自体はConventional Commitsのフォーマットに従わなくてもよいと思う
    • フォーマットに則ってなくても「修正」とか「リファクタリング」とか書いてあればわかる
      • フォーマットに従うのが大事なのではなく、コミットの内容がわかることが大事
    • やりたい人はやってOK
    • ルールとしてやろうとするとtypeを色々定義したくなったりして色々面倒なので…
  • Conventional Commitsでコミットメッセージを書くのが大事なのではなくConventional Commitsのフォーマットで書けるようなコミットを作るのが大事
    • 機能変更/バグ修正/リファクタリングなど目的によってコミットを分ける
      • もっというと原則的にはPull Request単位で分けたほうがよい(リファクタリングと機能変更など)

Conventional Commitsとは?

Conventional Commits の仕様はコミットメッセージのための軽量の規約です。 明示的なコミット履歴を作成するための簡単なルールを提供します。

https://www.conventionalcommits.org/ja/v1.0.0/

Conventional Commitsに従ってコミットメッセージを書くと、あとからコミット履歴を確認したときに何をやったかが大まかにわかるようになり「どうして実装がこうなっているのか?」という理解の助けになります。

例えばアプリの挙動が変わっていたときのことを考えてみましょう。
処理を追いかけその挙動が変わったコミットを見つけたとき、コミットメッセージが feat: だった場合、おそらくそれは意図した変更だろうし、 refactor: だった場合は意図した変更ではなさそうだ、と判断する事ができます。

Conventional Commitsの考え方はいいが、チームで運用しようと思うと面倒

Conventional Commitsを使うことは便利そうではあります。
しかしチームでこういったルールを運用しようと思うと様々なコストが掛かります。

  • Conventional Commitsを利用することの周知
    • Conventional Commitsを知らない人に教える・守ってもらうようにする
  • typeの追加の検討
    • 「デフォルトだとfixとfeatだけだけどrefactorとか欲しくない?」「それならperfとかtestとかもほしい」
  • 「これってどのtype」問題
    • 「バグ修正したらパフォーマンスも改善したけどこれってfix?perf?」

チームで開発していく以上、ルールを作り守ることは一定のコストが掛かります。
そのコストはそのルールを導入したことで得られるメリットに釣り合っているでしょうか?

Conventional Commits自体を導入しなくてもメリット(の一部)を享受することはできる

ここで当初享受したかったメリットが何だったかに戻りましょう。

Conventional Commitsのメリットは「明示的なコミット履歴を作成することであとからコミット履歴を確認したときの理解の助けになること」です。

ルールを導入しなくてもあとからコミット履歴を確認したときに理解できればよいはずです。

コミットメッセージでコミットの中身が理解できることが大切

形式ばってないやつは普段から書いてるはず

ぶっちゃけコミットメッセージの先頭に fix: とか feat: とか書かなくても、
普段から「〇〇を修正」とか「〇〇の機能を追加」と言ったコミットメッセージを書いているはずです。

確かに、コミットメッセージの先頭にかかれているとより目につきやすく便利だとは思いますが、普通のコミットメッセージでも十分「これは修正だな」とか「こっちは機能追加だな」とか理解することができるでしょう。

コミットメッセージがよくわからないのはコミットの内容が良くない可能性が高いのでは?

それでも「コミットメッセージだけだとよくわからないな…」となってしまうことはあります。

しかしそれは「コミットメッセージが上手く書けていないから」ではなく「コミットに色々な内容が含まれていて説明するのが難しいから」という可能性が考えられます。

Conventional Commitsのフォーマットで書けるようなコミットを作るのが大事

よってConventional Commitsでコミットメッセージを書くのが大事なのではなくConventional Commitsのフォーマットで書けるようなコミットに分割することが大事だと考えられます。

Conventional Commitsに従ってコミットメッセージを書けるような、目的毎にコミットやPull Requestを細分化することが重要です。

Discussion