web-dev-qa-db-ja.com

Subversionでコードを古いバージョンに戻すにはどうすればいいですか?

私は友人と一緒にプロジェクトに取り組んでいて、私たちのコードの古いバージョンに戻ってそれを現在のものに設定したいと思います。どうすればいいのですか?

私はvs08で "anksvn"を使っています。

私は自分のPCに必要なバージョンを持っていますが、コミットは失敗しています。 「コミットに失敗しました。ファイルまたはディレクトリが古くなっています」というメッセージが表示されます。

私のPCにはSubversionクライアントもあります。

461
Chen Kinnrot

基本的には "後方へのマージ" - 現在のバージョンと以前のバージョンの差分を適用する to 現在のバージョン(つまり古いバージョンのような作業コピーになってしまいます)をしてから再度コミットする必要があります。たとえば、リビジョン150(現在)からリビジョン140に戻るとします。

svn update
svn merge -r 150:140 .
svn commit -m "Rolled back to r140"

Subversion Red Bookには についての良いセクションがあります

741
Jon Skeet

Subversionの歴史の 先頭 でのみ新しい変更をコミットできます。

あなたがあなたのPCに持っている良いコピーで直接何もすることができない理由は、その.svnフォルダがそれが過去からのコードであることを知っているので、どんなコミットの前にも更新を必要とします。

正しいリビジョン番号を見つけて元に戻す

  1. 必要な古いコピーのリビジョン番号を見つけます。現在のリビジョンを入手してください。

    svn info --show-item revision
    # or
    svn log
    

    または使用する:

    svn update -r <earlier_revision_number>
    

    正しいリビジョン番号が見つかるまで、プロジェクトのさまざまな古いバージョンをチェックします。

  2. 正しいリビジョン番号を書き留めます(以下の例では123と仮定します)。

  3. 最新のリビジョンに更新します。

    svn update
    
  4. 必要なリビジョンと最新バージョンの間のすべての変更を元に戻します。

    svn merge -r HEAD:123 .
    svn commit "Reverted to revision 123"
    

    (上記のJon Skeetの答えと同じです。)

リビジョン番号が見つからない場合

もしあなたが古いコピーを見つけることができず、あなたが現在あなたのPCにあるファイルをコミットしたいだけなら:

  1. あなたの良いバージョンのコピーを作成してください(ただし.svnフォルダーは含みません)。

    cd ..
    rsync -ai --exclude=.svn  project/  project-good/
    
  2. 今、あなたが最新版を持っていることを確認してください:

    cd project
    svn update
    # or make a fresh checkout
    svn checkout <url>
    
  3. 作業コピーの上にあなたの良いバージョンをコピーしてください。

    このコマンドは、作業コピーから正常にコピーされていないファイルをコピーして削除しますが、既存の.svnフォルダには影響しません。

    cd ..
    rsync -ai --exclude=.svn --delete  project-good/  project/
    

    Rsyncを持っていない場合は、cp -aを使用できますが、不要なファイルを手動で削除する必要もあります。

  4. あなたは今持っていることをコミットできるはずです。

    cd project
    svn commit "Reverted to good copy"
    
168
joeytwiddle

この行を使う

svn update -r yourOldRevesion

あなたは現在のリビジョンを知ることができます。

sVN情報

34
M.Othman

チェックイン全体を元に戻すためにmergeを使用する標準的な方法は、うまくいきます。しかし、時には、あなたがしたいのは単一のファイルを元に戻すことだけです。それを行うための正当な方法はありませんが、ハックがあります。

  1. Svn logを使って欲しいバージョンを見つけてください。
  2. Svnのexportサブコマンドを使います。

    svn export http:// url-to-your-file @ 123 / tmp/filename

(123は、ファイルの正しいバージョンのリビジョン番号です。)次に、その単一ファイルを移動またはコピーして、古いファイルを上書きします。変更したファイルをチェックインすれば完了です。

27
Bill

もう少しオールドスクール

svn diff -r 150:140 > ../r140.patch
patch -p0 < ../r140.patch

それからいつもの

svn diff
svn commit
8

これが最も適していると思います。

たとえば、コミットされたコードにrev 5612から5616までのリビジョンが含まれている場合は、後方にマージします。それは私の最後に動作します。

例えば:

svn merge -r 5616:5612 https://<your_svn_repository>/

それは以前のリビジョンにマージされたコードを含んでいるでしょう、そしてあなたはそれをコミットすることができます。

