Webデザイナーなら知っておくべき サーバ知識相談室

第6回 先祖返りしたファイルを救える! SVNのバージョン管理で変更前のファイルを取り戻そう

この記事を読むのに必要な時間:およそ 4 分

SVNサーバと自分のパソコンを同期させよう

まずはSVNサーバのリポジトリから,最新のファイルたちを自分のパソコンにコピーしてきましょう。この作業をチェックアウト(CheckOut)と言います。要は自分のパソコンを,SVNサーバのリポジトリと同期させるのです。

チェックアウトすることで,最新のファイルをまるっと持ってくることができる

画像

チェックアウトするときには,バックアップとして保存されている古いファイルたちをコピーしてきては困りますので,最新のファイルをチェックアウトするようにしましょう。自分のパソコンに持ってきたリポジトリのコピーを,ワーキングコピー(WorkingCopy)と呼びます。

編集したファイルをリポジトリに戻そう

チェックアウトしてきたファイルは,パソコン上で普通に開いて編集できます。ファイルの編集が済んで,「この状態で一度保存しておきたいな」と思ったら,コミット(Commit)という作業を行います。コミットをする際には「○○機能を追加。対象ブラウザで動作確認済み」のようにメッセージをつけることができます。またファイルを新たに追加した場合は「SVNで管理する対象に加える」という意味で,コミットする前に追加(Add)をする必要があります。

「今の状態」をSVNサーバに保存するのがコミット

画像

コミットすることによって,リポジトリのリビジョン(Revision)が1つ上がります。リビジョンは,リポジトリのバージョン番号のようなものだと思ってください。リビジョンはコミットするたびに1つずつ上がっていきますので,SVNサーバで作ったばかりのリポジトリはリビジョン0ですし,そこへAさんがコミットすればリビジョン1に,さらにBさんがコミットすればリビジョン2になります。

コミットはバクの改修や,日々の更新といった小さい粒度で,ファイルを触る各自が行います。またこのコミットとは別に「Webサイトのリニューアルオープン」など,大きなリリースのタイミングで「今のファイル群をまるごと全部別の場所に保存して,いつでもそこに戻せるようにしておく」ための,タグ(Tag)というものも存在します。

他の人の更新内容を,自分のパソコンに反映させるには?

