1. ホーム
  2. mercurial

[解決済み] Mercurial undo 最後のコミット

2022-07-19 11:14:45

質問

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

可能であれば、TortoiseHgでそれを行う方法が望ましいです。

更新

私の具体的なケースでは、チェンジセットをコミットしました(プッシュはしていません)。その後、私はサーバーからプルして更新しました。これらの新しい更新で、私は、私の最後のコミットが古く、それを同期させたくないと判断しました。そのため、どうやら hg rollback は私が探しているものではありません。なぜなら、それは私のコミットではなくプルをロールバックするからです。

どのように解決するのですか?

一つの方法として hg rollback (2013年8月、Hg2.7より非推奨)

を使用してください。 hg commit --amend の代わりに rollback に変更し、前回のコミットでの間違いを修正しました。

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

いつ コミット または マージ を追加すると、Mercurial は チェンジセット のエントリを最後に追加します。

Mercurial はトランザクションの前に、タッチされた各ファイルの名前とその長さのトランザクションログを保持します。中止の際には、各ファイルはその前の長さに切り詰められます。このシンプルさは revlogs をアペンドのみにすることの利点の 1 つです。トランザクションジャーナルでは、アンドゥの操作も可能です。

参照 TortoiseHg回復の項 :

このスレッド との違いについても詳しく説明しています。 hg rollbackhg strip :

(文責 マーティン・ガイズラー SOでも貢献しています)

<ブロッククオート
  • ' hg rollback ' は最後のトランザクションを削除します。トランザクションは、データベースでよく見られる概念です。Mercurial では、コミット、プッシュ、プル...など、特定の操作が行われたときにトランザクションを開始します。

    操作が成功裏に終わると、トランザクションは完了とマークされます。エラーが発生した場合は、トランザクションは "rollback" され、リポジトリは以前と同じ状態になります。

    hg rollback' で手動でロールバックを起動することができます。これは最後のトランザクションコマンドを元に戻すことになります。pull コマンドが異なるブランチのリポジトリに10個の新しいチェンジセットを持ち込んだ場合、' hg rollback を実行すると、それらすべてが削除されます。 注意してください: バックアップはありません。 はありません!

  • ' hg strip ' はチェンジセットとそのすべての子孫を削除します。その チェンジセットはバンドルとして保存され、必要なときに再び適用できます。 として保存されます。

フォーエバーウィンター がコメントで示唆している(5年後の2016年)。

最初にファイルを hg forget することで「コミットを解除」することができます、例. hg forget filea; hg commit --amend しかし、これは直感的でないように思われます。

hg strip --keep は、おそらく現代の hg にとってはより良い解決策でしょう。