web-dev-qa-db-ja.com

SVNコミットを元に戻すにはどうすればいいですか?

SVNのコミットを元に戻す方法のさまざまな例を見つけました。

svn merge -r [current_version]:[previous_version] [repository_url]

または

svn merge -c -[R] .

しかしどちらもうまくいかないようです。私はそれらのコマンドを試して、手動で変更されたファイルをチェックしました。

リビジョン番号1944のコミットを元に戻すにはどうすればいいですか?どのように変更が元に戻されたことを確認するにはどうすればよいですか(変更が元に戻されたために実際のファイルを調べることなく)。

283
Alex

どちらの例も機能するはずですが、

svn merge -r UPREV:LOWREV . undo range

svn merge -c -REV .単一のリビジョンを元に戻します

このシンタックスでは - 現在のディレクトリがWCであるなら((毎マージ後に行わなければならないように)結果をコミットするでしょう

ログを見たいですか?

418
Lazy Badger

TortoiseSVN クライアントを使用している場合は、Show Logダイアログで を簡単に実行できます

123
dodgy_coder

svn merge -r 1944:1943 .は作業コピーのr1944の変更を元に戻すべきです。これで作業コピーの変更を(diffで)確認できますが、復帰をリポジトリに適用するにはコミットする必要があります。

56
onon15

まず、作業コピーを1943年に戻します。

> svn merge -c -1943 .

次に、コミットしようとしていることを確認します。

> svn status

第三に、バージョン1945をコミットします。

> svn commit -m "Fix bad commit."

第四に、新しいログを見てください。

> svn log -l 4

------------------------------------------------------------------------
1945 | myname | 2015-04-20 19:20:51 -0700 (Mon, 20 Apr 2015) | 1 line

Fix bad commit.
------------------------------------------------------------------------
1944 | myname | 2015-04-20 19:09:58 -0700 (Mon, 20 Apr 2015) | 1 line

This is the bad commit that I made.
------------------------------------------------------------------------
1943 | myname | 2015-04-20 18:36:45 -0700 (Mon, 20 Apr 2015) | 1 line

This was a good commit.
------------------------------------------------------------------------
40
Shaun Luttin

リビジョンを「確定」することはできませんが、作業コピーをバージョン1943に戻し、それをバージョン1945として確定することができます。バージョン1943と1945は同一になり、事実上変更が元に戻ります。

24
Jakub Zaverka

それが言うように、以下は空走をするでしょう。 HEADは現在のバージョンで、PREVが前で、次にファイルへのパス、または確定済みアイテムです。

svn merge --dry-run -rHEAD:PREV https://example.com/svn/myproject/trunk

予行演習がよさそうなら、--dry-runなしでコマンドを実行します。

改訂の変更を確認して、再コミットしてください。バージョン番号を参照するには

svn log
8
BentheFolker
F=code.c
REV=123
svn diff -c $REV $F | patch -R -p0 \
    && svn commit -m "undid rev $REV" $F
3
jmullee
svn merge -c -M PATH

これは私の命を救った。

元のコードが表示されていなかったので戻っても同じ問題がありました。上記のコマンドを実行した後、私はきれいな古いバージョンコードを入手しました。

2
amit ghosh

アレックス、これを試してみてください。svn merge [WorkingFolderPath] -r 1944:1943

2
Nikita

すでに提示された提案は一部の人には有効かもしれませんが、私の場合には無効です。マージを実行するとき、rev 1443に更新したrev 1445のユーザーは、マージからの1444と等しい場合でも、1443で変更されたすべてのファイルを同期します。私はエンドユーザーに更新がまったく表示されないようにする必要がありました。

コミットを完全に隠したい場合は、正しいリビジョンで新しいブランチを作成してからブランチを交換することで可能です。唯一のことはあなたがすべてのロックを削除して再追加する必要があるということです。

copy -r 1443 file:///<your_branch> file:///<your_branch_at_correct_rev>
svn move file:///<your_branch> file:///<backup_branch>
svn move file:///<your_branch_at_correct_rev> file:///<your_branch>

これは私のために働きました、おそらくそれはそこに他の誰かに役立つでしょう=)

1
droxxodia

私は上記を試してみました、(svn merge)そしてあなたは正しいです、それはジャックをします。しかしながら

svn update -r <revision> <target> [-R]

動作するように見えますが、永続的ではありません(私のSVNは単に古いリビジョンを表示しています)。だから私はしなければならなかった

mv <target> <target backup>
svn update <target>
mv <target backup> <target>
svn commit -m "Reverted commit on <target>" <target>

私の特定のケースでは、私のターゲットはinterfaces/AngelInterface.phpです。私はファイルに変更を加え、それらをコミットし、ビルドコンピュータを更新してphpdocコンパイラを実行しましたが、私の変更は時間の無駄であることがわかりました。 svn log interfaces/AngelInterface.phpは私の変更をr22060と示しており、そのファイルに対する前回のコミットはr22059でした。だから私はsvn update -r 22059 interfaces/AngelInterface.phpをすることができます、そしてそれは再び-r22059にあったように私はコードで終わります。その後: -

mv interfaces/AngelInterface.php interfaces/AngelInterface.php~
svn update interfaces/AngelInterface.php
mv interfaces/AngelInterface.php~ interfaces/AngelInterface.php
svn commit -m "reverted -r22060" interfaces/AngelInterface.php

別の方法として、上記のすべてにおいて. -Rの代わりにinterfaces/AngelInterface.phpを指定することによって、ディレクトリに対して同じことを実行できます。

1
sibaz

履歴からコミットを完全に削除したい場合は、特定のリビジョンでリポジトリのダンプを取ってから、そのダンプをインポートすることもできます。具体的には:

svnrdump dump -r 1:<rev> <url> > filename.dump

Svnrdumpコマンドはsvnadmin dumpと同じ機能を実行しますが、リモートレポジトリで機能します。

次に、ダンプファイルを選択したレポジトリにインポートするだけです。これはBeanstalkでうまく動作することがテストされています。

0
redcalfee