6.

バージョン管理システム完全ガイド — Git/SVN の違い・GitHub/GitLab・運用フロー

編集
この記事の要点
  • バージョン管理システム (VCS) はファイルの変更履歴を時系列で記録し、過去への復帰・並行開発・コードレビューを可能にする仕組み
  • 分散型 (Git, Mercurial): 全員が完全な履歴を持つ。オフライン作業可能。現在の主流
  • 集中型 (SVN, CVS): 中央サーバ 1 つに履歴がある。シンプルだがオフライン作業不可
  • 主要ホスティング: GitHub (Microsoft)、GitLab、Bitbucket (Atlassian)、Gitea / Forgejo (セルフホスト OSS)、AWS CodeCommit
  • 運用フロー: Git Flow (機能/リリース/hotfix ブランチ)、GitHub Flow (main + 機能ブランチ)、Trunk Based (短命ブランチ + CI)

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

バージョン管理システム (Version Control System, VCS) は、ファイル群の変更履歴を時系列で記録し、いつでも過去の状態に戻せるようにするツールです。ソースコードの管理が主用途ですが、ドキュメント・設定ファイル・小さなバイナリにも適用できます。

VCS を使う主な目的:

  • 変更の履歴を残す — 誰がいつ何を変えたか追跡
  • 過去のバージョンに戻す — バグ混入箇所の特定 (git bisect)
  • 並行開発 — ブランチで複数人/複数機能を同時に進める
  • コードレビュー — Pull Request / Merge Request で変更を確認
  • バックアップ — リモートリポジトリが事実上のバックアップ

集中型 vs 分散型

観点集中型 (SVN, CVS)分散型 (Git, Mercurial)
リポジトリ中央サーバ 1 つ各開発者がフルコピーを保有
コミットサーバ接続必須ローカルでコミット可
オフライン作業不可可能
ブランチ重い (ディレクトリコピー)軽量・高速
マージ履歴管理が複雑三方向マージで堅牢
サーバ障害全停止各自のローカルから復元可
学習コスト中 (ブランチ・rebase 等)

主要 VCS の歴史

VCS登場年状態備考
SCCS1972歴史的最初期
RCS1982歴史的ファイル単位管理
CVS1990レガシー長年の標準だった
Subversion (SVN)2000現役 (縮小)CVS の改良型
Mercurial (hg)2005現役 (縮小)Python 製分散型
Git2005事実上の標準Linus Torvalds 作
Bazaar (bzr)2005ほぼ廃止Canonical 製
Perforce1995現役ゲーム業界・大規模バイナリ

Git の特徴

  • 分散型: 完全な履歴を全員が持つ
  • コミットグラフ: 各コミットは親コミットへの参照を持つ DAG (有向非巡回グラフ)
  • SHA-1 (現在 SHA-256 移行中) ハッシュでコミット識別: a3f5d2c...
  • ブランチが軽量: ポインタを増やすだけ、コストほぼゼロ
  • ステージング領域 (index): コミット前にどの変更を含めるか選択可能
  • 3 つの状態: Working Tree → Index (ステージ) → Repository (コミット済)
# Git の基本フロー
git init                              # リポジトリ初期化
git clone https://github.com/user/repo.git

git status                            # 現状確認
git add file.txt                      # ステージング
git commit -m "Add file"              # コミット
git log --oneline --graph             # 履歴表示

# ブランチ
git branch feature/login              # 作成
git checkout feature/login            # 切替 (Git 2.23+ は git switch 推奨)
git switch -c feature/login           # 作成+切替 (新形式)

# マージ
git checkout main
git merge feature/login

# リモート連携
git remote add origin https://github.com/user/repo.git
git push -u origin main
git pull origin main
git fetch origin

SVN の特徴と基本操作

# チェックアウト
svn checkout https://svn.example.com/repo/trunk myproject

# 状態確認
svn status
svn diff

# 追加・削除
svn add newfile.txt
svn delete oldfile.txt

# コミット (常にサーバへ)
svn commit -m "Add new file"

# 更新
svn update

# ブランチ (ディレクトリコピー)
svn copy ^/trunk ^/branches/feature-login -m "Create branch"
svn switch ^/branches/feature-login

# マージ
svn merge ^/branches/feature-login

主要ホスティングサービス

