Gitとその他VCSの違いについて

なんとなく会社でGit使っているからとか、チュートリアルの中でGitを使うように書いてあるからとかでGitを使い始める人も多いですね。僕もそうだったんだけど、最初に「なぜGitを使うのか」とか「Gitと他のVCSCVSとの違い)」とかを知っておくのは非常に重要だと、今になって思うのです。手段が目的化してしまいますからね。

あとなんとなく「基本的には他のCVSと同じだろう」って思うのは大きな罠です。UIが似てたりするのでよくそうゆう勘違いが起きますが、データの扱い方が全然違います。後から「あれ、なんでこうなってんだ?」っていう混乱を避けるために、Gitを学ぶ際はそれらの違いを最初に頭の中で明確にしておく必要があるのです。

一番大きな違いは、まず他のVCSに於いては常に前のバージョンのファイルとの差異にフォーカスを当てているのに対して、Gitはスナップショット(←これキーワード)を撮っているという事です。

Git以外の方式--例えばCVSだったりSubversionだったりPerforceだったりBazzarだったり--は一般的にdelta-based version controlと呼ばれていて、ファイルの更新をリスト化して保存しているイメージです。

それに対してGitは、commitコマンドを打つたびに、現状のファイル状態をまるっとスナップショットします。厳密に言うと差異をチェックはしているので、何も変更がない場合はそのスナップショットが自動でスキップされたりするのですが、まあそれはレアケースですね。

とても抽象的な話なので、ここまで自分で書いておいて「なんのこっちゃ」とも思う訳ですが、これは非常に重要な事なのです。後述するブランチングに深く関わってくる事なのですが、とりあえず「gitはスナップショット、他のVCSは差異保管」という事で、それは大きな違いだって事を頭に入れておけばOKです。

 ほぼすべての操作がローカルで行える

Gitの操作のほとんどはローカルで行えます。何かしようと思った時、サーバーなり他のクライアントなりを見に行く必要がありません。これが例えばCVCSを使っていたら、常に会社のサーバーと接続していないと作業が出来ないし、更にサーバーから常にレスポンスを待たなくてはいけないので、レイテンシが気になる時もあります。このあたりもGitの大きな強みで、スピードが重要視される現代にぴったりとマッチしているのですねー。

更新履歴を確認しようと思った時、Gitなら普通にすべての記録がローカルに書き込まれているので、それを見るだけです。一瞬でアクセス出来ます。前のバージョンの差異を確認したい時も同様で、ローカルですべて完結します。かつてのサーバー管理者に「すいません。。。前のバージョンのログ見たいのでプルリク送ってもいいですか?」と頭を下げる必要がないのです(かつては本当に行われていた)。

つまりGitで管理しているプロジェクトならば、ほぼすべての作業がオフラインで行えるという事です。飛行機の中でも作業可能っていうのは大きいんですよね。上空10000mでコミットとか格好いいですね。あと個人的にはあまり好きではないVPN、これ使っている会社にいる時でも、作業自体はローカルで完結します。いやー便利。