SVN(Subversion)完全入門|Gitユーザーのための基礎知識とブランチ戦略

SVN (Subversion) 完全入門|Gitユーザーのための基礎知識とブランチ戦略 macOS
この記事は約12分で読めます。

「Gitは使えるけど、SVNは触ったことがない」

そんなエンジニアが増えています。GitHubやGitLabが主流となった今、SVNに触れる機会は確かに減りました。しかし、WordPress.orgのプラグイン配布、エンタープライズ環境のレガシーシステム、一部の大規模プロジェクトでは、今もSVNが現役で使われています。

この記事では、SVNの基本概念から実践的なブランチ戦略まで、Gitユーザーの視点で体系的に解説します。後編ではWordPress.orgへのプラグイン公開手順とTortoiseSVNの使い方を扱いますので、あわせてご覧ください。

SVNとは何か

SVN(Subversion)は、ソースコードやドキュメントの変更履歴を管理するバージョン管理システムです。2000年にCVS(Concurrent Versions System)の後継として開発され、長らく業界標準として使われてきました。

SVNを一言で表すなら「中央にあるリポジトリが正史」というモデルです。すべての開発者は中央サーバーにあるリポジトリに対して更新(update)と反映(commit)を行います。この「集中型」という特性が、GitとSVNの最大の違いであり、運用感が大きく異なるポイントです。

集中型と分散型:SVNとGitの根本的な違い

バージョン管理システムは大きく「集中型(Centralized)」と「分散型(Distributed)」に分かれます。

SVNは集中型です。1つの「中央リポジトリ」だけが正式な履歴を持ち、開発者はそこから「作業コピー(Working Copy)」を取得して作業します。コミットすれば即座に中央に反映され、他の開発者もその変更を参照できます。

Gitは分散型です。各開発者のローカルマシンに完全なリポジトリのクローンがあり、ローカルでコミットを重ねてから、必要なタイミングでリモートにpushします。

この違いは、日常の開発フローに大きな影響を与えます。

観点 SVN(集中型) Git(分散型)
コミットの意味 中央への「公開」 ローカルへの「記録」
オフライン作業 制限あり 自由に可能
履歴の書き換え 基本的に不可 rebase等で可能
ブランチ 重め(ディレクトリコピー) 軽量(ポインタ移動のみ)

Gitが便利とされる理由の多くは「ローカルで履歴を操作できる」点にあります。一方でSVNは中央が常に正なので、「どの状態が正式か」が常に明確であり、運用ルールがシンプルになりやすいというメリットがあります。

リビジョン番号という世界観

SVNでは、コミットするたびに r1, r2, r3... というリビジョン番号が自動的に振られます。この番号は特定のファイルではなく、リポジトリ全体の状態(スナップショット)に対して付与されます。

「r1234の時点に戻したい」と言えば、リポジトリ全体をその状態に復元できます。これはGitのコミットハッシュと似ていますが、連番で分かりやすいという利点があります。

SVNの基本用語

SVNを使う上で押さえておくべき用語を整理します。