1人だけでSVNを使っていれば,最初に1度チェックアウトしたら,後は変更の度にコミットしていくだけで問題ありませんが,複数人でSVNを使っているときは,他の人がコミットして新しくなったリビジョンを,自分のパソコンに反映する必要があります。この作業を「アップデート(Update⁠⁠」といいます。

アップデートの流れ

画像

手元のファイルが最新版でない状態で,編集をしてコミットしようとするとコンフリクト(Conflict)というエラーが発生してしまいます。たとえコンフリクトしても,マージ(Merge)すれば問題ありませんが,余計なマージをしなくて済むように,作業を始める前には必ずアップデートするのを習慣にしておくことをお勧めします。

アップデートによって「どのファイルが新しくなったのか?」が気になったら,SVNクライアントでログ(Log)を確認しましょう。ログを見ると,リビジョンごとに誰が,いつ,どのファイルを更新したのかが一目瞭然です。

コミットメッセージには何を書くべき?

コミットするときに書くメッセージに,一体何を書けばいいの?と悩んだら,1か月後に「ファイルが先祖返りした! やばい! この機能を追加した直後のJSファイルに戻したい!」と大慌てしている自分を想像してみてください。

どのリビジョンに戻せばいいのか,急いでコミットメッセージを確認するあなた。そこに並んでいるコミットメッセージが「更新しました」⁠改修しました」ばかりだったらどうなるでしょう? きっと過去の自分のガクガク揺さぶりながら「何を!どう!変更したのか書けー!」と叫びたくなることでしょう。

コミットメッセージに「お問い合わせフォームに携帯電話番号チェック機能を追加。今まではどんな番号でも登録できていたが,080・090以外から始まる番号には,アラートを出して登録できないように変更した。対象ブラウザで動作確認済み」のように書いてあれば,このリビジョンに戻せばいいんだ!とすぐに分かります。

逆に誰が,いつ直したか,という情報は,SVNにコミットすると自動で記録されますので,メッセージに書く必要はありません。

あの日あのときのファイルに戻したい!というときは?

では「この機能を追加した直後のJSファイルに戻したい!」というときは,実際どうすればいいのでしょう? 最新のリビジョンのファイルを,リポジトリから自分のパソコンへ持ってくるときはアップデートという作業を行いましたが,特定のリビジョンのファイルを持ってくるときも,同様にこのアップデートを行います。

「あのときのファイルに戻したい!」というときは,リビジョンを指定してアップデート

画像

アップデートを行う際に,最新のリビジョンではなく,⁠3」「26」などのリビジョンの番号を指定すると,そのリビジョンのファイルが自分のパソコンへと同期されます。ファイルが壊れたり,先祖返りしてしまったりして,⁠あのときのファイルに戻したい!」というときは,リビジョンを指定してアップデートを行ってください。

SVNに「向く」ファイルと「向かない」ファイル

指定のリビジョン(例えば直前のリビジョン)と,手元のファイルで「何が違うのか?」は,差分(Diff)で確認できます。この差分は,HTMLやCSSなどのテキストファイルなら左右に並べて「直前のリビジョンの5行目から7行目が消されている」⁠直前のリビジョンの46行目に,新しいコードが3行追加されている」のように確認できます。

また画像ファイルも,指定のリビジョンと手元のファイルを左右に並べて確認できます。このようにテキストファイルや画像など,差分を出すことができるファイルはSVNに「向いた」ファイルと言えるでしょう。

画像の差分確認もできる

画像

しかしAIファイル,PSDファイルなどのいわゆる「バイナリファイル」は,上記のように差分を出して比較することができません。SVNでバージョン管理はできますが,差分が出せないことによって容量も多く使ってしまいます。バイナリファイルをSVNで管理するときは,使い方に注意が必要です。

エピローグ:バージョン管理システムがあれば「どれが最新のファイル?」をなくせる

Webデザイナー「あー,画像を更新するたびに,ファイル名変えて,追加してコミットしてたから怒られたのか!」

エンジニア「そうだよー。これで『SVNでバージョン管理』の意味が分かった?」

Webデザイナー「うん。頑張って使ってみる」

エンジニア「本当にファイル名を変更したいときは,SVNクライアントのメニューから変えられるから。あとはいくらSVNを使っていても,コミットしていなければ,そのときのバックアップがなくて元に戻せないから気をつけてね」

Webデザイナー「ファイルが先祖返りしちゃうときに備えて,定期的にコミットするようにするよ。あとさ,変更前の画像と並べてみられるの便利だね」

エンジニア「そうね。慣れるまではちょっととっつきにくいと思うけど,最新版はどこー?って探し回るより,こういうバージョン管理システムを使った方が安心だし」

Webデザイナー「あ,そういえばSVNと一緒にBTSも積極的に使ってくれって言われたんだけど,何それ?」

エンジニア「その話はまた次にしましょ」

こうしてWebデザイナーの悩みが,また一つ解決されたのでした。

次回のお悩みは?

Webデザイナー「SVNでコミットしたリビジョンと,Redmineのチケットを連動させてくれ,って言われた。なにそれ?」

次回のサーバ知識相談室は,BacklogやRedmineといった「BTS」についてご紹介します。バージョン管理システムとBTSを組み合わせて使うと,一体どんないいことがあるのでしょう? BTSについて学んで,仕事をスムースに終わらせられるWebデザイナーになりましょう。

著者プロフィール

堀越良子(ほりこしよしこ)

株式会社アイ・エム・ジェイのインフラエンジニア。ウェブインテグレーションの下支えとなるサーバホスティングサービスの構築と運用を担当している。

モバイルサイトのエンジニア,SIerとソーシャルゲームの広報を経て,2013年より現職。「分からない気持ち」に寄り添える技術者になれるように日々奮闘中。