web-dev-qa-db-ja.com

最後のコミットを元に戻すMercurial

Mercurialで最後に誤ってコミットされた(プッシュされていない)変更を元に戻すにはどうすればよいですか?

可能であれば、TortoiseHgでこれを行う方法をお勧めします。

更新

具体的なケースでは、変更セットをコミットしました(プッシュされません)。次に、サーバーからプルして更新しました。これらの新しい更新により、最後のコミットは廃止され、同期したくないと判断しました。したがって、hg rollbackは、コミットの代わりにプルをロールバックするため、正確に私が探しているものではないようです。

122
Martin Buberl

一つの方法は hg rollback (2013年8月のHg2.7で非推奨)

最後のコミットの間違いを修正するには、rollbackの代わりに hg commit --amend を使用してください。

リポジトリ内の最後のトランザクションをロールバックします。

コミット または マージ の場合、Mercurialは changeset エントリを最後に追加します。
Mercurialは、トランザクションの前に、タッチされた各ファイルの名前とその長さのトランザクションログを保持します。中止すると、各ファイルが以前の長さに切り捨てられます。この単純さは、 revlogs append-onlyにすることの利点の1つです。トランザクションジャーナルでは、元に戻す操作もできます。

TortoiseHg Recoveryセクション を参照してください:

alt text

このスレッド は、hg rollbackhg stripの違いも詳しく説明しています。
Martin Geisler SOにも寄稿)

  • 'hg rollback'は最後のトランザクションを削除します。トランザクションは、データベースでよく見られる概念です。 Mercurialでは、コミット、プッシュ、プルなどの特定の操作が実行されるとトランザクションを開始します...
    操作が正常に終了すると、トランザクションは完了としてマークされます。エラーが発生した場合、トランザクションは「ロールバック」され、リポジトリは以前と同じ状態のままになります。
    「hg rollback」を使用して、手動でロールバックをトリガーできます。これにより、最後のトランザクションコマンドが取り消されます。 pullコマンドが異なるブランチのリポジトリに10個の新しいチェンジセットをもたらした場合、「hg rollback」はそれらすべてを削除します。注意:トランザクションをロールバックするとき、バックアップはありません

  • 'hg strip'は、変更セットとそのすべての子孫を削除します。変更セットはバンドルとして保存され、必要に応じて再度適用できます。

ForeverWintr はコメントで提案します(2016年、5年後)

最初にhgを忘れてファイルを「コミット解除」することができます(例:hg forget filea; hg commit --amend)が、それは直感的ではないようです。
hg strip --keep は、おそらく現代のhgのより良い解決策です。

74
VonC

hg strip は、リポジトリからリビジョン(およびその子孫)を完全に削除します。

Stripを使用するには、次の行を.hgrc(またはMercurial.ini)に追加して MqExtension をインストールする必要があります。

[extensions]
mq =

TortoiseHgでは、ワークベンチでstripコマンドを使用できます。リビジョンを右クリックし、「履歴の変更」->「ストリップ」を選択します。

stripはリポジトリの履歴を変更するため、まだ誰とも共有していないリビジョンでのみ使用する必要があります。 Mercurial 2.1+を使用している場合、 phases を使用してこの情報を追跡できます。コミットがまだドラフトフェーズにある場合、他のリポジトリと共有されていないため、安全に削除できます。 (これを指摘してくれたZasurusに感謝します)。

44
Peter Graham

ロールバックできないため、プルしたときに取得した新しいヘッドにそのコミットをマージする必要があります。あなたがそれでやった仕事をしたくない場合は、 this tip を使用して簡単にそれを行うことができます。

したがって、プルして頭に更新した場合これを行うことができます:

hg --config ui.merge=internal:local merge

現在チェックアウトされているリビジョンのすべての変更を保持し、チェックアウトされていないリビジョン(不要になったと書いたもの)の変更は一切保持しません。

これは、履歴を正確かつ完全に保持するための優れた方法です。 2年後、誰かがあなたがプルダウンしたものにバグを見つけた場合、同じものの(未使用だが保存された)実装を見て、「ああ、私はそれを正しかった」と言うことができます。 :)

19
Ry4an Brase

hg rollback はあなたが望むものです。

TortoiseHgでは、hg rollbackはコミットダイアログで実行されます。コミットダイアログを開き、「元に戻す」を選択します。

alt text

5
Tim Henigan

TortoiseHg Workbench 4.4.1の現在のバージョン(2018年7月)では、Repository-Rollback/undo...を使用できます。
enter image description here

2
TmTron

ワークスペースをプルして更新したら、削除する変更セットを右クリックし、変更履歴->ストリップをクリックして、変更セットを削除し、デフォルトのヒントをポイントします。

0
cabhishek

その回避策。

サーバーにプッシュしない場合は、新しいフォルダーにクローンを作成します。それ以外の場合は、リポジトリフォルダーからウォッシュアウト(すべてのファイルを削除)して、新しいクローンを作成します。

0
ITsDEv