← 記事一覧へ

バージョン管理システムの種類 — Git・SVN・その他の違い

gitsvn

バージョン管理はいまGit一強だが、会社に入るとSVN(Subversion)のリポジトリが現役だったりする。バージョン管理システム(VCS)の全体像と、GitとSVNの考え方の違いを整理する。

バージョン管理システムとは

ファイルの変更履歴を記録して、「いつ・誰が・何を・なぜ変えたか」を辿れるようにし、任意の時点に戻せるようにする仕組み。複数人が同じコードを触っても壊れないようにする並行作業の交通整理も担う。

最終版_v2_修正済み(最新).zip のようなファイル名運用の正式な解決策、と言えばだいたい合っている。

2つの方式: 集中型と分散型

VCSは歴史的に「集中型」から「分散型」へ進化してきた。

集中型(SVNなど) 分散型(Gitなど)
履歴の置き場所 中央サーバーに1つだけ 全員の手元に完全なコピーがある
commitの意味 中央サーバーに即反映される 手元のリポジトリに記録されるだけ(共有はpush)
オフライン作業 ほぼ不可(履歴参照もサーバー必要) 履歴閲覧・commit・branch全部できる
リビジョンの識別 連番(r100, r101, ...) ハッシュ(a1b2c3d...
ブランチ ディレクトリのコピーとして表現。重い文化 軽量。気軽に切って捨てる文化
サーバーが壊れたら 履歴が失われる恐れ(バックアップ頼み) 誰かのcloneから復元できる
  • 集中型: 中央に「正」が1つあり、全員がそこに直接コミットする。状態がシンプルで分かりやすい反面、サーバーに繋がらないと仕事にならない
  • 分散型: 全員がリポジトリの完全な複製を持ち、手元で自由に作業してから同期する。GitHubやGitLabの「中央リポジトリ」は技術的な必須要素ではなく、運用上そう扱っているだけ(だから手元だけでcommitが完結する)

主なVCSと使われる場面

Git(分散型・現在のデファクト)

  • Linuxカーネル開発のためにLinus Torvaldsが作った(2005年)
  • ブランチが軽い・速い・オフラインで完結する、が武器。GitHubの登場でOSS標準になり、そのまま業界標準に
  • 新規プロジェクトでGit以外を選ぶ理由は今はほぼない

Subversion(SVN。集中型の代表)

  • 2000年代の企業開発の標準。歴史の長い社内システムでは現役
  • 連番リビジョンが分かりやすい、リポジトリの一部ディレクトリだけチェックアウトできる、ファイルロック(同時編集の禁止)ができる、などGitにない性質もある
  • 巨大なバイナリを多数含むリポジトリでは、歴史全部を手元に持たない集中型の方が軽いという事情もあり、あえて残している現場もある

Mercurial(分散型)

  • Gitと同時期に生まれた分散型。コマンド体系が素直で、かつてはFacebookやMozillaが採用していた
  • 現在は新規採用がほぼなくなり、ホスティング(Bitbucket)もサポートを終了した。「Gitに敗れたもう一つの分散型」として名前だけ知っていればよい

Perforce(Helix Core。集中型)

  • ゲーム業界・大規模バイナリアセットの現場で強い商用VCS。数百GBのアセットでも高速で、ファイルロック運用が前提のアート制作と相性がいい
  • UnrealEngine系の大規模開発では今も第一線

GitとSVNの対照表

SVNの現場に入ったとき用の読み替え表。同じ単語で意味が違うものがあるのが罠。

したいこと SVN Git
リポジトリを手元に用意 svn checkout URL(作業コピーだけ取得) git clone URL(履歴ごと複製)
最新を取り込む svn update git pull
変更を記録 svn commit即サーバーに反映 git commit(手元のみ)→ git push で共有
状態確認 svn status git status
差分 svn diff git diff
履歴 svn log git log
元に戻す svn revert git restore など
ブランチ svn copybranches/ ディレクトリへコピー) git branch / git switch -c
標準的な構成 trunk/ branches/ tags/ ディレクトリ main ブランチ + ブランチ機能

特に注意する差:

  • checkout の意味が全然違う。SVNのcheckoutはGitのclone相当。Gitのcheckout(switch)はブランチ切り替え
  • SVNのcommitは即共有。Gitの感覚で気軽にcommitすると、ビルドの通らないコードが即チームに届く。SVNでは「commit = push」と思って慎重に
  • SVNにはステージング(git add)がない。変更したファイルはそのままcommit対象になる
  • SVNのブランチはコピー運用なので、Gitのように「1機能1ブランチで毎日切る」文化ではないことが多い。現場のルールに従う

どれを学ぶべきか

  • Gitだけで足りる。概念(分散型・ブランチ・マージ)を一度身につければ、他のVCSは対照表レベルの読み替えで対応できる
  • SVNの現場に入ったら、上の対照表+「commitは即共有」「checkoutはcloneのこと」の2点だけ最初に意識する
  • git svn というブリッジ機能を使うと、SVNリポジトリを手元だけGitとして扱うこともできる(現場のルールが許せば)

まとめ

  • VCSは集中型(中央に履歴が1つ)と分散型(全員が完全な複製を持つ)の2方式
  • 現在はGit(分散型)がデファクト。SVNは歴史ある社内リポジトリで現役、Perforceはゲーム・大規模アセットの世界で現役
  • GitとSVNはcheckoutとcommitの意味が違うのが最大の罠。SVNのcommitは即サーバー反映
  • 学ぶ優先度はGit一択。他は現場に合わせて読み替えれば足りる