システム開発とは切っても切り離せない「バージョン管理ツール」。
その中でもどんどんシェアを伸ばし、その重要性が増している分散バージョン管理ツールGit に関してまとめました。by tbpgr
はじめに
こんにちは。出題者のtbpgrです。
「今でしょ!」は古いのでは……という声が聞こえてきそうですが
分散型バージョン管理ツールの代表格、Gitに関して以下の内容を扱います。
- Gitの概要
- 集中型と分散型
- ロック式とコピー/マージ式
- Git のメリット
- 現実の障壁
主にバージョン管理ツールは利用しているがGitは使ったことがない、
という方に向けた内容になっております。
読み方
Git(ぎっと)と読みます。
文章中の略語について
以下の略称で記述します。
| 正式名 | 略称 |
|---|---|
| Subversion | SVN |
| Visual SourceSafe | VSS |
1. Gitの概要
Gitは分散型のバージョン管理ツールです。
Gitの作者はLinuxの作者である、リーナス・トーバルズ氏です。
Linuxカーネルの開発のために必要な機能を持つ
バージョン管理ツールがなかったため、自ら作成したことが発端です。
そういった経緯もあり、他のツールと比べるとパフォーマンス・機能面などで優れた点が多くあります。
2. 集中型と分散型
バージョン管理ツールには集中型と分散型があります。
Gitは分散型のバージョン管理ツールです。
| 集中型/分散型 | ツール名 |
|---|---|
| 集中型 | VSS |
| 集中型 | CVS |
| 集中型 | SVN |
| 分散型 | Git |
| 分散型 | Mercurial |
| 分散型 | Bazaar |
集中型
集中型はリポジトリを中央サーバーで管理します。
各開発者は都度、クライアントPCからサーバーに接続してファイルの取得や更新を行います。
このため、以下のようなデメリットがあります。
- 基本的な操作がネットワーク経由となるため遅い
- 中央サーバートラブル時に作業が滞る
- 中央サーバーがクラッシュし、バックアップも失敗していた場合に履歴が失われる
分散型
分散型は各クライアントがリポジトリ全体を保持していて、
基本的な操作の多くはローカルPC内で完結します。
そのため
- ネットワークに依存せず、高速に操作できる
- サーバートラブルの影響が小さい
- 各クライアントがリポジトリ全体を保持しているので、サーバークラッシュなどがあっても復元が容易
というメリットがあります。
3. ロック式とコピー/マージ式
バージョン管理ツールでは、一つのファイルに対して
同時に変更が発生する場合を想定して二つのアプローチをとっています。
Gitはコピー/マージ式です。
ロック式
ロック式はファイルの編集時にロックをかけて、他のユーザーが触れないようにします。
ロックをしたユーザーが編集を完了し、ロックを解除して、はじめて他のユーザーが編集することが可能になります。
この手法は予期せぬ編集の衝突でプログラムが壊れる心配こそないものの、
- 最新のファイルを参照できない期間が長くなる
- 複数担当で同じファイルを編集したい場合に、待ち時間が発生する
- ファイルのロック解除を忘れたり、担当者がロックしたまま急に休みを取得した際に作業が滞る
などのデメリットがあります。
自分が編集したいファイルが、いつロック解除になるのか気にかけながら作業するのはストレスがかかりますし、
本来は気にしなくてもいいようなことに脳のリソースを割くことになります。
それでも開発のスピードや開発者のストレスより、間違いのない安心感を選ぶならロック式ということになるでしょうか。
各自が担当するファイルが明確で、作業が衝突しないように割り振られているような現場ならデメリットは気にならなくなるかもしれません。
そういった場合は、担当をまたいだ共通化や設計改善などがおろそかになりがちですが。
コピー/マージ式
コピー/マージ式は、ファイルの編集に制限を設けません。
そのため常に編集したいファイルを編集可能です。
しかし、複数の開発者が同じファイルを編集した場合はマージが必要になります。
同一行の編集がない場合など、マージが単純なものであればマージ用のコマンドを実行すれば完了です。
変更が衝突(= Conflict )した場合は、内容を確認して手動で編集する必要があります。
待ち時間が発生せず、快適な開発が可能ですが、
- ロック式に比べると複雑な作業である「マージ」が必要
- マージミスによるバグの発生の可能性がある
などのデメリットがあります。
しかし、アジャイルな手法の普及により、
- 小さなサイクルの開発 => 小さな単位でのマージ
- 自動テスト/継続インテグレーション => 問題の早期検出
など、デメリットは大分抑えることができるようになっています。
4. Gitのメリット
まずは、すでに挙げた以下のメリットがあります。
- ネットワークに依存せず、高速に操作できる
- サーバートラブルの影響が小さい
- 各クライアントがリポジトリ全体を保持しているので、サーバークラッシュなどがあっても復元が容易
さらに、
- 組織や利用方法に合わせて柔軟なワークフローを採用できる
- 個人で気軽に利用できる
- ブランチの操作が高速
などのメリットがあります。
各メリットについて
1. 組織や利用方法に合わせて柔軟なワークフローを採用できる
分散型の特徴を活かし、様々な形式で運用することができます。
2. 個人で気軽に利用できる
- 未だにバージョン管理ツールを使っていない。
- バージョン管理ツールの利用を提案したが却下されてしまった。
そのようなチームに所属してしまった場合に、自分だけでもGitを導入してバージョン管理することができます。
(このメリットはGitだけのものではありませんが、他のバージョン管理ツールよりも個人利用が手軽にできるでしょう)
3. ブランチの操作が高速・便利
集中型のバージョン管理ツールで現状、最も利用者の多いSVNと比較します。
SVNではブランチはコピーです。そのため、プロジェクトが大きくなるほど操作は遅くなります。
Gitではブランチはポインタに過ぎません。そのため高速に操作できます。
実際にGitを利用した開発では各トピックごとにブランチを細かく作成するスタイルが標準的であり、
そういったスタイルにストレスを感じないほど快適にブランチを操作できる、とも言えます。
5. 現実の障壁
Gitが良さそうなのはわかっている。
しかし下記のような状況で業務では使うことはできない、
というケースは多いのではないでしょうか。(特にSIer系の現場では)
- 組織内での実績がないため採用されない
- チームメンバーのスキルレベルが低すぎて学習コストが高い
- Gitがどういったものか、説明しても理解してもらえない
残念な理由が多いですが、実際にはこういった現場は多々あるでしょう。
例えば最近になってもまだ手動で履歴管理をしている開発現場があります。
実際に2年前に実務で経験しました。
当然バージョン管理ツールの導入を提案しましたが、即却下でした。
他にはこんな現場も実際によくあります。
SVNを利用しているが、
ほとんどの開発者はファイルの取得・更新程度しかできず 、
マージやブランチ操作などはできない。
マージが発生したら、
その都度リポジトリを壊すようなコミットをする開発者がいる
なんてことは技術力を軽視した採用をしている現場では珍しいことではありません。
そんなチームでは、マージやブランチ操作を頻繁に行うGitの導入は確かに高いコストになるでしょう。
低レベルな理由が多いですが、実際にそういった事情により実務でGitに触る機会がない方が多くいます。
もし、業務でGitを使う機会がなく、私生活でも使ったことがないのなら
是非この機にGitを習得してください 。
もうすでにGitは必須スキルと言ってもいい位置に来ています。
例えば、Martin Fowler氏が所属することでも有名なThoughtWorks社は定期的に、
新規技術の動向をTechnology Radarとしてまとめています。
ここでは、各技術を以下の四段階に分類しています。
- Adopt:導入すべき
- Trial:動向を追いかけるべき
- Assess:調べる勝ちがある
- Hold:注意しはじめる
Gitは2012年の時点で、「Adopt」に位置付けられています。
さいごに
Gitは旧来のバージョン管理ツールと大きく異なる部分も多く、
マージやブランチの操作などをあまりしたことがない開発者にとっては小難しいものに見えて敬遠されているかもしれません。
数年前は、Web・書籍などの情報も少なく、日本語対応にも難があったため本当に敷居が高かったのですが、
最近では
- Webの情報は充実。特に入門者向けの分かりやすい学習サイト、概要を説明する分かりやすいスライドなども多くある
- 書籍も多数あり、雑誌などでもたびたび特集記事にまとめられている
- 日本語も問題なく扱える
- GUIツールが充実してきた
など、どんどん敷居は下がっています。
Git、いつやるか?・・・今でしょ!
参考資料
- Git公式サイト
- ThoughtWorks Technology Radar
CodeIQ運営事務局より
今でしょ! というわけで、Gitに関する入門問題を掲載中です。問題を解きながら、覚えられるようになっています。ぜひチャレンジしてみてください。
また、履歴を変更する問題も掲載予定です。こちらもぜひ、お楽しみください!