ファイル単位でコミットを分割したい場合
開発作業ではファイルを追加->ステージング->コミットを繰り返していきますが、ファイル単位でコミットを分割したい時があります。
肝のプロジェクトファイル
Visual Studio ではプロジェクトに含まれるファイルの一覧を保持するファイルがあります。すなわちプロジェクトファイル(「.csproj」「.vbproj」など)です。
注意が必要な場合
例えば「画面001の開発を完了」という感じのコミットを作りたいけれども実際には次の「画面002」のファイルも一部既に用意してある、といったケースです。
「画面002」に関連するのはまだコミットには含めたくないファイルですが、プロジェクトファイルには、すでに記述があります。
このまま「画面002」だけ除外してコミットしてしまうと、コミットしていないファイルの参照も含まれてしまうことになります。他のメンバーがリポジトリをクローンすると、Visual Studio 上では行方不明のファイルとして表示されます。
コミット除外対象にプロジェクトファイルを含めるとどうなるでしょうか。
今度は逆に「画面001」の関連ファイルがプロジェクトに含まれないものになってしまいます。
いずれにしても他のメンバーには状況が解りません。ひょっとしたらビルドが通らないかもしれず、一時的にせよ迷惑をかけることになるかもしれません。
プロジェクトファイルを行単位でコミットする
そのような場合はプロジェクトファイルに対して git add を対話的に実行し、ファイルの中の一部、必要な変更点だけをステージすることで対応できます。
git add -p <プロジェクトファイル名>
おわりに
関係ない他のファイルを手動で退避してコミットするというのもミスが起きやすくなりますし、他のファイルを追加する前に細かくコミットするというのも望ましくない場合があります。開発作業は、それを進めるうちにも様々の知見が積み重なるため、その得られた知見を以て先行して開発したコードにもリファクタリングを適用する、ということはよくあります。最初から一発で奇麗なコードが書けるようにしっかりと準備することは大切ですが、そうそううまく行かないことが多いのも事実。そうした場合はまとめて作業して、全体的にこなれて、複数のコード間で品質が均質化してからコミットしたいもの。
しかしチーム内ルール、その他の理由などによって、コミットを分割したい場合も、やはりあるものです。
Git では、必要に応じて上記 git add -p でファイルの変更に対して段階的にステージング->コミットをしていくことができます。この機能により、Visual Studio のプロジェクトファイルのようなものでもコミットの単位を自在にコントロールできます。
いやはや便利です。