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


303

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

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

または

svn merge -c -[R] .

しかし、どちらも機能していないようです。それらのコマンドを試し、手動で変更されたファイルを確認しました。

リビジョン番号1944のコミットを元に戻すにはどうすればよいですか?元に戻されたことを確認するにはどうすればよいですか?


16
それらのどれもうまくいかなかったので、あなたは答えを決して受け入れませんでしたか?
2rs2ts 14

4
文字通りの回答が必要な場合は、「svn merge -c -1944」を使用してください。それが機能したかどうかを確認するには:「svn diff」
John Sampson



ケースが1943(良好なコミット)、1944(不良コミット)、1945(良好なコミット)、1946(良好なコミット)の場合はどうなるでしょう。1944(不良コミット)のみを削除し、1944以降のすべてのリビジョンを保持したいのですが、これらのすべてのリビジョンから1943,1945,1946(1944のみを削除)のような結果が必要です。どうすればよいですか?
Bhavin_m

回答:


448

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

svn merge -r UPREV:LOWREV . 範囲を元に戻す

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

この構文では-現在のディレクトリがWCであり(マージごとに行う必要があるように)結果をコミットします

ログを見たいですか?


9
@dwjohnston-はい、マージは常にWC実行され、サーバー側のタスクではありません
Lazy Badger

14
svn: Merge source required。サイコロはありません。
2rs2ts 2014

27
@ 2rs2tsは、「現在のディレクトリでこれを実行する」を指定するための末尾のドットを忘れたようです。
Dalin 14

14
あなたはまた、同時に複数の単一コミットを行うことができますsvn merge -c -42587,-42589 .
mlathe

1
@ahnbizcad-取り消したいリビジョン(単一)
レイジーバジャー

130

TortoiseSVNクライアントを使用している場合は、[ログの表示]ダイアログから簡単に実行できます。


5
これは、はるかに簡単な方法です
Markku K.

5
これは時代遅れです。現在のバージョンでは、クライアントで使用できるコンテキストメニューはありません。
user1789573 2015

19
何?TortoiseSVNは、コンテキストメニューに加えて、それが生成するダイアログです。「コンテキストメニューがなくなった」とはどういう意味ですか?確かにあります!
Ben

@ベンuser1789573は、回答にリンクされたチュートリアルで「コンテキストメニュー」の明示的な言及に少しつまづいていたと思います。
Tom Catullo

2
これが後で見られる場合は、そこに(まだ)あります。ログの表示画面でリビジョンを右クリックすると、「このリビジョンに戻す」オプションがあります。これはTortoiseSVN 1.9.4ビルド27285に含まれています。これを使用したところ、問題なく動作することがわかりました。
Bruce Van Horn

65

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


4
機能しません。ソースのマージが必要です。svn merge -r 1944:1943 .代わりに試しましたが、何も変わっていません。
アレックス

リポジトリはr1944以降進化しましたか?その場合、r1943とr1944の間の変更と同じ行に競合する変更がありますか?
onon15 2012

私は1945年の改訂版にいて、矛盾はないようです。どちらsvn statussvn diff何も与えません。
Alex

7
エラー:svn: Try 'svn help' for more info svn: Merge source required
Alex

5
しかし、svn merge -r 1945:1943 .うまくいったようです。私は理解していると思います:「不良」コミットの「前」のバージョンを作業リポジトリにマージする必要があります。これは、前のコミットを単純に「元に戻す」場合に問題ありません。しかし、バージョン1900で行われた変更を元に戻したい場合はどうでしょうか。
Alex

45

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

> svn merge -c -1943 .

次に、何がコミットされるかを確認します。

> svn status

3番目に、バージョン1945をコミットします。

> svn commit -m "Fix bad commit."

4番目に、新しいログを確認します。

> 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.
------------------------------------------------------------------------

1
ケースが1943(良好なコミット)、1944(不良コミット)、1945(良好なコミット)、1946(良好なコミット)の場合はどうなるでしょう。1944(不良コミット)のみを削除し、1944以降のすべてのリビジョンを保持したいのですが、これらのすべてのリビジョンから1943,1945,1946(1944のみを削除)のような結果が必要です。どうすればよいですか?
Bhavin_m

26

リビジョンを「コミット解除」することは不可能ですが、作業コピーをバージョン1943に戻し、バージョン1945としてコミットすることができます。バージョン1943と1945は同一であり、変更を事実上元に戻します。


18
面倒なことに正確に言えば、リポジトリへの管理者アクセス権があれば「コミット解除」できると私はコメントします。使用して、指定されたリビジョンにクローンリポジトリを作成することで、このsvn dump当時とsvn load。ただし、もちろん、これは通常の状況では使用しないでください。
onon15

4
コミットを解除したくありません。特定のコミットを逆にした新しいコミット番号を作成したいと思います。セットは、私がバージョン1944をチェックアウトし、1945年にコミットしたが、それを「元に戻したい」と言っています。次に、ファイルがバージョン1944のものと同一であるバージョン1946が欲しいです(もちろん、履歴を除きます)。しかし、疑問が残ります:それを行う方法は?コマンドは何ですか?
Alex

//、@ Alex、私もこれに興味があります。特にに類似したものに興味があり$ git revertます。Gitを長期間使用した後は、SVNを学ぶのが少し難しいことに気づきました。
Nathan Basanese 2017

10

次のように、予行演習を行います。HEADは現在のバージョンで、PREVは以前のバージョンであり、次にファイルまたはコミット済みアイテムへのパス:

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

ドライランに問題がなければ、-dry-runなしでコマンドを実行します。

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

svn log

4
F=code.c
REV=123
svn diff -c $REV $F | patch -R -p0 \
    && svn commit -m "undid rev $REV" $F

これには、ローカルコピーが不良リビジョンと異なる必要がありますか?
Eliezer Miron

2

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


2

既に与えられた提案は一部の人にはうまくいくかもしれませんが、私の場合にはうまくいきません。マージを実行するときに、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>

これは私にとってうまくいきました、おそらくそれはそこにいる他の誰かに役立つでしょう=)


2
svn merge -c -M PATH

これは私の命を救った。

同じ問題がありましたが、元に戻した後も古いコードが表示されませんでした。上記のコマンドを実行した後、私はクリーンな古いバージョンのコードを取得しました。


1

私は上記を試しました、(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
もう1つ、すでに述べたように、gitで直接refをハッキングすることと同じように、履歴からコミットを削除することはできません。できることは、リポジトリを使用してソースを意図したとおりに変更し、それを変更としてコミットすることです。
sibaz 2014

さらに調査したところ、svnadminを使用して履歴からコミットを削除することが可能であることがわかりますが、これはお勧めしません。stackoverflow.com/questions/5566327/…を
sibaz

0

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

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

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

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

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