2014年3月27日木曜日

Gitについて

何年か見ない間に Maglog がサービス終了してしまったらしいので、開発ブログを移転します。

まずはテストということで、書き溜めていたGitについての記事を投稿してみます。


Gitについて


Git とは、バージョン管理システムの一つである。


いままで最適解を求めて様々なバージョン管理システム(VSSSubversionMercurialBazaarDarcsFossil)を渡り歩いてきたが、どうやら Git に落ち着きそうなので、 Git のなにがそんなにいいのかをまとめておこうと思う。

セールスポイント

  • やり直しがきく
  • 分散型であるため環境によらず作業できる
  • GitHub が優れている
  • 高速である
  • Linux カーネルを管理しているという大きな実績がある
  • コマンドが豊富で、やりたいことが大抵できる
  • データ構造が頑健で(ソフトウェアエンジニアとしては)信頼がおける
  • とにかく、困ってしまうケースがない(バッドケースにはまってしまっても必ず復帰できる)
    →これは、自由度を下げて「困ってしまうケースが作れないようにする」設計思想とは全く異なる

弱点

  • 初心者にはとっつきにくい (ギーク向け感は否めない)
  • Linux 至上主義 (Windows ユーザーが喜びそうな機能でも、 Linux での動作が少しでも遅くなりそうなものは受け入れられない)
  • 日本語ドキュメントが少ない (メンテナーは日本人だがヘルプなどのローカライズは遅い)
慣れてしまえばどうということはない弱点だけである。

世界での動向

Google Trend の検索人気度では 2009 年頃から Subversion を追い抜き他を圧倒する勢いを見せている。



日本における動向

海外に比べると少し遅れているが、受け入れられつつあり 2011年には Subversion を追い抜いている。
Mercurial, Bazaar などと比べるとローカライズはあまり熱心ではないが、一部の人間には受け入れられており、 Google 先生に聞けば熱狂者の紹介文がわんさと出る。

参考書

初心者向けではないが、メンテナーが書いているため信頼性はダントツの参考書

Git 用クライアント (Windows向け)

  • MSysGit
    コマンドラインを基本とする、元のGitに最も近いWindows移植版ツール。gitkというリビジョングラフを表示する最低限のGUIを備える。
  • Git Extensions
    MSysGitに機能豊富なGUIフロントエンドを組み込んだもの。コマンドラインほどではないが、TortoiseGitに比べるとかなりの機能を使いこなせる。Visual Studio2005~2012に組み込めるプラグインも同梱されている。GUIを使うならお勧め。
  • TortoiseGit
    Subversionに対するTortoiseSVNと同じ位置づけのGUIツール。おおむねの機能をカバーするが一部コマンドラインでしか出来ない操作がある。
  • GitHub for Windows
    GitHubというホスティングサイト用のツールだがローカルでも使用できる。Windows Scripting HostかBashでGitを操作できる。
このほかにも 様々なGUIクライアント が開発されており、ユーザーの多さを示唆している。

「失敗」に強い

下記のような、他のVCSでは困難な操作ができ、その際に昔の状態もバックアップされる。
  • 間違ってコミットしてしまったのを修正したい
  • 試験機能のブランチは上手くいかなかったので取り消したい
  • コミットの変更範囲が大きすぎるので2つのコミットに分割したい
  • 細かいコミットが多すぎるので一つにまとめたい
  • コミットの順番を変更したい
  • リポジトリを2つに分割したい
  • 分割したリポジトリを1つにまとめたい
  • ずっと昔にコミットしてしまった機密情報やサイズの大きいファイルを取り除きたい

フィットする開発スタイル

  • テストブランチを大量に作る試行錯誤型のプロジェクト
  • 多人数が関わり各人が好き勝手に分岐する
  • 結果的に要らなくなった枝葉は消去してすっきりとした履歴を残すことが出来る
  • ブランチを作るハードルがSubversionに比べても圧倒的に低い

要するに

  • 後からでも何とかなるという安心感がある
  • 運用を始める前に準備・検討・心配しておかなければならないことが少ない
  • 「ああしておけばよかった!」と思うことはまずない
  • 人間は間違いを犯すものである “Errare humanum est”

内部構造

Git の履歴はリポジトリと呼ばれる、一つのオブジェクトデータベースで管理される。
Git の成功はリポジトリの設計の良さによると言っても過言ではない。 (このため内部構造から解説する説明文が多く、初心者にとっつきにくさを感じさせる一因にもなっているのだが)
  • リポジトリの実体はハッシュをキーとするリンクリストであり、単純ながらきわめて頑健なデータ構造である
  • 少し専門的には 無閉路有向グラフ といわれる構造をしている (ハッシュIDには親のハッシュも含まれるので、循環構造は作れない)
  • あまりにも単純なので手でオブジェクトデータベース内部の解析ツールが作れるぐらいである
  • ディレクトリ構造は Hash-tree 構造となっており、動作速度とディスク容量の削減を両立している


階層的ワークフロー

分散型の特徴を活かして、中央リポジトリにプッシュできる権限を持つ人間を制限し、責任者のレビューを通った変更だけを反映するワークフローを構築できる。
多人数での作業に向いており、Linuxカーネルのワークフローもこれを多階層、大規模にしたものにすぎない。


0 件のコメント:

コメントを投稿