A、B、C、D などのコミットがたくさんあります。B、C、D を保持し、(BCD)⁻¹ のコミットを行いたいと考えています。同時に取り消したいコミットが多数ある場合、これを行う最も簡単な方法は何ですか?
hg update
(これについてのスタックオーバーフローの質問で、私が A に移動し、いくつかの引数を指定して呼び出すことを提案したことを思い出したようですがhg commit
、今はその質問を見つけることができないようです。)
を探しているようですねbackout
。見る:
hg help backout
一度に複数のコミットを取り消すことはできないと思うので、個別に取り消す必要があります。
hg backout D
hg backout C
hg backout B
これにより、D、C、および 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 に更新してコミットを続行することもできます (その時点で履歴を分割します)。これはより適切かもしれません。
最も簡単な方法:
変更セット 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
。非アクティブなブランチになります。
それはやりやすく、表現力も豊かです。グラフを見ると、閉じられた別のブランチが表示され、「公式」ブランチが続行されます。これらのリバートとバックアウトの変更セットがブランチでノイズを発生させるよりもはるかに優れています。
あなたは自分の質問に答えました。A に戻って更新し、そこから続けてください。その時点で新しいヘッドを作成する必要がある場合は、ここで説明されているように、いくつかのファイルまたは他のファイルに変更を加える必要があります: How can I force mercurial to accept a empty commit . その投稿からリンクされているメール スレッドでは、MqExtension を使用して BCD を削除する方法について説明しています (プッシュしていない場合)。