ファイルの以前のSVNリビジョンに戻すより良い方法は?


167

誤ってSVNリポジトリにあまりにも多くのファイルをコミットし、意図していないものを変更しました。(ため息)彼らを以前の状態に戻すために、私が思いつくことができる最高のものは

svn rm l3toks.dtx
svn copy -r 854 svn+ssh://<repository URL>/l3toks.dtx ./l3toks.dtx

うわぁ!より良い方法はありませんか?なぜ私はこのようなものを書くことができないのですか?

svn revert -r 854 l3toks.dtx

さて、私はv1.4.4のみを使用していますが、1.5ブランチの変更リストをざっと読みましたが、これに直接関連するものは何も見つかりませんでした。私は何かを逃しましたか?


編集:私は十分に明確ではなかったと思います。私はその後、私は私がいることを、変更を失うことになるので、マージを逆にするとは思いませんでしたしたいの!それfileAと言って、fileB両方とも修正されましたが、私はコミットしたかっただけfileAです。誤って入力する

svn commit -m "small change"

両方のファイルをコミットし、今、私はロールバックしたいと思いますfileB。逆マージを行うと、このタスクは(私が知る限り)上で概説した手順よりも簡単ではありません。


回答:


243
svn merge -r 854:853 l3toks.dtx

または

svn merge -c -854 l3toks.dtx

2つのコマンドは同等です。


5
これをありがとう、単に何かを述べたかった-たとえば、リビジョン855にいて、ファイルをリビジョン854に戻したいと考えています。実行するsvn merge -c -854 my.fileと、を実行するとsvn diff、854より前の1つのリビジョン(つまり、853)が表示されます。 ); svm merge -c 854 myfile(なしで-)実行した場合にのみ、myfileがrev 854に戻されたように見えます。ありがとうございます。
sdaau 2010年

11
上記の最初のオプションが私にとって魅力的なように機能し、2番目のオプションがまったく機能しない理由はありますか?
skybondsor 2011年

7
ただし、リバースマージ後にコミットすることを忘れないでください。私はよく忘れます:)
Vineeth Pradhan

11
これらの2つのコマンドの違いを説明しないためには、実際にはこれをマイナス1にする必要があります。悪い答え
Angry Dan

4
@sprog-違いがあれば知っていただければ幸いです
orip

34

SVNブックの変更を元に戻す」セクションを確認してください。


5
外部リソースへのリンクを推奨しますが、リンクの前後にコンテキストを追加して、他のユーザーがそれが何であるか、なぜそこにあるのかを理解できるようにしてください。ターゲットサイトに到達できない、または永久にオフラインになる場合に備えて、常に重要なリンクの最も関連性の高い部分を引用してください。
user2084795 2015年

32

以前に与えられた答えの繰り返しだけでいくつかのスペースを使い果たして申し訳ありません-しかし、これは私がいつも悩んでいるものです。

ローカルファイルを最新のリビジョンである854に更新したとします。次に、古いリビジョンを取得したいと思います。以前のいくつかのリビジョンからのファイルのバージョン、たとえばリビジョン851です。

コピーはうまくいくでしょう:

svn copy -r 851 svn+ssh://<repository URL>/l3toks.dtx ./l3toks.dtx

..しかし、私はリポジトリURLのgreppingに煩わされることはありません:)

一見アップデートはうまくいくかもしれません:

svn up -r 851 ./l3toks.dtx

...しかし、ローカルコピーを「チェックアウトしたばかり」または「オンラインリビジョンと同じ」としてマークします(Tortoise / RabbitVCSでは緑色のOKチェックマークが表示されます)。つまりsvn ci -m "rolled back to r 851"、ローカルsubversion実行可能ファイルはローカルの変更に気付かず、何もオンラインリポジトリにアップロードすることに煩わされません。

そして、既に回答したように、リバースマージは機能しますが、この場合、ショートカット構文に依存するべきではありません。しかし具体的に述べる:

svn merge -r HEAD:851 l3toks.dtx
--- Reverse-merging r854 through r852 into 'l3toks.dtx':
U    l3toks.dtx

私は認めなければなりません。「r854からr852をファイルにリバースマージする」という文は、「ファイルのr851を取得し、以前ローカルで行っていたものをすべて上書きした」という意味では決して理解できません。新しい「ロールバック」リビジョンとしてオンラインで確認することもできますが、私はそう思います(そして願っています:))それはそれが何をするかです:)

