Mercurialでローカルコミットを削除する方法はありますか?


209

それで、私はMercurialで愚かな間違いをし続けます。多くの場合、「hg pull」や「hg update」を行わずに作業を開始します。変更をプッシュしようとすると、エラーが発生します。

ローカルコミットを削除して、複数のヘッドやブランチなどを作成しないようにする方法はありますか?ローカルコミットを削除し、変更をチップにマージしてから、再コミットしたいだけです。簡単に聞こえますか?ローカルコミットを簡単に削除する方法が見つからないため、ヒントと完全にマージできます。

繰り返しますが、「hg ci」で作成されたローカルコミットのみを削除しようとしています。ファイルの変更、復帰などはしたくない。



12
これはばかげた間違いではなく、複数の人が同じリポジトリで同時に作業しているときの通常のワークフローです。
Juozas Kontvainis、2011

回答:


247

strip」拡張を有効にして、次のように入力します。

hg strip #changeset# --keep

#changeset#削除するチェンジセットのハッシュはどこにありますか。これにより、その変更セットの子孫を含む変更セットが削除され、作業ディレクトリは変更されません。コミットしたコードの変更も元に戻したい場合は、--keepオプションを削除してください。

詳細については、ストリップ拡張を確認してください。

「不明なコマンド 'ストリップ'」が表示された場合は、それを有効にする必要がある場合があります。これを行うには、.hgrcまたはMercurial.iniファイルを見つけて、以下を追加します。

[extensions]
strip =

(Juozasのコメントで述べたように)複数の頭を持つことはMercurialの通常のワークフローであることに注意してください。あなたはそれと戦うためにstripコマンドを使うべきではありません。代わりに、頭を入力ヘッドとマージし、競合を解決してテストしてからプッシュする必要があります。

このstripコマンドは、ブランチを汚染する変更セットを本当に削除したい場合に役立ちます。実際、この質問の状況にあり、すべての「ドラフト」変更セット完全に削除したい場合は、基本的に次のことを提案しているトップアンサーを確認しください。

hg strip 'roots(outgoing())'

8
@Bharath:拡張機能を有効にする必要があります
Samaursa

1
mercurial 2.8以降、stripはスタンドアロンの拡張機能strip = なので、問題ありません。Mercurial 2.8のWhatsNew
Chih-Hsuan円

104

Hg Tortoiseを使用している場合は、次の場所で拡張機能「strip」をアクティブ化します。

  1. ファイル/設定/拡張/
  2. ストリップを選択

次に、ストライピングを開始する場所の一番下のリビジョンright clickを選択し、次のように選択します。

  1. 変更履歴
  2. ストリップ

ちょうどこのような:

ここに画像の説明を入力してください

この例では、19番目のリビジョンから最後のcommited(22)までを消去します。


2
File/Settings/Extensions/投票を増やしたいと思います。どうもありがとうございました!
dyatchenko 2015

ああ!私はこれを試しましたが、「バックアップなし」または「ローカル変更を破棄」をチェックしないにもかかわらず、すべての変更をダンプするように見えました。私はそれらの変更を保持したいのですが、コミットしないでください!今それらを回復する方法はありますか?
Tim Tisdall、2015

2
私はそれを正しく行う方法を見つけることができないようですが、渡す必要があるコンテンツを保持しているようで--keep、TortoiseHgはそのオプションを提供していません。したがって...コマンドラインでを使用する必要がありますhg strip -r . --keep
Tim Tisdall、2015

3
ストリップヘルプから: 'ストリップされた変更セットはすべて、バンドルとして「.hg / strip-backup」に保存されます(「hg help bundle」および「hg help unbundle」を参照)。「hg unbundle .hg / strip-backup / BUNDLE」を実行することで復元できます。BUNDLEはストリップによって作成されたバンドルファイルです。
Tim Tisdall、2015

SourceTreeでは、それも役に立ちました。ありがとう!
Ponomarenko Oleh

22

最新の回答(Mercurial 2.1以降のみ関連):

フェーズを使用するをし、共有したくないリビジョンを秘密(プライベート)としてマークします。そうすれば、プッシュしたときに送信されません。

TortoiseHGでは、コミットを右クリックしてフェーズを変更できます。

また、プルした後、拡張「rebase」を使用してローカルコミットを共有リポジトリのヘッドに移動することもできます。


