コミットについて語ってみる

途中から難しくなってきてとばし読み気味になったが実用Gitはすばらしい本だ。

入門Gitもすばらしかったがそれにも劣らない(この2冊ほどでは無いかもしれないが入門gitもいい本だ)。

読んでいて感じたのはGitは歴史を書き換えてでもいいコミットを作ることに関心を持っているように思う。

間違えたコミットコメントを修正したいと思うことは誰でもありそうだが、それだけではなくコミットをまとめたり、順番を変えたりすることもGitではできる。さながら歴史をリアルタイムで作り替えているようだ。

そうやって作られたある意味では完璧なコミット履歴を見てみたい気もする。

コミットについて語る場合2つのパースペクティブがある。1つは粒度でもう1つはコメントだ。

コミットの粒度は論理的にまとまった単位であるべきだ。例えば1つのバグ修正で3ファイルいじったなら1コミットであるべきでファイル毎に3回コミットされたら後で見にくい。

ただし1回に大量のファイルをコミットされてもつらい。
コミット前に差分を確認するのがマナーだと思うので大量のファイルの差分をチェックするのはつらい。

一般的にはこまめにコミットしたほうがいいとされているが差分チェックしやすいのも理由の1つだろう。

いろいろ試行錯誤していてコミット履歴が多くなってきた場合にそれが後で整理されたら確かに助かる人も多いだろう。その工数は多そうだが。

コミットコメントに関しては以下にすばらしいエントリがある。
http://weblogs.java.net/blog/kohsuke/archive/2010/02/25/what-do-you-try-leave-your-commit-messages

以下かなりてきとーな訳です。理解できなかったところがもろばれな感じですね(汗)。
破棄しようかと思ったけどそれももったいないというかやったものはどんなにしょぼくても見せないと気がすまない性格なのでのせておきます。いや単にもう眠くなってきて頭が働いてないだけなんですけどねw





あなたはコミットメッセージに何を残そうとしますか?

James Lorenzenは説明的なコミットコメントの重要性についてすばらしいブログをポストした。でも僕は全面的には賛成できない。これ以上激しくは同意できない。

不幸なことに、僕はより良いコミットメッセージを残そうと試行錯誤してきた。これは僕がコミットメッセージの欠如によるフラストレーションから学んだ方法です。
より良い仕事をするためにみんな(僕も含めて)を励まそうというスピリットのもと、僕がコメントに残そうとしていることについてリストアップしました。

・バグID
実際バグとコミットの関連はあなたがこの関連を解析するプログラムを使用する(書く)際にも有用だ。だからこの情報はマシンリーダブルな方がいい。

・変更を生み出す契機となったアーカイブのなかのEメールのURL
Hudsonではユーザとの会話はしばしば問題やエンハンスを明らかにし結果的にコミットにつながる。このURLはその変更のコンテキストを取得することを可能にする。

・変更のディスカッションがEメールではなくIMにあるなら、僕はその全ての会話のログをただペーストする。それらはURLが無いからだ。Eメールが非公開で僕に送られてきた場合も同様だ。

・間違った振る舞いを引き起こした入力値、環境
Hudsonではさまざまなアプリケーションサーバでの特殊なケースのためにこの手法をとっている。僕は後でそれを少しばかり一般化した。 WebSphere, OC4Jなどからの奇妙な入力をコミットメッセージに記録するというものだ。これは振り返ってみたときにとても有用だ。

・直す場合は問題を示すスタックトレース
時々僕は問題を誤って解析してしまう。あとでそれを疑ったとき、もともとの出力は僕を本当に助けてくれる

もし僕が問題に対して別のアプローチを考えて/試していてそれを破棄した場合は、その内容と理由を記録する。僕が以前の変更を見返したときに、「なぜこの手法で直したんだろう? もっといい方法で直していたら。。。」と思っても後で「あー、以前そうしたから動かなかったんだな。」と発見して、以前の考えの過程を知ることができる。もし僕が大きな変更のまっただなかにいてでもその相当量を破棄する場合は、一旦コミットしてロールバックさえする。
そうすれば後でなぜそれを破棄したかがわかるからだ。

もし変更が前回の変更の論理的に一部なら、そうかく。前回の変更のコミットIDを知れば僕は間違いなくそれを残す。 しかし僕がそれを覚えていなければ、前回の変更がどこだったか、例えばいつだったか、どのファイルか、だれがしたのか、などをラフに示すようにする。そうすれば未来の自分がそれを探す必要があったときに探す範囲を狭めることができる。

あなたはコミットメッセージに何を残そうとしますか?