Subversionで以前のバージョンのコードに戻すにはどうすればよいですか?


486

私は友人とプロジェクトに取り組んでおり、以前のバージョンのコードに戻り、それを現在のコードに設定したいと考えています。どうすればいいのですか?

vs08では「anksvn」を使用しています。

PCに必要なバージョンがありますが、コミットが失敗します。表示されるメッセージは、「コミットが失敗した、ファイルまたはディレクトリが古い」というものです。

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

回答:


783

基本的には、「マージ後方」に必要-現在および以前のバージョンとの間の差分を適用するには、再びコミットし、その後、現在のバージョン(古いバージョンのように見える作業コピーで終わるようにする)と。たとえば、リビジョン150(現在)からリビジョン140に戻るには、次のようにします。

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

Subversion Red Bookには、これに関する良いセクションがあります


3
しかし、マージは私の変更と新しいリビジョンを上書きしません。
Chen Kinnrot、2009年

76
TortoiseSVNを使用している場合は、ファイルを右クリックして[マージ]を選択し、[リビジョンの範囲をマージ]を選択します。ログボックスに140-150と入力し、[Reverse Checkbox]をクリックします。その後、通常どおりコミットします。これはジョンの例と同じ操作を実行します。
DavGarcia、2011年

8
日食とサブクリップを使用して、プロジェクトを右クリックし、[チーム/履歴を表示]をクリックしてから、「元に戻す」リビジョンを選択し、もう一度右クリックして[選択したリビジョンから変更を元に戻す]を選択します。
fego

36
ヘッドリビジョンから戻すには、と書くこともできsvn merge -r HEAD:140ます。
sschmeck 2014

3
@DavGarciaのTortoiseSVNの指示は、少なくとも(TortoiseSVN 1.8.8を使用して)リビジョン内のすべてのファイルを元に戻さないため、私には適切ではありませんでした。フォルダを右クリックし、TortoisSVN->ログを表示を選択します。元に戻すリビジョンを選択し、右クリックして「このリビジョンからの変更を元に戻す」と言います。変更をコミットします。
mhenry1384 2014年

178

新しい変更をコミットできるのは、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"

2
svnはそれをモディフィケーションとして解釈しないので、コミットできません。
Sandburg、2018年

svn merge -r HEAD:12345。元に戻す正しいコマンドです。更新-rは行わないでください。あなたは狂った人です。
フクロウ

この回答は、リビジョン番号を見つけられなかった、または主な説明を高く評価した人々によって支持されたと思います。両方のアプローチを含めるように、答えを更新しました。
joeytwiddle

36

この行を使うだけ

svn update -r yourOldRevesion

次のコマンドを使用すると、現在のリビジョンを確認できます。

SVN情報


15
これは問題を解決しません。代わりに、これにより、質問者が質問した時点での状態が生成されます。
Ingo Schalk-Schupp

1
残念ながらこのアドバイスに従えない場合は、「svn resolve --accept working -R」を実行してください。
フクロウ

27

必要な場合は、マージを使用してチェックイン全体を元に戻す標準的な方法が適切に機能します。ただし、場合によっては、1つのファイルを元に戻すだけです。これを行う正当な方法はありませんが、ハッキングがあります。

  1. svn logを使用して、必要なバージョンを見つけます。
  2. svnのexportサブコマンドを使用します。

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

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


Tortoise-svnを使用すると、単一のファイルを右クリックしてマージできます。これを使用してこれを行う方法もあるはずsvnですか?
lc。

10
svn cat -r 123 path-in-your-working-copy > path-in-your-working-copy
dash17291 2013年


5

私はこれが最も適していると思います:

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

例えば:

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

それは以前のリビジョンに戻ってマージされたコードを含み、それをコミットすることができます。


3

これは私がして私のために働いたものです。

特定の時間に行った複数のコミットの変更を元に戻し、前のコミットポイントに移動したい。

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

これにより、リバースマージが実行され、作業コピーの変更が取り消されます。

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



2

以前の回答のほとんどはリバースマージを使用しており、それが通常正しい回答です。ただし、そうではない状況が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

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

次に、ローカルの更新コードバージョンをリポジトリにコミットします。これにより、コードベースが特定のリビジョンに戻ります。


1

このページには危険な答えがたくさんあります。SVNバージョン1.6以降、更新-rを実行するとツリーの競合が発生する可能性があることに注意してください。これにより、ツリーの競合に関する情報を探し回っているカフケレスクの悪夢を失う可能性のあるデータに急速にエスカレートします。

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

svn merge -r HEAD:12345 .

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


0

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

ここだも変更を元に戻すの説明。


0

ジョンスキートの答えは、一言で言えばほとんど解決策ですが、私のような人なら、説明が必要かもしれません。Subversionマニュアルではこれをaと呼んでいます

チェリーピックマージ

マニュアルページから。

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

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


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

    通常の使用では、作業コピーは、ローカルの変更や切り替えられたサブツリーがなく、単一のリビジョンで最新でなければなりません。

例:

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

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


-1

以下は私のために働いています。

ローカルでの変更が多く、ローカルコピーの変更を破棄して、SVNの最新の安定バージョンをチェックアウトする必要がありました。

  1. 無視されたファイルを含むすべてのファイルのステータスを確認します。

  2. 新しく追加および無視されたファイルを取得するために、すべての行をGrepします。

  3. それらを置き換える //ます。

  4. およびrm -rfすべての行。

    svn status --no-ignore | grep '^ [?I]' | sed "s / ^ [?I] //" | xargs -I {} rm -rf "{}"

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.