129

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

可能であれば、TortoiseHgを使用してこれを行う方法が推奨されます。

アップデート

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

4

9 に答える 9

82

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

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

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

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

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

代替テキスト

このスレッドhg rollbackでは、との違いについても詳しく説明していますhg strip: ( SOにも貢献しているMartin Geisler
によって書かれました)

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

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

ForeverWintrはコメントで示唆しています(2016年、5年後)

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

于 2011-01-21T15:50:11.537 に答える
48

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

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

[extensions]
mq =

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

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

于 2011-06-07T04:42:37.743 に答える
19

ロールバックできないので、プルしたときに取得した新しいヘッドにそのコミットをマージする必要があります。その中で行った作業が不要な場合は、このヒントを使用して簡単に行うことができます。

したがって、あなたが彼らの頭を引っ張って更新した場合、あなたはこれを行うことができます:

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

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

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

于 2011-01-21T16:50:20.813 に答える
6

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

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

代替テキスト

于 2011-01-21T16:00:57.343 に答える
4

TortoiseHg Workbench 4.4.1(07.2018)の現在のバージョンでは、次を使用できますRepository- Rollback/undo...
ここに画像の説明を入力してください

于 2018-07-25T12:56:00.327 に答える
1

その回避策。

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

于 2016-09-24T07:28:11.553 に答える
0

ワークスペースをプルして更新した後、削除する変更セットを右クリックし、[履歴の変更]-> [ストリップ]をクリックすると、変更セットが削除され、デフォルトのヒントが表示されます。

于 2011-08-08T16:06:28.687 に答える
0

私はこれを今行うためのより現代的でより簡単な方法はであると信じていますhg uncommit。これにより、空のコミットが残ることに注意してください。これは、後でコミットメッセージを再利用する場合に役立ちます。そうしない場合はhg uncommit --no-keep、空のコミットを残さないように使用します。

hg uncommit [OPTION] ...[FILE]..。

ローカルチェンジセットの一部または全部をコミット解除します

This command undoes the effect of a local commit, returning the affected
files to their uncommitted state. This means that files modified or
deleted in the changeset will be left unchanged, and so will remain
modified in the working directory.

If no files are specified, the commit will be left empty, unless --no-keep

申し訳ありませんが、TortoiseHgに相当するものがわかりません。

于 2020-10-12T17:17:17.757 に答える
0

私は最近この問題に遭遇しましたが、私の状況は少し異なりました-私はすでに元に戻したいコミットをプッシュしていました。で問題を解決しましhg backout <revision-code>た。と同じように機能するようgit revertです。この答えから:

backout:指定されたコミットの逆である新しいコミットを作成します。正味の効果は元になりますが、変更は履歴に残ります。

TortiseHgでは、これを行うには、元に戻すコミットを右クリックして、を選択しBackout...ます。TortiseHgドキュメントはこちら

Hgバックアウトのサンプル画像

以前のコミットを完全に削除するのではなく、新しい元にコミットを作成することには議論があると思います。この記事から:git revert

プロジェクト履歴からコミットを削除する代わりに、コミットによって導入された変更を反転する方法を理解し、結果の反転コンテンツで新しいコミットを追加します。これにより、Gitが履歴を失うのを防ぎます。これは、改訂履歴の整合性と信頼性の高いコラボレーションにとって重要です。

于 2021-04-12T21:45:04.567 に答える