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


125

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

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

更新

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


1
2つを作成しhg rollbackてからもう一度引くとどうなりますか?
VonC、2011年

1
最初のロールバックではプルが取り消され、2番目のロールバックでは「ロールバック情報がありません」と通知されます。
Martin Buberl、2011年

1
私は同じ状況に遭遇しましたが、私が知っている限り、他の操作を実行すると、戻ることも、履歴から削除することもできません。hgリポジトリのクローンを再作成する必要があります。

3
strip --keepstackoverflow.com/questions/29413851/…MQ qimportと同様に、タスクを直接解決します。または、rebaseローカルの変更保持し、競合がない場合は、単にシナリオの方が良い場合があります。(特に早送り以外の場合に、目的のグラフの最終目標である場合、マージを使用して両方のブランチからのいくつかの結合された変更を保持します。)ブランチを閉じるだけでも有効である可能性があります。目的の最終状態に応じて、マージとは異なります)。
user2864740

2
@ user2864740が言うようにhg strip --keep、コマンドは使用しますが、リビジョンを提供する必要がありますhg strip --keep -r .。例:。この答えはよく説明しますstackoverflow.com/a/19064016/1286571
ForeverWintr

回答:


77

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

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

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

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

TortoiseHgリカバリーのセクションを参照してください:

代替テキスト

このスレッドでは、hg rollbackhg strip:の違いについても詳しく説明しています
(SOにも貢献しているMartin Geislerが作成)

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

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

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

最初にhgを忘れるとファイルを「コミット解除」できます(例hg forget filea; hg commit --amend:)。
hg strip --keepおそらく現代のhgのためのより良いソリューションです。


それが正しいことを理解すると、ロールバックは最後のトランザクションを削除します。私の場合、コミットを行った後、サーバーからプルしました。では、コミットではなくプルをロールバックするということですか?
Martin Buberl、2011年

1
Buberl @Martin:によるとselenic.com/mercurial/hg.1.html#rollback、プルがトランザクションと見なされます。したがってhg rollback、プルした場合、実行するとコミットではなくプルが取り消されます。
Tim Henigan、2011年

2
どのようhg commit --amendに動作するのかはわかりませんが、私にとっては、コミットメッセージを変更するためのエディターがあり、含まれるファイルを変更する方法はありませんでした。保存せずにエディターを終了したところ、誤ったコミットが変更されたすべてのファイルを含めるように変更されていることがわかりました。
Tim Tisdall、2015

2
を使用して質問への回答をどのように達成するかは、私にはわかりませんhg commit --amend。あなたは最初にして、ファイルを「国連は、コミット」することができますhg forget例えばティンそれら、: hg forget filea; hg commit --amend、それは直感的と思われます。hg strip --keepはおそらく現代のhgのためのより良いソリューションです。
ForeverWintr 2016

1
@ JasonSbook.mercurial-scm.org / read / は良い読み物ですが、あなたのケースではhgリセットを検討することもできます:stackoverflow.com/a/31302998/6309
VonC

46

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

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

[extensions]
mq =

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

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


2
問題のリビジョンがまだドラフトフレーズに含まれている場合(または、プッシュ/プルされたすべてのリポジトリにアクセスしてストリップをすべてに適用している場合)(この説明の場合)、これは最高にクリーンなオプションです。
GazB

4
TortoiseHgがインストールされている場合は、mqをグローバルにアクティブ化するためのグラフィカルインターフェイスがあります。現在のバージョンでは、「ファイル->設定->グローバル設定タブ->拡張子-> mq」を有効にするか、「ファイルの編集」ボタンから設定ファイルにアクセスします。
David

19

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

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

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

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

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


5

hg rollback あなたが欲しいものです。

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

代替テキスト


1
私はコミットしてから、プルして更新/同期しました。これらの新しい変更により、最後のコミットが廃止され、取り消すことに決めました。私の場合、TortoiseHgの[元に戻す]ボタンは無効になっています。
Martin Buberl、2011年

ロールバックは非推奨になりました。
UpTheCreek 2014

Tortoise HGの現在のバージョンでは、[リポジトリ]メニュー項目から[ロールバック/元に戻す]オプションにアクセスできます。
daveywc 2015年

@UpTheCreekの引用が必要です。
DanMan

@DanMan-彼が提供したリンクを確認してください。
UpTheCreek

3

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


1

その回避策。

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


0

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.