web-dev-qa-db-ja.com

Mercurial —古いバージョンに戻り、そこから続行します

プロジェクトでMercurialをローカルで使用しています(他の場所へのプッシュ/プルを行わない唯一のリポジトリです)。

これまでのところ、線形の履歴があります。しかし、私が現在取り組んでいる作業はひどいアプローチであり、それを開始する前にバージョンに戻り、別の方法で実装したいと思います。

Mercurialのbranch/revert/update -Cコマンドと少し混同しています。基本的に、バージョン38(現在は45)に戻り、次のコミットに親として38を持ち、そこから続行します。リビジョン39-45が永遠に失われるか、それとも独自の行き止まりのブランチになるかは気にしません。

どのコマンド/コマンドセットが必要ですか?

247
Paolo
hg update [-r REV]

後でコミットする場合、効果的に新しいブランチを作成します。次に、このブランチでのみ作業を続けるか、最終的に既存のブランチをマージします。

147
van

コマンドのチートシートは次のとおりです。

  • hg updateは、作業コピーの親リビジョンを変更し、この新しい親リビジョンに一致するようにファイルの内容も変更します。これは、更新したリビジョンから新しいコミットが引き継がれることを意味します。

  • hg revertファイルの内容のみを変更し、作業コピーの親リビジョンをそのままにします。通常、作業コピーのファイルに加えたコミットされていない変更を保持したくないと判断した場合は、hg revertを使用します。

  • hg branchは、新しい名前付きブランチを開始します。名前付きブランチは、チェンジセットに割り当てるラベルと考えてください。したがって、hg branch redを実行すると、次の変更セットは「赤」ブランチに属するものとしてマークされます。これは、特に異なる人々が異なるブランチで作業していて、後で変更セットの作成元を確認したい場合に、変更セットを整理するための素晴らしい方法です。しかし、あなたはあなたの状況でそれを使いたくありません。

hg update --rev 38を使用する場合、チェンジセット39〜45は行き止まりのままになります。プッシュ先のリポジトリに「複数のヘッド」を作成するため、プッシュすると警告が表示されます。警告は、誰かがマージを行う必要があることを示唆しているため、そのような頭を残しておくのは一種の失礼なので、そこにあります。しかし、あなたの場合、あなたは本当にそれをぶら下げたままにしておきたいので、先に進んでhg Push --forceすることができます。

リビジョン39-45をまだどこか別の場所にプッシュしていない場合は、プライベートのままにしておくことができます。それは非常に簡単です。hg clone --rev 38 foo foo-38を使用すると、リビジョン38までしか含まれない新しいローカルクローンを取得できます。foo-38で作業を続行し、作成した新しい(良い)変更セットをプッシュできます。 fooクローンには古い(悪い)リビジョンが残っています。 (たとえば、foofoo-badに、foo-38fooに、クローンの名前を自由に変更できます。)

最後に、hg revert --all --rev 38を使用してからコミットすることもできます。これにより、リビジョン38と同じリビジョン46が作成されます。その後、リビジョン46から作業を続けます。これにより、hg updateと同じ明示的な方法で履歴にフォークを作成することはできませんが、複数の頭を持つ。すでにリビジョン45に基づいて独自の作業を行っている他のユーザーと協力している場合は、hg revertを使用します。それ以外の場合は、hg updateの方がより明確です。

394
Martin Geisler

コミットとプッシュを行った直後に、1つのファイルだけを前のリビジョンに戻す必要がある場合がありました。これらのリビジョンを指定するための短縮構文は他の回答ではカバーされていないため、ここでそれを行うコマンドを示します

hg revert path/to/file -r-2

-2は、最後のコミット前のバージョンに戻ります。-1を使用すると、現在のコミットされていない変更が元に戻ります。

29
hyde

私見、hg strip -r 39はこの場合により適しています。

Mq拡張機能を有効にする必要があり、Martin Geislerが推奨する「クローンリポジトリメソッド」と同じ制限があります。あなたの地元のレポ。

7
magras

hg update -r REVを使用した後、Pushできるようにその変更をコミットする方法についての答えは明確ではありませんでした。

更新後にコミットしようとすると、Mercurialは変更はないと考えます。

最初にファイルに変更を加えなければならず(READMEなど)、Mercurialは新しい変更を行ったことを認識し、それをコミットできました。

これにより、前述のように2つのヘッドが作成されました。

プッシュする前に他の頭を取り除くために、私は No-Op Merges ステップに従ってその状況を改善しました。

その後、プッシュすることができました。

6
Brian Gershon

上記の答えは最も有用であり、私は多くを学びました。ただし、私のニーズに対する簡潔な答えは次のとおりです。

hg revert --all --rev ${1}

hg commit -m "Restoring branch ${1} as default"

ここで、${1}はリビジョンの番号またはブランチの名前です。これらの2行は、実際にはbashスクリプトの一部ですが、手動で実行したい場合は単独で正常に機能します。

これは、リリースブランチにホットフィックスを追加する必要があるが、デフォルトからビルドする必要がある場合に役立ちます(CIツールを適切にし、ブランチからビルドし、後でリリースブランチを廃止できるようになるまで)。

5
Brian Carr

Tortoise Hg(Mercurial用の無料のGUI)をインストールして使用します。その後、戻りたいリビジョンを右クリックし、すべてのコミットメッセージを目の前に置いて、「すべてのファイルを元に戻す」ことができます。ファイルセットのバージョン間を前後にロールバックするのが直感的で簡単になります。これは、問題が最初に発生したときを確立しようとしている場合に非常に役立ちます。

1
Geoff Kendall