この後svn diff、正しいリビジョンをローカルに戻したかどうかをすばやく確認するために使用できます。また、ファイルはTortoise / RabbitVCSで赤い感嘆符でマークされます(つまり、最新のコミットバージョンとは異なります)。そのためsvn ci -m "rolled back to r 851"、今回は実行できます。

また、最後にリバースマージの後で気が変わった場合(つまり、とにかく最新のHEADリビジョン(ここでは854)をローカルでロールバックした後で、まだロールバックをコミットしていない場合に注意してください。)、svn upそれはすでに「リビジョン854にある」と単に表示されるため、使用しないでください。代わりにsvn revert --recursive .または同様に使用してください...

乾杯!

参照:Subversionを使用して変更をロールバックする方法-Jacob Wright – Flex、AIR、PHPなど

編集:...そして明らかに、とまったく同じ効果はsvn merge -r HEAD:851 l3toks.dtx、次のようにして達成できます:

svn export -r 851 l3toks.dtx
A    l3toks.dtx
Export complete.

2
svn exportは常に希望どおりの動作をするため、常に使用する必要があります。特定のリビジョンのファイルをチェックアウトします。逆マージでは、ローカルの変更を指定したバージョンにマージしてマージしますが、これは複雑でクレイジーな操作です。注意しないとエラーが発生しやすくなります。
ファルコ

1
リバースマージに問題がありました。理由を理解するのではなく、エクスポートを試しましたが、完全に機能しました。エクスポートを使用することを強くお勧めします。を使用--forceしてディレクトリを上書きできます。変更が上書きされることを覚えておいてください。
Nick

実際に起こっていることについての非常に良い説明!私はAnkhSVNとTortoiseSVNを頻繁に使用していますが、利用できる場所がどこにもありません。svn export何か不足しているのですか、それともこれらのGUIに実装されていないだけですか?
コンラッド

@Conrad、それを使用するには、リポジトリコンテキスト(右クリック)メニューからAnkhSVNの[エクスポート...]およびTortoiseSVNの[エクスポート]をクリックします
nitinr708

10

私は最近、古いビルドをデバッグするために特定のリビジョンに戻す必要があり、これは魔法のように機能しました:

svn up -r 3340 (or what ever your desired revision number)

ローカルの変更は気にしなかったため、「tc」オプションを使用してすべての競合を解決する必要がありました(元に戻す前に気にしたすべてをチェックしました)

最新のリビジョンに戻るのも簡単でした:

svn up

5

あなたが探しているものは「リバースマージ」と呼ばれています。SVNブックのマージ機能に関するドキュメントを参照する必要があります(luapyad、より正確にはその投稿の最初のコメント投稿者が指摘したように)。Tortoiseを使用している場合は、ログビューに移動して右クリックし、間違えた箇所で「このリビジョンからの変更を元に戻す」を選択することもできます。


4

リバースマージはまさにあなたが望むものです(luapyadの答えを見てください)。ディレクトリ全体ではなく、誤ってコミットされたファイルにマージを適用するだけです。


4

最後のチェックインを取り消すだけの場合は、以下を使用できます

svn merge -r head:prev l3toks.dtx

そうすれば、現在のバージョン番号と以前のバージョン番号を探す必要がなくなります。


4

svn mergeはリビジョンをマージしますが、元に戻しません。つまり、HEADバージョンに追加がある場合、それを以前のリビジョンとマージすると、変更は持続します。

私はsvn catを使用して、それをファイルにリダイレクトします。

svn cat -r 851 l3toks.dtx > l3toks.dtx

次に、そのファイルに851コンテンツがあり、チェックインできます。


3

SVNプラグインでEclipse IDEを使用する場合、次のように実行できます。

  1. 元に戻すファイルを右クリックします(誤って削除して元に戻したい場合は、ファイルが含まれていたフォルダーを右クリックします)。
  2. チーム>スイッチ」を選択します
  3. [改訂]ラジオボタンを選択し、元に戻す改訂番号を入力します。OKをクリックします
  4. 同期パースペクティブに移動します
  5. 元に戻すすべてのファイルを選択します
  6. 選択を右クリックして、「オーバーライドしてコミット...」を実行します

これにより、ファイルが必要なリビジョンに戻ります。SVNは変更を新しいコミットと見なすことに注意してください。つまり、変更は新しいリビジョン番号を取得し、古いリビジョンと新しいリビジョンの間にリンクはありません。これらのファイルを特定のリビジョンに戻すことをコミットコメントで指定する必要があります。

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