FullStackEngineer 2018年5月3日更新

バージョン管理(git,svn・・)

Index

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の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など)にあれば安心。 """

最新記事一覧

続きを見る

関連コンテンツ

カテゴリー一覧

TOP フルスタックエンジニアを目指すに方々へ 2022年2月20日 テストについて