サービス運営特徴
GitHubMicrosoft世界最大。OSS の中心地。Actions (CI/CD)、Copilot
GitLabGitLab Inc.セルフホスト可。CI/CD・Wiki・Issue が統合
BitbucketAtlassianJira / Confluence と連携。中小規模に強い
Azure ReposMicrosoftAzure DevOps 内。エンタープライズ向け
AWS CodeCommitAWSAWS 内完結。IAM 認証
Gitea / ForgejoOSS軽量セルフホスト。GitHub 風 UI
SourceHutDrew DeVaultミニマル・メーリングリスト型

運用フロー (ブランチ戦略)

Git Flow

2010 年 Vincent Driessen 提唱の老舗フロー。複数ブランチで明確に役割分担します。

main          : 本番リリース版。タグ付き
develop       : 開発統合
feature/*     : 機能開発 (develop から分岐 → develop にマージ)
release/*     : リリース準備 (develop から分岐 → main + develop にマージ)
hotfix/*      : 緊急修正 (main から分岐 → main + develop にマージ)

長所: 明確な役割分担、リリース計画が立てやすい
短所: ブランチが多く CI/CD と相性が悪い、複雑

GitHub Flow

GitHub 社が推奨するシンプルフロー。常時リリース可能なプロダクトに向く。

main          : 常時デプロイ可能
feature/*     : 機能ブランチ (main から分岐)
                 → PR を出してレビュー
                 → CI 通過 + 承認後 main にマージ
                 → 即デプロイ

Trunk Based Development

Google / Facebook 採用。短命ブランチ (24 時間以内) + 強力な CI でメインラインを常時グリーンに保つ。Feature Flag を併用してリリース未完成機能を隠す。

CI/CD 連携

サービス連携先
GitHub ActionsGitHub 統合 (yaml で定義)
GitLab CI/CDGitLab 統合 (.gitlab-ci.yml)
JenkinsOSS の老舗。プラグインで何でも
CircleCIクラウド CI。GitHub 連携
Bitbucket PipelinesBitbucket 統合
AWS CodeBuild / CodePipelineAWS マネージド CI/CD

Git LFS (Large File Storage)

Git は大きなバイナリファイル (動画、デザインデータ、機械学習モデル) が苦手です。Git LFS 拡張を使うと、リポジトリには小さなポインタだけ置き、実体は別ストレージに保管できます。

# インストール後、対象拡張子を指定
git lfs install
git lfs track "*.psd"
git lfs track "*.mp4"
git add .gitattributes

# 通常通り add / commit
git add design.psd
git commit -m "Add design file"
git push

SVN から Git への移行

# git svn を使った移行 (履歴を保持)
git svn clone https://svn.example.com/repo --stdlayout \
    --authors-file=authors.txt \
    myproject-git

# authors.txt の例
# svn_user = Full Name <email@example.com>

cd myproject-git

# 新しい Git リモートへ push
git remote add origin https://github.com/user/myproject.git
git push -u origin main --tags

FAQ

Q: いまから新規プロジェクトを始める。SVN と Git どちらを選ぶ?
A: Git 一択です。OSS / 商用問わず事実上の標準で、CI/CD・コードレビュー・周辺ツールすべて Git 前提で発展しています。

Q: チーム全員が Git 初心者。何から教える?
A: cloneaddcommitpushpull基本サイクルと、branch → PR の流れだけで実用可能です。rebasecherry-pick は後回しで OK。

Q: GitHub と GitLab、社内で選ぶならどっち?
A: クラウド完結なら GitHub、セルフホスト要件 (機密度・社内ネットワーク制約) なら GitLab。社内 GitLab + GitHub Public で公開、というハイブリッドも一般的。

編集
Post Share
子ページ
  1. git
  2. Sourcetree
同階層のページ
  1. 開発環境
  2. 仮想環境
  3. プロジェクト管理(プログラム)
  4. プロジェクト管理(グループウェア)
  5. ネットワーク
  6. バージョン管理
  7. Webサーバー / アプリケーションサーバー
  8. エミュレーター
  9. システム管理
  10. ゲームエンジン
  11. 3Dグラフィックス
  12. 学習・教育用ソフトウェア
  13. Webサイト作成
  14. シミュレーター
  15. Microsoft Office
  16. エディタ
  17. BIM
  18. Bluetooth
  19. ブラウザ
  20. その他

最近更新/作成されたページ