GitとSVN:バージョン管理システムの基礎と進化
1 はじめに
「バージョン管理システム(VCS)」とは、一言で言えば「ファイルの変更履歴を保存し、過去の状態への復元やチームでの共同編集を可能にするタイムマシン」です。
プログラムのソースコードは日々更新されます。「昨日のコードに戻したい」「AさんとBさんの修正を合体させたい」といった要望は日常茶飯事です。これらを手動のバックアップ(file_v1.txt, file_final.txt, file_final_real.txt...)で管理するのは限界があります。
現在、Web開発や多くのソフトウェア開発ではGit(ギット)が主流ですが、歴史あるプロジェクトや特定の用途ではSVN(Subversion)も現役で稼働しています。この2つの違いを理解することは、エンジニアとしての基礎教養です。
2 ビギナー向け・ドキュメント
概要:RPGのセーブデータと共有ノート
バージョン管理を直感的に理解するために、以下の例で考えてみましょう。
- セーブポイント(コミット): ゲームでボス戦の前に「セーブ」をするように、コードの状態を記録します。失敗しても、セーブした時点からやり直せます。
- SVN(集中型)は「図書館の貸出台帳」: 本(ファイル)の原本は図書館(サーバー)に1つだけあります。借りて(チェックアウト)、書き込んで、返す(コミット)。誰かが借りている間、他の人は待つか、後で調整する必要があります。
- Git(分散型)は「全員がコピーを持つ魔法のノート」: 全員が自分の手元にノートの全ページ(全履歴)のコピーを持っています。自分のノートで好きに書き換えて(ローカル作業)、完成したらみんなのノートに同期(プッシュ/マージ)します。
公式情報・リソース
- Git公式サイト: 公式ドキュメント(Pro Git)は日本語訳もあり、非常に高品質です。
- Apache Subversion (SVN): SVNの公式サイト。
- GitHub Skills: GitとGitHubを実践的に学べる対話型チュートリアル。
導入:GitのHello World
現代の主流であるGitでの、最初の記録(コミット)までの手順です。
# 1. 自分の名前とメールアドレスを設定(最初に1回だけ)
git config --global user.name "Your Name"
git config --global user.email "you@example.com"
# 2. バージョン管理したいフォルダで初期化
mkdir my-project
cd my-project
git init
# -> "Initialized empty Git repository..." と表示される
# 3. ファイルを作成して、記録対象に追加(ステージング)
echo "Hello Git" > readme.txt
git add readme.txt
# 4. 変更を記録(コミット)
git commit -m "最初のコミット"
# -> [master (root-commit)] 最初のコミット... と表示され記録完了
3 会話集
現場や学習の場でよくあるQ&Aです。
Q1. なぜ今はSVNよりGitが人気なんですか?
Aさん: 昔はSVNを使ってたけど、最近はどこもGitですね。なんでですか? Bさん: 一番の理由は「オフラインでも作業できる」ことと「ブランチ(分岐)が軽い」ことだね。Gitならネットがない飛行機の中でも履歴を保存できるし、機能ごとに気軽にコピー(ブランチ)を作って実験できるのが開発スピードを上げているんだよ。
Q2. SVNを使うメリットはもうないんですか?
新人: じゃあ、SVNはもう覚える必要ないですか? ベテラン: いや、ゲーム開発や古い業務システムでは現役だよ。SVNは「巨大なバイナリファイル(画像や動画)」の管理が得意だったり、「特定のファイルをロック(排他制御)」して他人に触らせない機能が強力なんだ。デザイナーとの協業ではSVNの方がシンプルな場合もあるよ。
Q3. コンフリクト(競合)って何ですか?
学習者: Gitを使っていたら「Conflict」って出てエラーになりました…。 メンター: それは、同じファイルの同じ行を、あなたと他の誰かが同時に別の内容に書き換えたからだよ。Gitは「どっちを採用していいかわからない」から、人間に判断を求めているんだ。怖がらずにファイルを開いて、正しい内容に修正してあげれば大丈夫だよ。
4 より深く理解する為に
アーキテクチャの比較:集中型 vs 分散型
SVN(集中型 - Centralized VCS):
- 構造: 中央サーバーに単一のリポジトリ(貯蔵庫)が存在。
- メリット: 管理が中央集権的でシンプル。特定のディレクトリだけを取得(チェックアウト)可能。排他制御(ロック)が容易。
- デメリット: サーバーが落ちるとコミットも履歴参照もできない。ネットワーク必須。
Git(分散型 - Distributed VCS):
- 構造: クライアント(開発者のPC)を含め、全員が完全なリポジトリのコピーを持つ。
- メリット: ローカルで高速にコミット・ブランチ切り替えが可能。サーバーが消えても個人のPCから復元可能。
- デメリット: リポジトリのサイズが巨大になりがち(全履歴を持つため)。概念の理解(ステージング、リモート/ローカルの区別)に学習コストがかかる。
実務でのベストプラクティス(Git Flowなど)
Gitは自由度が高すぎるため、チーム開発では「ブランチ戦略」が重要です。 * Git Flow / GitHub Flow: 「機能追加はfeatureブランチで行い、テストが通ったらmainブランチにマージする」といったルールのこと。 * コミットメッセージ: 「修正」だけでなく「なぜ修正したか」を書くのがマナーです。
5 関連ワード
- GitHub / GitLab / Bitbucket:
- Gitのリポジトリをクラウド上でホスティングしてくれるサービス。Pull Requestなどのソーシャルコーディング機能を提供する。Gitそのものではない点に注意。
- Pull Request (Merge Request):
- 自分の変更を「取り込んでください」と依頼する機能。コードレビューの場として使われる。
- Branch (ブランチ):
- 開発のラインを分岐させること。本番用コードに影響を与えずに新機能を開発するために使う。
- Clone (クローン) vs Checkout (チェックアウト):
- Cloneはリポジトリ全体(履歴含む)をコピーすること(Git用語)。Checkoutは特定のバージョンを作業領域に取り出すこと(SVN/Git共通だが意味合いが少し違う)。
- TortoiseGit / TortoiseSVN:
- Windowsのエクスプローラーに統合されたGUIクライアントツール。黒い画面(CUI)が苦手な人に人気。
6 要点チェック
- 「Gitは分散型、SVNは集中型」:Gitはローカルで完結できるが、SVNはサーバー接続が基本。
- 「コミットは細かく」:作業の区切りごとにコミットすることで、問題発生時の原因特定が楽になる。
- 「ブランチを活用する」:Gitの強みはブランチ。新機能やバグ修正は必ずブランチを切って行う。
- 「コンフリクトは友達」:チーム開発の証。慌てずに差分を確認して解消する。
- 「バックアップとしての価値」:PCが壊れても、リモートリポジトリ(GitHubなど)にあれば安心。 """