8

リポジトリがあり、未完成の変更に mq パッチ キューを使用しています。パッチ キューもバージョン管理下にあります。

2 つのパッチ p1 と p2 があるとします (この順序で適用されます)。ここで、p1 に変更を加えます。

hg qnew p1
...
hg qnew p2
...
hg qref
hg com --mq -m"(Commit before reject)"
hg qpop p1
{make change}
hg qref
hg qpush -a

...そして p2 は適用に失敗します。

標準的な方法は、拒否されたハンクを手動で適用することです。MqMergePatchのような、mercurial のマージを使用する優れたものを使用したいのですが、これは非推奨の機能に基づいています。

hg qsave // deprecated: use "hg rebase" instead

私の質問は: hg rebaseでそれを行う方法は?

編集

リポジトリのログを見た後、私は MqMergePatch がそれに対して行うことをまったく好きではありません。パッチを使用する際の私の主な目標は、リポジトリの履歴をクリーンにし、無駄な詳細が散らばらないようにすることです。

4

2 に答える 2

15

使用するという提案hg rebaseは誤解を招くと思います。MqMergePatchページには、これはMqMergeの修正版であると記載されています。これは、他の場所から取得した新しい変更セットの上に一連のパッチをリベースするための手法でした。

ただし、既に適用されているパッチ キューのコピーを保存し (これだけですhg qsave does)、保存されたコピーを参照の一部として使用して、パッチ キューのリベースに影響を与える 3 方向のマージを行う必要があります。リベース拡張機能を有効にする前は、自分でそれを行っていました。次に、最初のパッチを新しい親にしたいチップ変更セットの上にリベースするだけでした。

ただし、基本的には、変更したパッチの上にパッチをリベースする必要があるため、それはあなたが望むものではありません。ただし、パッチ キューは線形であり、パッチが適用された変更セットにパッチ キューと並行する他の子がある場合にのみ、パッチをリベースできます。

--- A -------- patch1 --- patch2
     \
      \-- B

上記の状況では、パッチ キューは簡単にリベースできますがB(hg rebaseしたがって、 を使用することをお勧めしますhg rebase)、それはあなたの状況とは関係ありません。

あなたの状況へのアプローチ

以下は、未適用のパッチと競合する未保存のローカル変更を含む適用済みパッチです。

--- A --- patch1           <patch2>
             \
              \-- [changes]

通常、拒否はほとんどないため、通常は弾丸をかじり、手動で拒否を処理します。拒否が多すぎて手動で処理できない状況にある場合、そもそもそれらを適切に整理していなかった可能性があります。

qsaveなどを使用する手法が次の手法qpush -mよりも好ましい場合は、廃止されたとしても、すぐに削除される可能性は低いです。qsave

3 方向マージ ツールを本当に利用したい場合、上記の状況をどのように処理するかを次に示します。

(TortoisHg 2.x ではまだパッチ キューをリベースできないため、これは私が時々行う finish-rebase-import の変形です。)

  • の代わりに、保存されていない変更を新しいパッチにするためqrefreshに使用します。qnew

    --- A --- patch1 --- patch1b        <patch2>
    
  • これらのパッチを通常の変更セットに仕上げます。

    --- A --- B --- C        <patch2>
    
  • patch完全に適用される変更セット( )に更新しB、パッチを適用します。

    --- A --- B --- patch2
               \
                \-- C
    
  • baseを使用してローカルその他の間の競合を解決するために 3 方向マージが使用されるように、patch2上にリベースします。C patch2 C B

    (TortoiseHg 2.x では、patch2リベースする前に終了してから、キューにインポートして戻す必要があります。)

    --- A --- B --- C --- patch2
    
  • 再びパッチとしてキューにインポートBします。C

    --- A --- patch1 --- patch1b --- patch2
    
  • ポップpatch2patch1bてから折りたたむ(名前を に変更patch1b) :patch1patch1new

    --- A --- patch1new       <patch2>
    

patch2にきれいに適用されるようになりましたpatch1new

于 2011-08-05T03:41:04.680 に答える