SVN(Subversion)を使い始めるとき、最初に覚えるべきコマンドは多くありません。
結論から言えば、日常の作業は checkout(最初に1回)→ update(作業前)→ commit(作業後) のサイクルがすべてです。これに、状態を確認する status・log・diff と、やり直しの revert、競合時の resolve を加えれば、現場の作業の9割をカバーできます。
この記事では、SVNを10年以上ホスティングサービスとして提供してきた私たちが、新しくチームに入ったメンバーに最初に教える順番で、基本コマンドを解説します。GUIクライアント(TortoiseSVN)をお使いの方も、裏で動いているのはこれらのコマンドです。仕組みを知っておくと、操作の理解がぐっと深まります。
そもそもSVNの仕組みから知りたい方は、先に「Subversion(SVN)とは?仕組み・Gitとの違い・今も製造業で使われる理由と安全な運用方法」をどうぞ。
作業の全体像:SVNの基本サイクル
SVNは集中型のバージョン管理システムです。サーバー上のリポジトリが「正」であり、手元の作業コピーはそこから取り出した複製です。基本サイクルは、次の3つだけです。
- checkout:リポジトリから作業コピーを取り出す(最初に1回だけ)
- update:作業を始める前に、他の人の変更を作業コピーへ取り込む(毎日)
- commit:自分の変更をリポジトリへ反映する(作業の区切りごと)
「作業前に update、作業後に commit」。チームでこの習慣を徹底するだけで、競合(コンフリクト)の大半は防げます。
checkout:作業コピーを取り出す
リポジトリから手元に作業コピーを作ります。プロジェクトに参加して、最初に1回だけ実行します。
svn checkout https://svn.example.com/repos/project1/trunk project1
- 第1引数はリポジトリのURL。通常は trunk(開発の主軸)を指定します
- 第2引数は手元に作るディレクトリ名(省略すると、URL末尾の名前になります)
- 認証を求められたら、リポジトリのユーザー名・パスワードを入力します
svn co と省略形でも実行できます。
ポイント:SVNは必要な階層だけを取り出せます。巨大なリポジトリでも、自分が関わるディレクトリだけをcheckoutすれば、作業コピーを軽く保てます(これがGitとの大きな違いです)。
update:他の人の変更を取り込む
作業コピーを、リポジトリの最新状態に同期します。毎朝・作業を始める前に実行する習慣をつけてください。
svn update
実行すると、更新されたファイルが一覧で表示されます。各行の先頭に付く文字が、更新の種類を表します。
U:サーバーの変更で更新された(Updated)A:追加された(Added)D:削除された(Deleted)G:自分の変更とサーバーの変更がうまく統合された(merGed)C:競合した(Conflicted)
C(競合)が出たときの対処は、後述の「競合を解決する」を参照してください。
commit:変更をリポジトリへ反映する
自分の変更をリポジトリに記録します。必ずログメッセージを付けます。
svn commit -m "チケット#123: ログイン画面のバリデーション不具合を修正"
-mに続けて、何を・なぜ変更したかを書きます- 1回のcommitは「不可分の単位」です。関連する変更はまとめて、無関係な変更は分けてコミットします
ログメッセージの書き方が、そのままチームの資産になります。「修正」とだけ書かれたログが並ぶリポジトリと、チケット番号と理由が書かれたリポジトリでは、数年後の調査コストがまったく違います。監査で変更履歴を証跡として使う現場では、なおさらです。
add / delete / move:ファイルの追加・削除・移動
新しいファイルは、作るだけではバージョン管理の対象になりません。明示的に登録します。
svn add newfile.c # 新規ファイルを管理対象に追加
svn delete oldfile.c # ファイルを削除(履歴は残る)
svn move src.c dest.c # 名前変更・移動(履歴が引き継がれる)
いずれも、実行しただけではリポジトリに反映されません。最後に commit して、初めて記録されます。
注意:OSのファイル操作(エクスプローラーでの削除や名前変更)でファイルを動かすと、SVNは変更を追跡できません。必ず svn コマンド(またはTortoiseSVNのメニュー)経由で操作してください。
状態を確認する3つのコマンド
status:いま何を変更しているか
svn status
作業コピーの変更状況を一覧します。行頭の文字の意味は次のとおりです。
M:変更あり(Modified)A:追加予定(Added)D:削除予定(Deleted)?:管理対象外(まだ add していないファイル)!:行方不明(svn を介さずに削除・移動された)C:競合(Conflicted)
commitの前に必ず実行して、意図しないファイルが混ざっていないかを確認する癖をつけてください。
log:変更履歴を調べる
svn log -l 10 # 直近10件の履歴
svn log -r 1000:1010 # リビジョン1000〜1010の履歴
svn log ファイル名 # 特定ファイルの履歴
「いつ・誰が・なぜ変更したか」を遡れます。障害調査の出発点になるコマンドです。
diff:何を変更したか差分を見る
svn diff # 作業コピーの未コミット変更
svn diff -r 1000:1005 # リビジョン間の差分
commit前に diff で自分の変更を見直す習慣は、レビュー文化の第一歩です。
revert:変更をやり直す
commit前の変更を取り消して、元の状態に戻します。
svn revert ファイル名 # 特定ファイルの変更を取り消す
svn revert -R . # ディレクトリ以下すべて取り消す(要注意)
revertで取り消した変更は復元できません。実行前に svn diff で内容を確認してください。
なお、ここで取り消せるのは「まだcommitしていない変更」だけです。すでにcommitした変更を取り消したい場合は、逆マージという別の手順になります。svn merge -c -1005 . のように、取り消したいリビジョン番号を負数で指定してマージし、その結果をcommitします(例はリビジョン1005の変更を打ち消す場合)。
競合(コンフリクト)を解決する
updateしたとき、自分と他の人が同じ箇所を変更していると、競合(C)が発生します。慌てる必要はありません。
手順は3つです。
- 競合したファイルを開くと、
<<<<<<<〜>>>>>>>のマーカーで、自分の変更と相手の変更が並んでいます - 正しい内容になるよう手で編集します(マーカーの行は削除します)
- 次のコマンドで「解決済み」にして、commitします
svn resolve --accept working ファイル名
--accept working は、「手で編集した、いまの作業コピーの内容で確定する」という指定です。競合を減らす最善策は、コマンドではなく習慣にあります。作業前のupdate、小さく頻繁なcommit、同じファイルを長期間抱え込まないこと——この3つを徹底してください。
まとめ:最初に覚えるのはこれだけ
| 場面 | コマンド |
|---|---|
| 最初に1回 | svn checkout URL |
| 作業を始める前 | svn update |
| 状態の確認 | svn status / svn diff / svn log |
| ファイルの追加・削除 | svn add / svn delete / svn move |
| 変更の反映 | svn commit -m "メッセージ" |
| やり直し | svn revert |
| 競合の解決 | 手で編集 → svn resolve |
trunk・branches・tags を使った運用ルールは、次の記事「SVNのブランチ運用|trunk/branches/tagsの使い方」(公開予定)で解説します。
SVNを試せる環境がすぐ欲しい方へ
tracpathのフリープランなら、サーバー構築不要で今日からSVNリポジトリを使えます。チームでの練習環境にもどうぞ。
→ 無料でSVNリポジトリを作る
関連記事
この記事の著者
株式会社オープングルーヴ / tracpath編集部
2004年よりソフトウェア開発の現場を支援。SVN・Gitのクラウドホスティングサービス「tracpath」を提供し、製造業・業務システム開発企業のバージョン管理・移行を多数支援。ISMS(ISO 27001/27017)認証取得。






No Comments