プライベート==シークレット
Dmitry Osinovskiy 2014年

15

他の誰もが指摘しているように、おそらくヘッドをプルしてからマージする必要がありますが、EditingHistoryツールなしで本当にコミットを取り除きたい場合は、hg clone -r、リポジトリそれらの変更以外のすべてを取得ます。

これによって元のリポジトリからそれらが削除されることはありませんが、それらを持たない新しいクローンが作成されます。次に、変更したリポジトリを削除できます(必要な場合)。


「hg clone -r」はローカルの変更を削除しますか?単純にするために、ローカルコミットを削除したいだけです。
user191535 2010

4
クローンされたリポジトリからそれらを削除することはありませんが、それらを持たない新しいクローンを作成します。その後、必要に応じて、変更したリポジトリを削除できます。
Ry4an Brase 2010

9

私もこの問題に出くわしました。私は2を作成しcommit、両方のコミットをロールバックして削除したいと考えました。

$ hg rollback

ただしhg rollback、2つのコミットではなく、最後のコミットにロールバックするだけです。当時、私はこれに気づかず、コードを変更しました。

hg rollback1つのコミットをロールバックしただけだとわかったとき、私はを使用できることがわかりましたhg strip #changeset#。そのため、私hg log -l 10は最新の10個のコミットを見つけて、希望する適切なチェンジセットを取得していましたstrip

$ hg log -l 10
changeset:   2499:81a7a8f7a5cd
branch:      component_engine
tag:         tip
user:        myname<myname@email.com>
date:        Fri Aug 14 12:22:02 2015 +0800
summary:     get runs from sandbox

changeset:   2498:9e3e1de76127
branch:      component_engine
user:        other_user_name<name@email.com>
date:        Mon Aug 03 09:50:18 2015 +0800
summary:     Set current destination to a copy incoming exchange

......

$ hg strip 2499
abort: local changes found

どういうabort: local changes found意味ですか?つまり、hgまだコミットされていないコードの変更が見つかりました。したがって、これを解決するには、hg diff変更したコードを保存する必要がhg revertありhg strip #changeset#ます。ちょうどこのような:

$ hg diff > /PATH/TO/SAVE/YOUR/DIFF/FILE/my.diff
$ hg revert file_you_have_changed
$ hg strip #changeset#

上記を行った後patch、diffファイルを作成し、コードをプロジェクトに追加し直すことができます。

$ patch -p1 < /PATH/TO/SAVE/YOUR/DIFF/FILE/my.diff

9

Rebase拡張機能を使用するhg pull --rebaseと、これをさらに簡単に回避できます。使用すると、コミットがプルされたリビジョンに自動的に再コミットされるため、分岐の問題を回避できます。


1
履歴が不正確になり、何かを間違った場合に破損する可能性があります。
Ry4an Brase、2011年

5

あなたはgitのに慣れている場合は、使用させていただきますHISTEDITのように動作しますgit rebase -i


4

hg stripあなたが探しているものです。git resetgitに慣れているのと同じです。

コンソールを使用:

  1. リビジョン番号を知っている必要があります。hg log -l 10。このコマンドは、最後の10件のコミットを表示します。探しているコミットを見つけます。チェンジセット行の4桁の番号が必要ですchangeset: 5888:ba6205914681

  2. その後hg strip -r 5888 --keep。これにより、コミットのレコードが削除されますが、すべてのファイルが変更されたままになるため、ファイルを再コミットできます。(ファイルを削除したい場合は、単に--keephg strip -r 5888


1

[Hg Tortoise 4.6.1]最近のアクションの場合、「ロールバック/元に戻す」アクション(Ctrl + U)を使用できます。

HG亀画像


画像が含まれていることを再確認してください。
ビルケラー

0

サマウサの優れた答えに加えて、evolve拡張機能をprune安全で回復可能なバージョンとして使用することで、strip何か問題が発生した場合に戻ることができます。

私はこれらのエイリアスを持っています.hgrc

 # Prunes all draft changesets on the current repository
 reset-tree = prune -r "outgoing() and not obsolete()"
 # *STRIPS* all draft changesets on current repository. This deletes history.
 force-reset-tree = strip 'roots(outgoing())'

注意pruneもあり--keep、ちょうどのようなstripファイルを付託することができ、完全な作業ディレクトリを維持するために、。

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