私は大きなおっとを作りました、そしてそれを元に戻すのにいくらかの助けを使うことができました。
かなり安定したリポジトリと、変更に取り組んでいるリポジトリの2つのリポジトリがあります。安定したリポジトリに不具合を修正し、作業リポジトリに移動しました。安定版リポジトリからプルし、マージして、誤って安定版リポジトリにプッシュしました。
安定したリポジトリは次のようになります。
*merge
| \
| \
| *b
*a |
| /
*c
ここで、a
は安定したリポジトリの先端となるコミット、b
は開発リポジトリで行ったすべての処理、c
はポイントです開発リポジトリを分岐しました。
どうすれば元に戻すことができますか?
*a
|
*c
(私は本当に変更をなくすことができないことを知っています、私はただ機能的な構造を探しています...)
私はhg backout
は必要なコマンドですが、それが何をするのか正確にはわかりません。
hg rollback
は最後のトランザクションを元に戻すので、マージは未完成のままになります。マージを終了するには、hg update -C
を使用する必要があります。
* b(別のクローンにある)が必要ない場合は、組み込みのMQ拡張機能を有効にしてhg strip -r <*b>
を実行します。 * bと* mergeが削除されます。デフォルトでは、気が変わった場合に備えてバックアップを保存します。
更新(@Rudiのコメントによる:申し訳ありませんが、「すでにプッシュされた」部分を見逃しました)
マージはすでにプッシュされているため、NEVER EVERは以前に提案したことを行います。仲間の開発者からのメールを嫌うのが最良の結果だっただろう。
代わりにこれを行います:
hg up -r<*merge>
hg revert -r<*a> -a
hg ci -m "undo unintended merge"
または、よりコーシャになる可能性があります。
hg up -r<*merge>
hg backout -r<*merge> --parent<*a>
hg rollback
既に変更をプッシュしているため。
MQ拡張機能を試すこともできますが、これはローカルでも機能します。 hg strip
はローカルリポジトリのみを変更します。もちろん、サーバー上でサーバーリポジトリを直接変更しようとすることもできますが、誰かがそれをプルした場合は遅すぎます。
別のオプションは chapter 9 ofhgbookのセクションマージのバックアウトで説明されています。 hg backout
コマンドですが、あなたにとってはやり過ぎかもしれません...
hg update -C
リビジョンに*、ヒントとマージし、* mergeからのすべての変更を無視しますか?リポジトリは次のようになります。
*second merge
| \
| \
| \
| \
*merge |
| \ |
| \ |
| *b |
*a | /
| / /
*c---
このためのコマンドは
$ hg --config ui.merge=internal:local merge #keep my files
$ hg --config ui.merge=internal:other merge #keep their files
詳細は こちら をご覧ください。
hg rollback
は、最後の1つのコミットを取り消し、それ以外の場合に作成された履歴を削除します。
したがって、これから始める場合:
*merge
| \
| \
| *b
*a |
| /
*c
hg rollbackは以下を提供します:
*a *b
| /
*c
できることはhg rollback
1回だけ。
ロールバックを行う前に、リポジトリの完全なバックアップを作成する必要があります。これを行うには、単にhg clone
リポジトリ全体。
あなたは皆、この問題のほとんど複雑な解決策を提示します。
私がやったことは、リモートデスクトップで中央リポジトリにログオンし、mq
拡張子でリビジョンステータスを「ドラフト」に変更し、それらを「ストリッピング」したことです。
唯一の欠点は、誰かがレビジョンのコピーを取り除いてリビジョンを削除してプッシュすると、それらが再表示されることです。可能であれば、a)同じこと(ドラフト、ストリップ)を行うb)ローカルリポジトリを削除し、変更されたリポジトリと再同期する
すべては TortoiseHg で簡単に達成できます。