SVNのコミットを元に戻す方法のさまざまな例を見つけました。
svn merge -r [current_version]:[previous_version] [repository_url]
または
svn merge -c -[R] .
しかしどちらもうまくいかないようです。私はそれらのコマンドを試して、手動で変更されたファイルをチェックしました。
リビジョン番号1944のコミットを元に戻すにはどうすればいいですか?どのように変更が元に戻されたことを確認するにはどうすればよいですか(変更が元に戻されたために実際のファイルを調べることなく)。
どちらの例も機能するはずですが、
svn merge -r UPREV:LOWREV .
undo range
svn merge -c -REV .
単一のリビジョンを元に戻します
このシンタックスでは - 現在のディレクトリがWCであるなら((毎マージ後に行わなければならないように)結果をコミットするでしょう
ログを見たいですか?
TortoiseSVN クライアントを使用している場合は、Show Logダイアログで を簡単に実行できます 。
svn merge -r 1944:1943 .
は作業コピーのr1944の変更を元に戻すべきです。これで作業コピーの変更を(diffで)確認できますが、復帰をリポジトリに適用するにはコミットする必要があります。
まず、作業コピーを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.
------------------------------------------------------------------------
リビジョンを「確定」することはできませんが、作業コピーをバージョン1943に戻し、それをバージョン1945として確定することができます。バージョン1943と1945は同一になり、事実上変更が元に戻ります。
それが言うように、以下は空走をするでしょう。 HEADは現在のバージョンで、PREVが前で、次にファイルへのパス、または確定済みアイテムです。
svn merge --dry-run -rHEAD:PREV https://example.com/svn/myproject/trunk
予行演習がよさそうなら、--dry-runなしでコマンドを実行します。
改訂の変更を確認して、再コミットしてください。バージョン番号を参照するには
svn log
F=code.c
REV=123
svn diff -c $REV $F | patch -R -p0 \
&& svn commit -m "undid rev $REV" $F
svn merge -c -M PATH
これは私の命を救った。
元のコードが表示されていなかったので戻っても同じ問題がありました。上記のコマンドを実行した後、私はきれいな古いバージョンコードを入手しました。
アレックス、これを試してみてください。svn merge [WorkingFolderPath] -r 1944:1943
すでに提示された提案は一部の人には有効かもしれませんが、私の場合には無効です。マージを実行するとき、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>
これは私のために働きました、おそらくそれはそこに他の誰かに役立つでしょう=)
私は上記を試してみました、(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
を指定することによって、ディレクトリに対して同じことを実行できます。
履歴からコミットを完全に削除したい場合は、特定のリビジョンでリポジトリのダンプを取ってから、そのダンプをインポートすることもできます。具体的には:
svnrdump dump -r 1:<rev> <url> > filename.dump
Svnrdumpコマンドはsvnadmin dumpと同じ機能を実行しますが、リモートレポジトリで機能します。
次に、ダンプファイルを選択したレポジトリにインポートするだけです。これはBeanstalkでうまく動作することがテストされています。