2010-12-14 12 views
13

コミットの直前に私の作業コピー(hg statushg diff)を見直すと、私はしばしばいくつかの望ましくない変更に気付きます。たとえば、デバッグセッション中だけ一時的にいくつかのコードを追加または削除した可能性があります。水銀でファイル内のある範囲の行を元に戻すことはできますか?

私はhg revertを使用して不要な変更を削除できますが、これによりファイル全体のすべての変更が削除されることがわかりました。ファイルの一部を元に戻す方法はありますか?

+0

類似:http://stackoverflow.com/questions/876763/mercurial-revert-aメルドを使用するためには、あなたが私たちの〜/ .hgrcファイルにそれを設定する必要があります-single-hunk – keturn

答えて

5

一方の方法では、kdiff3のようなグラフィカルな差分ツールを使用しています。 diffにフィードして「現在のファイルをマージする」を選択すると、行ごとに移動して、必要なものを選ぶことができます。

より良い方法は、より頻繁にコミットすることです。デバッグコードを追加する前にコミットすることを習慣にして、 "実際の"コードを追加する前にデバッグコードをコミットまたは元に戻すと、独自のリビジョンがあるのでデバッグコードを簡単に削除できます。あるいは、デバッグコードを別のブランチに置くこともできます。

+0

+1私は[hg kdiff3]コマンドを有効にするために[これらの命令](http://mercurial.selenic.com/wiki/KDiff3)に従いました。そして、私は "Merge - Merge thisファイル "メニュー項目を選択します。 2つのバージョンのどちらを選択するかを選択するために右クリックのコンフリクトが必要であることがわかりましたが、うまくいくようです。私はこれを試してみましょう。 –

+0

「マージカレントファイル」はパズルの欠けていた部分でした。まことにありがとうございます。 –

7

は、私はあなたが明示的に個々の行を戻すことができるかどうかわからないんだけど、私はあなたのような状況でやっていることは、残り(悪いコード)を良いコードをコミットして戻すことです。このワークフローは、Mercurialのrecordまたはcrecordの拡張子を使用すると簡単です(後者をお勧めします)。

+1

私は以下を使用します: 'hg record -m temp; hg revert -a; hgパージ; hg strip -k .'これを正確に行うだけでなく、不要になった変更を取り除いた後に一時的にコミットされた変更を作業コピーに戻すこともできます。 –

3

TortoiseHg GUIの「コミット」ウィンドウには、コミットするファイルの変更の特定のセクションを選択できる「ハンク選択」タブがあります。

+1

..しかし、それはHunkベースの復帰を持っていません。 – user2864740

+0

@ user2864740、ファイルを元に戻し、保持したいハンズをコミットしてください。 –

1

私はあなたの問題に対して別の答えを得ました。これは私と同じ問題です。これはmercurial queuesの優れた使用例です。

私は準備ができていると思うの変化にデバッグコードの追加を開始しようとしていたとき、私は次のようにします。

hg qnew -m "fix for bug #123" fix.patch # basically a local-only commit 
hg qnew -m "debugging" dbg.patch   # prepare the next changeset at the tip 
[add my debugging] 
hg qrefresh        # update the changeset at the tip 
[...] 
hg qpop         # pop the debugging off the repo history 

をそれは慣れるの少しを取る - あなたはを有する終わりますパッチの順序を変更して、元の作業パッチに加えた修正を折り畳みます。

また、Bill Barryの屋根裏部屋の延長線をご覧ください。このページでは、いくつかの異なるワークフローで使用する方法と、mqを使用する方法と比較して説明します。あなたと仮定するとhttps://www.mercurial-scm.org/wiki/AtticExtension

4

は、次のようにあなたが行うことができ、recordshelve拡張が有効になっている:

hg record -m "garbage" # pick out and commit the change you want to revert 
hg shelve --all   # temporarily hide other changes 
hg strip tip    # remove the garbage changeset 
hg unshelve    # restore the changes you want to keep 
1

私はあなたが歩くと部品を選択することができますインタラクティブなncursesベースのスタイルのUI hg revert -iでこれを行ってきましたファイル、差分チャンク、または行ごとに破棄したいのですが、変更内容をどの程度深く展開しているかによって異なります。

私はこれが標準 hg機能であるかない場合、あなたはそれを持っている場合、あなたは簡単に十分に検証できることを確認していない

:ちょうどあなたがマークの変更(X)が被爆する内容になることを覚えておいてください

> hg revert --help --verbose | grep -- -interactive 
-i --interactive   interactively select the changes (EXPERIMENTAL) 

あなたが保持するものではありません。

0

変更を希望するコミットが、

hg meld -r ba1c841aaff4^ <filename> 

今、あなたのラインを元に戻すファイルと密接メルドを救うために途中で(右向き)、右矢印をクリックしてください:ba1c841aaff4、 最も簡単に使用することです。 kdiff3(古いものと直感的ではないもの)を別の方法にすることもできます。

サイドノート:

[extdiff] 
cmd.meld = 

[merge-tools] 
meld.args=$base $local $other 
関連する問題