engineers_blogこんにちは。アグリゲーション開発担当の中川です。今回は、みんなが大好きな構成管理ツール「Git」について話したいと思います。使い始めてから、バグの発生数が激減しました。使ったとある手法によってレビューが充実し、バグの少ないコードを書くようになったと考えています。今回はその手法について紹介したいと思います。基本知識が必要となります。以下のようなコミット履歴があるとします。バグったので修正これは、とある開発者のA君が水曜日の午前中をかけて仕上げた改修のコミット履歴です。A君は、普通にコーディングしながら定期的にコミットを行った結果、このようなコミット履歴が出来上がりました。A君の作業の流れがそのままコミットに反映されているこのコミット履歴は、どこに問題があるのでしょうか?答えは、レビューの観点にあり、レビュアーにとってはA君の作業の流れは特に重要でなく、システムに対して加えられる変更を知ることが最も重要だからです。その上、一実装者の改修を数人のレビュアーがレビューするチームでは、レビュアーの時間は貴重な資源となり、レビューしやすいコミットを作ることが大切になってきます。コミット履歴は自然な開発の流れでこの並びになったのであって、初めからレビューしやすいコミット履歴を作りながら開発することは困難です。無理にそのようなことを意識して開発を行えば、発想を妨げ、かえって非効率になりがちです。A君はどのようにするば良いのでしょうか?結果的に、A君は上のコミットをそのままレビューに出さず、このようにしました。(単体に分けられる機能は独立してコミット。仕様変更○○これは、A君が水曜日の午後に数十分かけて整理したコミット履歴です。history(綺麗な履歴)と言うようです。SVN)は、コミットを後から変更すると言う概念が無かったため、作業の流れがそのままのコミットとなった履歴をメインブランチに出すしかありませんした。第三世代の構成管理ツールは、コミットを作った後にそれを変更するというワークフローが配慮されているため、品質管理では貴重なツールとなっています。変更可能なコミット履歴の範囲コミット履歴は、共通ブランチにマージしてプッシュするまでが変更可能な範囲です。展開されているため変更はできません。コミットは議論性の低い順番に並べる基本的な考え方として、レビューに出すコミットの並びは議論性の低い順番に整列するのが良いと言われています。具体的には、このような並びが良いでしょう。(それぞれの分類で複数コミットが存在しても構いません。仕様変更レビューする人は、後の方のコミットに最も時間をかけて慎重に確認することができます。指摘を受けやすい議論性の高いコミットを後の方に置くことで更なる変更が加えやすくなります。レビューに出した仕様変更が最終的に無しになる場合でも、「既存バグの修正」はシステムにあった方が良いもので、「リファクタリング」や「単独モジュールの追加」もコードベースを良くする物であれば入れることに越したことがありません。このように、議論性が低く採用しやすいコミットを先に置くことで、必要に応じて途中までのコミットをそのままメインブランチにマージすることが可能となります。これは後続のコミットが先方のコミットに依存している場合の話です。依存しない場合は、そもそも別のブランチで管理するのが良いでしょう。活かす作業フローここでいきなり基礎的な話になりますが、綺麗な履歴作りの前提となるためおさらいを兼ねて見ていきましょう。確認してから、コミットメッセージを記入してコミットする方法となります。強みを活かすために最もお勧めです。インデックスは「ステージング」や「ステージングエリア」とも言います。コミットを行う際に用いる機能としては後者の用語を使うのが主流です。繰り返すコミットメッセージを記述してコミットステージングに入れて、確認する工程を設けることで、コミットに含まれる改修をより明確に意識することが可能となります。インデックス/ステージングが扱えないツールもありますので気を付けましょう。前章ではファイルをステージングに登録してからコミットを準備するという話をしましたが、実際はファイル単位でなく、行又は「ハンク」単位でステージングする事を推奨します。(未ステージ)ペインからファイルを選択し、黄色(右)のペインからハンクや行を選択して登録します。すると、登録したハンクや行が未ステージの表示から消えます。ペインのファイルを選択すると、前述でステージングに登録した差異が黄色のペインに表示されます。ステージングに入れすぎた場合は、緑色のペインからファイルを選択して、同じように黄色のペインからハンクや行を選択してステージングから外すことも可能です。追加する「ハンク」を選択します。ステージングから下す「ハンク」を選択します。ステージングされている差異を確認します。利用すると、行単位以下でもステージング対象にすることができます。)ステージングを活用するメリット一つのファイルに複数の用途の改修が入っている場合、ステージングを使わなければ一コミットに混ざってコミットされてしまいますが、部分的にステージングしてコミットすることで個別のコミットを分けることが可能となります。他にこのようなメリットがあります。一式見直すよりも問題点を見落としにくい誤った改修に気づいた場合はその場で直したり、ステージングしないで残していける綺麗な履歴作りさて、A君のコミット履歴ですが、A君が行ったことは主に次の三点です。同じ機能のコミットは一つのコミットに統合して冗長性を無くす分けられる機能が混ざっているコミットは分割して、それぞれの機能ごとの個別コミットを作るコミットを議論性の低い順番に並び替えるこれらの変更を加えるためのコマンドを紹介します。(HEAD、デタッチ状態)コマンド紹介の先に用語のおさらいです。現在「居る」コミットを示します。