はじめに
Gitを理解するためには、その前提として「VCS」という思想を学ぶ必要があります。
VCS入門で勉強した時のメモです。
VCSの意義
VCSの能力は、主に次の2つです。
- 履歴を残す
- 作業の競合を防ぐ
履歴を残す
履歴が残ると何ができるのか。大まかには次の3つができるようになります。
- 履歴を残す
- 参照
- 再現
- 分岐
参照
履歴をたどることで、誰がいつ何をやったかを確認することができます.
一般的なVCSでは履歴の検索機能もありますので、簡単に対象となる履歴を参照することができます。
再現
VCSを使うと、履歴を参照するだけでなく、その時点の状態を再現することも可能です。つまり、動かなくなったとしても正常に動作していた状態に巻き戻せる、ということです。
分岐
過去の状態を再現した上で、そこから別の変更を加えることで、履歴を分岐することもできます。つまり、複数のアプローチにより、作業を行うことができるということです。
作業の競合を防ぐ
VCSのもう一つの大きな機能が、「作業の競合を防ぐ」です。VCSを使うことで、誰かが先に変更していればそのことを検知し、VCSが競合箇所を知らせてくれます
また、使うVCSによっては、ファイル内の変更箇所を解析し、自動的に自分が行った変更内容と統合(マージ)する機能を持っています。この機能を活用することで、他のメンバーと効率よく並行して作業を進めることができるようになります。
VCSの限界
- 「とりあえず」反映している
- 「どうやったのか」をメッセージに書いている
- 動かないものも反映している
- 複数の変更を盛り込んでいる
⇨VCSは便利ですが、あくまでツールです。ツールは人の作業を補助はしてくれますが、それだけではうまくいきません。ましてやシステム開発はチームで行うものです。2人以上がコミュニケーションを取るには、最低限のルールが必要です。
このことを言い換えると、VCSはルールと対になって初めてその真価を発揮する
守るべきルールが見えてきます。それが次のルールです。
- 「時間」ではなく「作業」の単位で行う
- 「どのように」ではなく、その作業を「何故」「何を」「何のために」行うかをメッセージに残す
- 動かない成果物はリポジトリに反映しない
- 一度に一つの変更だけ反映する
「一言で何をやるのか表せる単位で作業を区切って、リポジトリに反映する」ことが重要です。一言で表せないのならば、それは行おうとしている作業が大きすぎるのです。こんなときは、より小さな単位に分けて作業を行えないか考えてみましょう。
SCMという智慧
VCSがない状態では、次の問題がありました。
- 作業履歴が残らない
- 他の人と作業がぶつかる
また、VCSを導入した後、ルールが無ければこんな問題がありました。
- 履歴から目的の変更を探せない
- 履歴の一つが、どういったきっかけで変更されたかわからない
以上の問題から、VCSを使って行いたかった事とは、
- 各バージョンを識別したい
- 特定のバージョンを再現したい
- 何故変更が行われたのか知りたい
- 他の人と連携して作業を行いたい
ともいえると思います。
これらを実現するための考え方が「SCM(Software Configuration Management、ソフトウェア構成管理)」です。
- Software : ソフトウェア
- Configuration : 構成
- Management : 管理
「ソフトウェア構成」とは「ソフトウェアというまとまりがどのような要素の組み合わせでできているか」
ある時点でのソフトウェアを構成する要素すべてを、識別、再現、追跡出来るようメンバー間で成果物を共有し、連携を促すための仕組み、ルール、プロセスを構築し、運用する
SCMでやりたいことを今一度まとめると、仕様変更、バグなどをトリガーとした「変更依頼」で発生した、ソフトウェア構成の変更履歴について、
- 識別
- 参照
- 再現
が出来なくてはなりません。
このことから、VCSを使う際には次のことを意識する必要があります。
- ソースコード以外も管理する
- 履歴を識別するメタデータを付加する
- 「タグ」を活用する
SCMの次のステップ
SCMは「変更依頼」の管理も含めてSCMである、と説明してきました。主な変更依頼のトリガーとしては、「バグ」、「仕様変更」等があります。
そこで、変更依頼を管理するためのツールの出番です。こういったツールは一般的に「ITS(Issue Tracking System、課題管理システム)」と呼ばれます。
ITSでは、Issue(課題)を「Ticket(チケット)」という単位で登録します。このチケットには一意となる番号(チケット番号)が振られ、担当者を割り当てたり、関連する内容をコメントしたりする機能があり、課題を完了したらチケットを「閉じる(クローズする)」決まりになっています。
これにより、今残っている課題、終わった課題、誰が担当しているかなどが明確になり、管理が容易になります。
参考文献
VCS入門
Github上で無償公開されています。本当に素晴らしい資料です。
Gitをはじめからていねいに
こちらもGithub上で無償公開されています。本当に素晴らしい資料です。