96

ローカルとリモートのMercurialリポジトリがあるとしましょう。今、私は機能に取り組み始めます。私はそれに取り組んでおり、それが完了したと思ったら、チェンジセットをコミットします。もう少しテストしてみると、コード内の何かを微調整することで、この機能をさらに改善できることがわかりました。変更を加えてコミットします。20分後、この新機能にバグがあることがわかったので、それを修正してコミットします。

たとえば、「機能Xを実装しています」というメッセージが表示された1つのチェンジセットとして、リモートリポジトリにプッシュしたい3つのチェンジセットがあります。

どうすればそれほど面倒なことなくこれを行うことができますか?パッチでできると思いますが、大変な作業のようです。

4

11 に答える 11

52

histedit拡張機能はまさにあなたが探しているものです。

hg histedit -o

また

hg histedit --outgoing

送信チェンジセットのリストが表示されます。リストからできること

  • 2 つ以上のチェンジセットを折りたたみ、1 つのチェンジセットを作成する
  • 変更セットを削除して履歴から削除する
  • 変更セットを好きなように並べ替えます。

histedit は、折りたたまれたチェンジセットの新しいコミット メッセージを求めるプロンプトを表示します。デフォルトでは、"\n***\n" で区切られた 2 つのメッセージが表示されます。

mq 拡張機能を使用しても同様の結果を得ることができますが、はるかに困難です。

折りたたみ拡張機能を使用して折りたたみを行うこともできますが、UI が適切ではなく、結果のコミット メッセージを編集する方法も提供されません。結果のコミット メッセージを編集すると、最終メッセージをクリーンアップすることもできます。これは、私がいつも利用するものです。

于 2009-10-13T12:32:37.960 に答える
39

折りたたみ拡張機能はどうですか?

于 2009-07-29T15:39:48.163 に答える
21

はい、パッチでそれを行うことができます: あなたの作業が変更セット 100 から 110 にあると仮定しましょう。

  1. パッチを作成します。

    % hg export -o mypatch 100:110 --git

  2. 99 に更新:

    % hg update 99

  3. --no-commit を使用してパッチを適用します (そうしないと、すべての変更セットが元に戻ります)。

    % hg import --no-commit mypatch

  4. すべての変更を一度にコミットします。

    % hg commit

  5. これで 2 つのヘッド (110 と 111) ができましたが、これらは作業ディレクトリに生成されるファイルに関して同等であるはずです。

    % hg strip 100

わかりました、すべてを綴ったので、長く見えますが、自分で何度もやったので、それほど面倒ではないと思います...

于 2009-07-30T02:48:07.050 に答える
19

TortoiseHg を使用している場合は、2 つのリビジョンを選択し (CTRL を使用して連続していないものを選択します)、右クリックして [履歴の圧縮] を選択します。

その後、前に選択した最初の変更から始まる新しい変更リストが新しいヘッドに取得されます。これには、選択したものの間のすべての子孫変更リストが含まれます。

古い変更リストが不要になった場合は、簡単に取り除くことができます。MQ拡張機能を使用してください。繰り返しますが、TortoiseHg で、すべての子孫を削除する必要がある最初の変更リストを右クリックします ( "Modify History -> Strip" )

于 2011-05-12T14:34:33.350 に答える
18

この折りたたみにmqを使用する私の好ましい方法は、ここで説明するようにTortoiseHgを使用することです。ただし、次のようにコマンドラインから簡単に実行できます。

hg qimport -r <first>:<last> 
    -- where <first> and <last> are the first and last changesets 
    -- in the range of revisions you want to collapse

hg qpop <first>.diff
    -- remove all except for the first patch from the queue
    -- note: mq names patches <#>.diff when it imports them, so we're using that here

hg qfold <next>.diff
    -- where <next> is <first>+1, then <first>+2, until you've reached <last>

hg qfinish -a
    -- apply the folded changeset back into the repository

(qfoldステップを実行するためのより良い方法があるかもしれませんが、私は通常その操作にTortoiseHgを使用しているので、私はそれを認識していません。)

最初は少し複雑に思えますが、mqを使い始めると、非常に簡単で自然になります。さらに、mqを使用すると、他のさまざまなことができるので、非常に便利です。

于 2011-03-03T00:30:07.980 に答える
4

hg collapseそしてhg histedit最良の方法です。むしろ、それらが確実に機能するなら、それが最善の方法でしょう... histedit3 分以内にスタック ダンプでクラッシュするようになりました。Collapseそれほど良くありません。

他の 2 つの BKM を共有する可能性があると考えました。

  1. hg rebase --collapse

    この拡張機能は Mercurial と共に配布されます。まだ問題はありません。制限を回避するには、いくつかのゲームをプレイする必要がある場合がありますhg rebase。基本的に、(名前付き) ブランチ間でリベースする場合は許可されますが、名前付きまたはデフォルトの同じブランチの先祖にリベースすることは好きではありません。

  2. リポジトリ ( foo/.hg) を作業ディレクトリ ( bar) とそのファイルに移動します。その逆ではありません。

2 つのクローン ツリーを作成し、それらの間でファイルをコピーすることについて話している人もいます。またはそれらの間のパッチ。代わりに、.hgディレクトリを移動する方が簡単です。

hg clone project work
... lots of edits
... hg pull, merge, resolve
hg clone project, clean
mv work/.hg .hg.work
mv clean/.hg work/.hg
cd work
... if necessary, pull, nerge, reconcile - but that would only happen because of a race
hg push

.hgこれは、真のリポジトリであるツリーが作業ディレクトリとそのファイルから独立している限り機能します。

自立しなければ…

于 2012-01-06T07:23:39.717 に答える
2

私は Mercurial を使ったことはありませんが、これは Martin Fowler が少し前に彼のブログで話していたこととよく似ています。

http://martinfowler.com/bliki/MercurialSquashCommit.html

于 2009-07-29T14:37:30.667 に答える
0

HistEdit はあなたが望むことを行いますが、おそらくやり過ぎです。いくつかの変更セットをまとめることだけが必要な場合は、Collapse Extensionがその仕事をしてくれます。

于 2009-10-13T14:22:14.917 に答える
0

はい、strip --keep著者の質問に対応しています。ただし、バージョンが 1 から 30 まであり、バージョン 12 から 15 のみを折りたたむ場合など、他のものとは少し異なりました。他のソリューションは機能しますが、機能しませんstrip --keep

于 2018-10-16T02:31:05.433 に答える
0

Mercurial に2 つの未公開THISTHATコミットがあり、それらを次の時点で単一のコミットに結合したいとしTHISます::

... --> THIS --> ... --> THAT --> ... --> LAST

コミットが公開されていないことを確認してください::

$ hg glog -r "draft() & ($THIS | $THAT)"

コミットする更新LAST::

$ hg up

THISMQ:: にコミットをインポートします。

$ hg qimport $THIS::.

すべてのパッチの適用を解除し、最初にのみ適用しますTHIS::

$ hg qpop -a
$ hg qpush
$ hg qapplied
... THIS ...

THAT::で参加

$ hg qfold $THATNAME

名前の使用を見つけるにTHATNAMEは::

$ hg qseries

すべてのパッチを適用し、それらをリポジトリの履歴に移動します::

$ hg qpush -a
$ hg qfinish -a

件名に関する私のブログ投稿は、 Mercurial で 2 つのコミットに参加しています。

于 2016-11-09T20:54:16.210 に答える