変更を取り消す(svn revert)

svn revertコマンドにより、ファイルやディレクトリに対する変更をすべて取り消すことができます。

場合によっては、ソースコードに変更を加えたあとで、誤りに気付き、変更を取り消したいと思うことがあります。
取り消したい変更が、まだコミットしておらず、ローカルの作業ディレクトリで変更しているだけであれば、svn revertコマンドを使ってその変更を取り消すことができます。

# svn revert index.html
Reverted 'index.html'

コミット済みの変更を取り消す

変更をリポジトリにコミットしてしまった場合でも、Subversionの機能を利用して変更を取り消すことができます。そのための方法はいくつか存在しますが、ここでは最も単純でエラーが最も発生しにくい手順を紹介します。

変更を元に戻すには、次のようにsvn mergeコマンドを使用します。

# svn merge -r 4:3 index.html
--- Reverse-merging r4 into 'index.html':
U    index.html

このコマンドでは、「index.html」のリビジョン4と3の間の変更を割り出して、その変更を作業コピーに適用するように指示しています。
着眼すべき点として、リビジョン範囲の指定で4と3と新しいリビジョンを先に指定していることです。このようにすることで、変更を逆向きに適用することができます。

ここで、svn diffを実行すると、次のように、変更の取り消しがSubversionによって正しく実行されたことが確認できます。

# svn diff
Index: index.html
===================================================================
--- index.html  (revision 4)
+++ index.html  (working copy)
@@ -7,6 +7,5 @@
 <p>初回のリポジトリ登録</p>
 <p>別のユーザーがコミット</p>
 <p>testuserがコミット</p>
-<p>取り消したい変更</p>
 </body>
 </html>

これで、作業ディレクトリ内の「index.html」はひとつ前のリビジョンの内容に戻りました。この時点からは、通常の作業の流れに戻ります。

ひとつ前のバージョンに戻しただけとは言え、変更を加えたことには変わらないので、テストで動作を確認してから、その変更をリポジトリにコミットするのが良いでしょう。

上記を単一のファイルに対する変更を元に戻すための方法です。では、多数のファイルに影響が及ぶ変更は、どのように扱えば良いのでしょうか。
以前の記事にも記載していますが、Subversionは各コミットで変更されたすべてのファイルを追跡管理しています。そのため、変更対象の数が多い場合も、それらが論理的なまとまりとしてグループ化されているため、変更は簡単に取り消せます。

その場合は、以下のようにカレントディレクトリをターゲットとして指定します。

# svn merge -r 4:3 .
--- Reverse-merging r4 into '.':
U    index.html

これで、カレントディレクトリ配下のファイルのすべての変更を取り消すことができます。
動作確認後、リポジトリにコミットすれば完了です。