dackdive's blog

新米webエンジニアによる技術ブログ。JavaScript(React), Salesforce, Python など

Emoji Prefixに学ぶgitのコミットの分け方

こちらの記事を読んで。

http://memo.goodpatch.co/2016/07/beautiful-commits-with-emojis/

この記事では、Emoji Prefix というコミットメッセージに関するルールについて紹介している。
どんなルールかというと、「コミットメッセージの先頭には、コミットの内容に合った Emoji をつけましょう」というものらしい。

Prefix に使える Emoji の種類をルール化し、コミットメッセージにはいずれかの Emoji を必ずつけるように徹底することで
コミットの内容がわかりやすくなるだけでなく、粒度も揃うという効果が期待できるようだ。

以下、記事から引用。

最も期待している効果は、コミットが綺麗になることです。 開発の現場では「インデントの修正と機能の修正を同じコミットにしないでください 😭 」といった悲痛な叫びをよく耳にします。 Emoji Prefixのルールでは「インデントの修正と機能の修正」を同時に表すEmojiが定義されていないので、Emoji Prefixに従ってEmojiをつけるためにはコミットを分ける必要がでてきます。 このように適切に定義されたEmoji Prefixを使うことで、ごった煮コミットが作られにくくなり、ある程度機械的にコミットの粒度を揃えることができます。 コミットが綺麗になればコードレビューの時間を節約できたり、歴史を追いやすくなるのでとても嬉しいことですね🎉

なるほどー面白いなーと思いつつ、そういえば社内でも「コミット分けろっていうけど、じゃあ適切なコミットの粒度ってなんなんだ」という議論がちょうど起きていたので
この Emoji Prefix のきっかけとなった(と、記事では書かれている)Atom のコントリビュートガイド にはどんな種類の Emoji が定義されているのか、気になって確認してみた。


Atom での Emoji Prefix

ref. https://github.com/atom/atom/blob/master/CONTRIBUTING.md#git-commit-messages

英語が怪しいが、おおむねこういう内容だという認識です。

  • 🎨 :コードのフォーマットや構造を改善した
  • 🐎 :パフォーマンスを改善した
  • 🚱 :メモリリークを修正した
  • 📝 :ドキュメントを書いた
  • 🐧 :Linux 環境固有の問題を修正? (fix something on Linux)
  • 🍎 :Mac 環境固有の問題を修正?
  • 🏁 :Windows 環境固有の問題を修正?
  • 🐛 :バグを修正した
  • 🔥 :コードやファイルを削除した
  • 💚 :CI に関する修正
  • ✅ :テストを書いた
  • 🔒 :セキュリティ関連
  • ⬆️ :dependencies (依存ライブラリ?) をアップグレードした
  • ⬇️ :dependencies をダウングレードした
  • 👕 :lint の警告を remove した (lint で警告されていたところを修正した、の意?)

また、Emoji 以外のガイドとしては

  • 現在形を使う(Added feature でなく Add feature。英語のコミットメッセージでよく言われるやつ)
  • 命令形を使う(Moves cursor to... でなく Move cursor to...、のように3単現の s とか不要。これもよく聞く)
  • 1行目は72文字以下
  • issue や PR へのリファレンスはふんだんに (liberally) <- #xxx を多用しなさいってこと?
  • ドキュメントの変更だけの場合、[ci skip] を含める


所感

ぱっと見で思ったこととしては

  • 先頭1文字でコミット内容がだいたいわかる、というのは良いと思う
    • コミット内容に応じて [Tag] をつけようかという話が社内であったので、それより圧倒的にスマートになる
  • OS 固有の修正のためにそれぞれの Emoji を用意してるの面白い。が、自分達のプロダクトでは必要ないだろうなー
  • あくまで個人的な感想だけど、直感的にわかりづらい Emoji がいくつかあるような。。。
  • いずれにしてもこんなに種類あると意味を覚えてらんなさそう

実際には、記事を書いてくださった Goodpatch さんがやられているように
これをそのままマネするのではなく、チームに合った独自ルールを定義することになるんでしょう。

気になったのは、「機能改善」とかでひとつの Emoji にしてしまうと
内容は分けられるけど粒度はものによってはばかでかいコミットになってしまわないかなーというところ。
これも、チームとしてのコミット粒度に対する考え方によるんでしょうね。
(粒度を揃えるというよりも「1つのコミットで1つのことをやる」を徹底させる目的と捉えた方が適切か)

自分のチームに合ったルールを作る、という部分に難しさはあるが、それなりに効果がありそうなので検討したい。
好き嫌いあるけど、メッセージが華やかになるのいいすね。


おまけ

記事に Tips として書いてあるコミットテンプレートという機能が地味にすごい。