web-dev-qa-db-ja.com

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

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

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

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

199
user191535

strip」拡張機能を有効にして、次を入力します。

hg strip #changeset# --keep

#changeset#は、削除するチェンジセットのハッシュです。これにより、上記の変更セットが削除され、そこから派生する変更セットが削除され、作業ディレクトリがそのまま残されます。コミットしたコードの変更も元に戻したい場合は、--keepオプションを削除します。

詳細については、 Strip Extension を確認してください。

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

[extensions]
strip =

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

stripコマンドは、ブランチを汚染する変更セットを本当に取り除きたい場合に便利です。実際、 この質問 の状況にあり、すべての「ドラフト」変更セットを完全に削除したい場合、チェックアウト- 一番上の答え 、これは基本的に次のことを提案します:

hg strip 'roots(outgoing())'
230
Samaursa

Hg Tortoiseを使用している場合は、拡張機能「strip」を有効にします。

  1. ファイル/設定/拡張機能/
  2. stripを選択します

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

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

ちょうどこのような:

enter image description here

この例では、19番目のリビジョンから最後のコミットまで消去されます(22)。

92
EliuX

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

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

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

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

19
Tom Leys

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

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

14
Ry4an Brase

私もこの問題に出会いました。 2つのcommitを作成し、両方のコミットをロールバックして削除したかった。

$ hg rollback

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

hg rollbackが1つのコミットをロールバックしたばかりであることがわかったとき、hg strip #changeset#を使用できることがわかりました。そこで、hg log -l 10を使用して最新の10個のコミットを見つけ、stripにしたい適切な変更セットを取得しました。

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

changeset:   2498:9e3e1de76127
branch:      component_engine
user:        other_user_name<[email protected]>
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
GoingMyWay

Rebase extension を使用すると、これをさらに簡単に回避できます。hg pull --rebaseを使用するだけで、ブランチの問題を回避して、プルされたリビジョンにコミットが自動的に再コミットされます。

9
too much php

Gitに精通している場合は、git rebase -iのように機能する histedit を使用してください。

5
neo

hg stripはあなたが探しているものです。 gitに精通している場合、git resetに似ています。

コンソールを使用:

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

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

4
val.sytch