5
hpal

これは私がやったことと私のために働いたことです。

特定の時間に行った複数のコミットの変更を元に戻して、前のコミットポイントに進みたい.

  1. チームに移動 - >履歴を表示。
  2. 無視したいリビジョンまたはその範囲を右クリックします。
  3. [変更を元に戻す]オプションを選択します。

これはリバースマージを実行し、作業コピーの変更を元に戻します。

コードを確認してコミットするだけです。

3
Ziya

元に戻す一番上の階層を右クリック>> >> RevertまたはRevert to Revision

2
Yuval Adam

プロジェクトを右クリックし、[置換]> [リビジョンまたはURL]>元に戻す特定のリビジョンを選択します。

それでは、ローカルのアップデートコードバージョンをリポジトリにコミットしてください。これにより、コードベースが特定のリビジョンに戻ります。

1
KayV

以前の回答のほとんどはリバースマージを使用していましたが、通常これが正しい回答です。しかし、そうではない状況が1つあります(それは私にも起こりました)。

ちょっとした変更を加えると、私は誤ってUnixの行末を持つファイルをDOSの行末に変更してコミットしました。これは簡単に元に戻すことができます。行末を変更して再度コミットするか、逆マージすることで、ファイルの各行のソースとしてsvn blameリストを編集できるようにする効果があります。 (興味深いことに、Windows上のTortoiseSVNはこれによる影響を受けません。コマンドラインsvn blameのみ)。

あなたがsvn blameによって報告されたように歴史を維持したいならば、私はあなたが以下をする必要があると思います:

  • ファイルを削除してコミットしてください。
  • リポジトリで、ファイルの以前の有効なコピーをヘッドにコピーしてコミットします。
  • 保持したい編集内容を復元します。

削除は少し怖いですが、ファイルをリポジトリに保存しているので、復元しても大したことはありません。これがステップを説明するためのコードです。 xxxが最後の正常なコピーのリビジョン番号であると仮定します。

svn rm svn+ssh://path/to/file
svn copy svn+ssh://path/to/file@xxx svn+ssh://path/to -m"Restore good copy"
svn update
<restore the edits>
svn commit -m"Restore edits"

リポジトリ内のコピーの場合、保存先はファイル名ではなくディレクトリである必要があることに注意してください。

1
user2554330

このページには危険な答えがたくさんあります。 SVNバージョン1.6以降、update -rを実行するとツリーの競合が発生する可能性があることに注意してください。これは、ツリーの競合に関する情報を探しているところでデータを失う可能性のあるkafkeresqueの悪夢に急速に拡大します。

バージョンに戻す正しい方法は次のとおりです。

svn merge -r HEAD:12345 .

12345はバージョン番号です。ドットを忘れないでください。

0
Owl

Jon Skeetの答えは、ほとんど一言で言えば解決策ですが、あなたが私のような人であれば、説明が必要かもしれません。 Subversionのマニュアルではこれをaと呼んでいます。

チェリーピックマージ

Manページから.

  1. この形式は 'チェリーピック'マージと呼ばれます。 '-r N:M'はリビジョンNとMの間のソースブランチの履歴の違いを表します。

    変更を元に戻すには、「逆の範囲」を使用できます。たとえば、sourceとtargetが同じブランチを参照している場合、以前にコミットしたリビジョンは '元に戻す'ことができます。 逆の範囲 で、Nが '-r N:M'のMより大きい、または '-c'オプションが負の数で使用されている。 '-c -M'は '-r Mと同じです。 : '。このような変更を元に戻すことは、「リバースマージ」の実行とも呼ばれます。


  • ソースがファイルの場合、差分がそのファイルに適用されます(以前の変更を逆マージするのに役立ちます)。それ以外の場合、ソースがディレクトリの場合、ターゲットはデフォルトの '。'になります。

    通常の使用法では、作業コピーは単一のリビジョンで、最新の状態になっているはずです。ローカルの変更やサブツリーの切り替えはありません。

例:

svn merge -r 2983:289 path/to/file

これはローカルコピー[2983](上記の引用によれば、サーバと同期しているはずです - あなたの責任です)をサーバからのリビジョン289に置き換えます。変更はローカルで行われます。つまり、清潔なチェックアウトがある場合は、変更をコミットする前に変更を確認できます。

0
Jonathan Komar

古いバージョンに同期してコミットします。これでうまくいくはずです。

これは また元に戻す変更の説明です。

0
Mork0075