Repository(リポジトリ) — 履歴を保存する本体。URLでアクセスします(例:https://svn.example.com/project)。

Working Copy(作業コピー) — 自分のPC上にチェックアウトした作業フォルダ。この中で編集作業を行います。

Revision(リビジョン) — コミットごとに増える番号。r102のように表記します。

Commit(コミット) — 変更を中央リポジトリに反映し、新しいリビジョンを作成する操作。

Update(更新) — 中央リポジトリの最新状態を作業コピーに取り込む操作。

Checkout(チェックアウト) — リポジトリから作業コピーを作成する操作(初回のみ)。

trunk / branches / tags:SVNのディレクトリ構成

SVNには「ブランチ」という概念がGitほど軽量ではありません。代わりに、ディレクトリをコピーして分岐を作るという発想で運用します。

慣習として、以下の3つのディレクトリ構成が広く使われています。

trunk — メインの開発ライン。Gitでいうmainmasterに相当します。

branches — 機能開発や実験用の分岐を格納するディレクトリ。

tags — リリースのスナップショット。「このバージョンを出荷した」という固定点を記録します。

この構成は強制ではなく慣習ですが、ほとんどのSVNプロジェクトで採用されており、WordPress.orgのプラグインリポジトリもこの形式です。

SVNの基本ワークフロー

SVNでの作業は、基本的に以下の流れで進みます。

  1. checkout — 作業コピーを作成(初回のみ)
  2. update — 作業開始前に最新化
  3. ファイルを編集
  4. status / diff — 変更内容を確認
  5. add / delete / move — 追加・削除・移動をSVNに通知
  6. commit — 中央リポジトリへ反映

この流れを守れば、ほとんどのトラブルを回避できます。特に「作業前のupdate」と「コミット前のstatus確認」は習慣づけてください。

基本コマンドリファレンス

ここでは、実務で頻繁に使うコマンドを使用頻度順に紹介します。

checkout:作業コピーを作る(初回)

update:最新化する

作業を始める前、コミットする前に必ず実行します。

status:変更状態を確認する

出力される記号の意味は以下の通りです。

記号 意味
M 変更あり(Modified)
A 追加予定(Added)
D 削除予定(Deleted)
? 未管理(add忘れ)
C 競合発生(Conflict)

diff:差分を確認する

コミット前の最終確認に使います。

add:新規ファイルを管理対象に追加

--forceオプションを付けると、ディレクトリ内のファイルも再帰的に追加されます。

delete:ファイルを削除

ファイルシステム上の削除だけでなく、SVNにも削除を通知する必要があります。

move / rename:履歴を保って移動

単にファイル名を変更するのではなく、svn moveを使うことで履歴が引き継がれます。

commit:中央へ反映

log:履歴を確認

revert:変更を取り消す

注意revertは取り消しが効きません。実行前に本当に破棄してよいか確認してください。

info:リポジトリ情報を表示

現在の作業コピーが指しているURL、リビジョン番号などを確認できます。

cleanup:作業コピーの修復

作業コピーがロックされたり、不整合が起きた場合に使います。

競合の解決

競合(Conflict)が発生した場合の対処手順です。

SVNのブランチ戦略

チーム開発では、ブランチ戦略を事前に決めておくことが重要です。ここでは、SVNで実践的に使える「feature / release / hotfix」パターンを紹介します。

最初に決めるべきルール

ブランチ戦略を導入する前に、チームで以下を合意しておきます。

  • trunkには何を置くか? — 常に最新の開発版か、常にリリース可能な安定版か
  • リリースはtagsに固定するか? — 基本的にはYES
  • hotfixはどこから切るか? — tagsから切る(再現性が高い)か、releaseブランチから切るか
  • trunk直コミットを許す範囲は? — 小さな修正はOKか、必ずfeatureブランチを切るか

正解は一つではありません。「チームが迷わない」ことが最優先です。

ディレクトリ構成テンプレート

以下の構成をおすすめします。

命名例:

  • feature:feature-123-login-rate-limit
  • release:release-1.3
  • hotfix:hotfix-1.2.1-null-fix
  • tag:1.2.0(セマンティックバージョニング推奨)

featureブランチ:機能開発用

新機能をtrunkから切り離して安全に開発するためのブランチです。

ブランチの作成

^/はリポジトリルートへのショートカットです。

作業コピーの切り替え

trunkへのマージ

開発が完了したら、trunkの作業コピーに移動し、featureブランチの差分を取り込みます。

ブランチの削除

マージ後、不要になったブランチは削除します。

releaseブランチ:リリース準備用

リリース直前の「凍結状態」を作り、バグ修正のみを安全に行うためのブランチです。

いつ切るか

リリースが1〜2週間後に見えてきたタイミングで、trunkから切り出します。

releaseブランチでやること

  • ✅ バグ修正
  • ✅ 文言修正
  • ✅ ドキュメント修正
  • ❌ 新機能の追加(原則禁止)

リリース確定:tagsへ固定

テストが完了したら、tagsにコピーしてリリースを確定します。

trunkへの反映

releaseブランチで行ったバグ修正は、trunkにも戻す必要があります。これを忘れると、次のリリースで同じバグが復活します。

hotfixブランチ:緊急修正用

本番環境で致命的な不具合が発覚した場合に、最短でパッチをリリースするためのブランチです。

tagsからの切り出しを推奨

再現性を確保するため、リリース済みのtagsから切り出すことをおすすめします。

修正とリリース

trunkへの反映を忘れずに

運用ルールのテンプレート

チームで共有できる運用ルールをまとめます。

  1. trunkは「次リリース候補」とし、常に動作する状態を維持する
  2. featureは必ず branches/feature-* に作成する(trunk直コミットは例外のみ許可)
  3. releaseブランチは凍結状態とし、バグ修正と文言修正のみ許可
  4. リリース時は必ず tags/<version> を作成して固定する
  5. hotfixは tags から切り出し、修正後に新しいtagsを作成する
  6. release/hotfixで入れた修正は、必ずtrunkにもマージする

コミットメッセージ例

コミット前チェックリスト

コミットする前に、以下を確認する習慣をつけてください。

  • svn upで最新化したか
  • svn st?(add忘れ)がないか
  • svn diffで想定外の変更がないか
  • 不要ファイル(ビルド生成物、キャッシュ)を含めていないか
  • コミットメッセージは「何をしたか」が明確か

よくあるトラブルと対処法

「作業コピーがロックされています」

「?がたくさん出る」

svn addのし忘れか、不要な生成物が混ざっています。必要なものだけaddし、不要なものはsvn:ignoreプロパティで除外設定をしてください。

競合(C)が発生

  1. svn stで競合ファイルを確認
  2. 手動で編集して解消
  3. svn resolvedで解決済みをマーク
  4. コミット

まとめ

SVNは「集中型」のバージョン管理システムであり、Gitとは異なる運用感があります。中央リポジトリが正史となるシンプルなモデルは、明確なルールを設けやすく、特定の環境では今も有効な選択肢です。

次回の後編では、WordPress.orgへのプラグイン公開手順と、Windows向けGUIクライアント「TortoiseSVN」の使い方を詳しく解説します。

続きを読む → [後編] WordPress.orgプラグイン公開のためのSVN実践ガイド

コメント

タイトルとURLをコピーしました