第2部:基礎知識 / 第4章:バージョン管理

GitとSVNの比較

GitとSVN(Subversion)は、どちらもバージョン管理システムですが、設計思想が大きく異なります。両方の現場で戸惑わないよう、違いを理解しておきましょう。

📖 読了目安 約9分 対象:両方の現場に関わる可能性がある方

根本的な違い:分散型 vs 集中型

Gitは分散型

flowchart TB
    subgraph リモート
        R[(GitHub等)]
    end
    subgraph 開発者AのPC
        LA[(ローカルリポジトリA)]
        WA[作業ディレクトリA]
    end
    subgraph 開発者BのPC
        LB[(ローカルリポジトリB)]
        WB[作業ディレクトリB]
    end
    R <--> LA
    R <--> LB
    LA <--> WA
    LB <--> WB
  • 各開発者のPCに完全なリポジトリ(履歴を含む)がある
  • オフラインでもコミット、履歴確認が可能
  • サーバーがなくても動作する

SVNは集中型

flowchart TB
    subgraph サーバー
        R[(リポジトリ)]
    end
    subgraph 開発者AのPC
        WA[作業コピーA]
    end
    subgraph 開発者BのPC
        WB[作業コピーB]
    end
    R <--> WA
    R <--> WB
  • リポジトリはサーバーに1つだけ
  • 開発者のPCには「作業コピー」のみ(履歴なし)
  • サーバーに接続しないとコミットできない

操作の違い

コミットの意味

操作GitSVN
ローカルに保存git commit-
サーバーに送信git pushsvn commit

Gitのコミット

  • ローカルリポジトリに保存される
  • サーバーには反映されない(pushが必要)
  • やり直しが比較的簡単

SVNのコミット

  • 直接サーバーに送信される
  • 全員に即座に公開される
  • やり直しが難しい

履歴の確認

操作GitSVN
履歴確認git log(ローカルで完結)svn log(サーバーに問い合わせ)
オフライン時確認可能確認不可

ブランチの扱い

観点GitSVN
ブランチの実体ポインタ(軽量)ディレクトリのコピー(重い)
作成コスト非常に軽い比較的重い
ブランチ切り替え一瞬時間がかかることも
文化頻繁にブランチを作るtrunk直接が多い

ワークフローの違い

Gitの一般的なフロー

flowchart LR
    A[pull] --> B[branch]
    B --> C[commit]
    C --> D[push]
    D --> E[PR作成]
    E --> F[レビュー]
    F --> G[merge]
  1. git pull で最新を取得
  2. git checkout -b feature/xxx でブランチ作成
  3. 作業して git commit(ローカル)
  4. git push でサーバーに送信
  5. プルリクエストでレビュー依頼
  6. レビュー後にマージ

SVNの一般的なフロー

flowchart LR
    A[update] --> B[作業]
    B --> C[update]
    C --> D[commit]
  1. svn update で最新を取得
  2. 作業する
  3. svn update で再度最新を取得(衝突確認)
  4. svn commit で直接サーバーにコミット

同じ操作の対応表

やりたいことGitSVN
リポジトリを取得git clonesvn checkout
最新を取得git pullsvn update
変更を保存git commit(ローカル)-
サーバーに送信git pushsvn commit
状態確認git statussvn status
差分確認git diffsvn diff
履歴確認git logsvn log
変更を取り消すgit checkout -- filesvn revert file
ブランチ作成git checkout -b xxxsvn copy trunk branches/xxx
ブランチ切り替えgit checkout xxxsvn switch URL

現場によって違うこと

Git主流の現場

  • Web系、スタートアップに多い
  • GitHub / GitLab / Bitbucket を使用
  • プルリクエスト文化が根付いている
  • 頻繁にブランチを作る
  • CI/CDと連携していることが多い

SVN主流の現場

  • 大企業、SIer、レガシーシステムに多い
  • 社内サーバーにリポジトリ
  • trunk直接作業が多いことも
  • レビューはコミット前に対面で行うことも
  • 長年の運用で安定している

両方使う場合のメンタルモデル

GitからSVNに移行する場合

注意点

  • commit = 即座に公開される(慎重に)
  • ブランチは気軽に作らない(現場の慣習に従う)
  • オフラインでは作業が制限される
  • update を頻繁に行う

SVNからGitに移行する場合

注意点

  • commit はローカルのみ(push が必要)
  • ブランチは気軽に作ってOK
  • プルリクエストの文化に慣れる
  • ローカルで自由に試行錯誤できる

どちらが良いか?

Gitが向いている場面

  • 複数人での並行開発
  • オープンソース開発
  • 頻繁な機能開発とリリース
  • リモートワーク

SVNが向いている場面

  • シンプルな運用
  • 線形的な開発(1つずつ順番に)
  • バイナリファイルが多い(ロック機能)
  • 既存システムの保守

結論

「どちらが良い」ではなく、現場で使われているものに適応することが重要です。

  • Git の現場では Git の流儀で
  • SVN の現場では SVN の流儀で

両方の基本を知っておけば、どちらの現場でも戸惑いません。

まとめ

観点GitSVN
方式分散型集中型
コミット先ローカル → push でリモート直接サーバー
ブランチ軽量、頻繁に作る重い、控えめに
オフライン作業可能制限あり
やり直し比較的簡単難しい

関連ドキュメント