2012-07-23 9 views
6

私は、A、B、C、Dのようなコミットの束を持っています。私はB、C、Dを保持し、(BCD)-1をコミットしたいと思います。私が同時に取り消したいコミットがたくさんある場合は、これを行う最も簡単な方法は何ですか?Mercurialで複数のコミットを元に戻すにはどうすればよいですか?

(IはI Aへhg update、その後はいくつかの引数でhg commitを呼び出すことが示唆されたこのことについてstackoverflowの質問を見て思い出すように見えるが、私は今、その質問を見つけるように見えることはできません。)

答えて

1

ます」あなた自身の質問に答えて、Aに戻って更新してください。その時点で頭を上げる必要がある場合は、How can I force mercurial to accept an empty commitに記載されているように、ファイルやその他のファイルを変更する必要があります。 A mail threadには、Bqを削除するためにMqExtensionを使用する方法が記載されています(あなたがプッシュしない限り):

+0

これはDがHEADの場合のみです。 hgにはガベージコレクションがないので、B、C、Dは失われません。 Dは、あなたが押し込めるかしないかの頭のままになります。 – DanMan

4

backoutのように聞こえます。参照:

hg help backout 

私はそれが一度に複数のコミットを取り消すことができるとは思わないので、あなたがそれらを個別にバックアウトする必要があります。

hg backout D 
hg backout C 
hg backout B 

これはDその上に3つのコミットを作成します。これらのコミットを1つのチェンジセットに結合する場合は、rebase --collapseまたは他のいくつかの拡張子(例えば、histeditまたはmqまたはcollapseの拡張子)のいずれかを使用してそれらを折り畳むことができます。あなたは、個々の変更をバックアウトしたいが、一度にすべてを行わない場合は、次の操作を行うことができ

hg update A 
hg debugsetparents D 
hg commit -m "revert B-D" 

それは醜いですが、それは動作します。しかし、これは逆の名前を記録しません。正直言って、私はこれを行うことをお勧めしません。あなたがバックアウトする必要がある場合は、個々のバックアウトコマンドが入力するのが面倒すぎるので、バックアウトが本当にあなたがその特定の場合。

また、JimとRafaelが提案したように、B、C、Dがブランチ上にあると判断し、Aに更新してそこにコミットを続ける(その時点で履歴を分割する)ことができます。これはより適切かもしれません。

+0

これは私が望むことを行います(3つのコミットをmqで一緒にすると)、取り消したいコミットが50個あれば扱いにくくなります。 私は、http://stackoverflow.com/questions/1463340/revert-multiple-git-commits(但し、hg)の受け入れられた回答の2番目の部分に近いものを探しています。つまり、hgの 'git reset --hard A && git reset --soft @ {1} && git commit -a' –

+0

Mercurialでこれを行う方法で答えを更新しました。しかし、あなたがリンクしているgitの回答のように、実際にチェンジセットを取り消すわけではありません。このような一連のチェンジセットを元に戻したいと思ったのはなぜですか?活動していないブランチに駐車し、その前の変更から続行するほうが良いようです。あなたの質問にあなたのユースケースを少し記述すれば、それはあなたの問題に対するよりよい解決策を提供するのに役立ちます。 –

+0

また、単一のリビジョンだけでなくリビジョンセットを受け入れるために、backoutコマンドがMercurialに機能リクエストを送信することを検討することもできます。 –

4

最も簡単な方法:

あなたはチェンジセットDであり、あなたはその枝今

hg commit --close-branch -m "Branch closed" 

に終了したい、単に新しいものコミットAをチェンジセットし、作業を継続するために行く

hg up -r A 
... change stuff ... 
hg ci -m "New stuff" 

B、C、Dを持つブランチはそこにありますが、終了します。hg headsには表示されません。これは非アクティブなブランチになります。

これは簡単で表現も簡単です。グラフを見ると、別のブランチが表示され、閉じられ、「公式」ブランチが実行されます。あなたの支店に騒ぎを起こす復帰と退却のチェンジセットを持つよりもずっと優れています。

+1

[別の質問](http://stackoverflow.com/questions/3688263/mercurial-beheading- a-head)では、クローズドヘッドを別のリポジトリにプッシュしようとすると、複数のヘッドを作成するという警告が表示されます。だから、最初に押したときに 'hg push --force'を使います。閉鎖された頭を引っ張っている人は警告を受けません。 – mernst

関連する問題