ローカルとリモートのMercurialリポジトリがあるとします。今、私は機能の作業を開始します。私はそれに取り組み、完了したと思うと、チェンジセットをコミットします。もう少しテストしてみると、コード内で何かを微調整することでこの機能をさらに改善できることがわかりました。変更してコミットします。 20分後、この新機能にバグがあることがわかったので、修正してコミットします。
これで、たとえば、「Implementing feature X」というメッセージを持つ1つのチェンジセットとしてリモートリポジトリにプッシュしたい3つのチェンジセットができました。
手間をかけずにこれを行うにはどうすればよいですか?私はパッチでそれを行うことができると信じていますが、それは多くの仕事のようです。
Collapse Extension はどうですか?
histedit拡張機能はまさにあなたが探しているものです。
hg histedit -o
または
hg histedit --outgoing
発信チェンジセットのリストが表示されます。リストから次のことができます
histeditは、折りたたまれたチェンジセットの新しいコミットメッセージを要求します。デフォルトでは、2つのメッセージに「\ n ***\n」で区切られています。
Mq拡張を使用しても同様の結果を得ることができますが、それははるかに困難です。
また、折りたたみ拡張機能を使用して折りたたみを行うこともできますが、NiceとしてUIを提供せず、結果のコミットメッセージを編集する方法を提供しません。結果のコミットメッセージを編集すると、最終メッセージをクリーンアップすることもできます。これは、私がいつも利用しているものです。
はい、あなたはパッチでそれを行うことができます:あなたの仕事がチェンジセット100から110に含まれていると仮定しましょう
パッチを作成します。
% hg export -o mypatch 100:110 --git
99への更新:
% hg update 99
--no-commitを使用してパッチを適用します(そうしないと、すべての変更セットが元に戻ります)。
% hg import --no-commit mypatch
すべての変更を一度にコミットします。
% hg commit
これで、2つのヘッド(110と111)が作成され、作業ディレクトリで生成されるファイルの点で同等になります。おそらく、古いヘッドを削除する前に、健全性のためにそれらを比較してください。
% hg strip 100
さて、私はすべてを綴ったので、長いように見えますが、自分で何回もやったので、私はそれが面倒すぎるとは思いません...
TortoiseHgを使用している場合は、2つのリビジョンを選択するだけで(後続のリビジョンを選択するにはCTRLを使用)、右クリックして"履歴の圧縮"を選択できます。
その後、前に選択した最初の変更から始まる新しい変更リストが新しいヘッドに表示され、選択したものの間のすべての子孫変更リストが含まれます。
不要になった古い変更リストは単純に削除できます。[〜#〜] mq [〜#〜]拡張を使用します。繰り返しになりますが、TortoiseHgで、最初の変更リストを右クリックして、そのすべての子孫と一緒に削除する必要があります"変更履歴->削除"。
この折り畳みに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を使用すると、非常に便利な他のすべてのことができます。
hg collapse
およびhg histedit
が最善の方法です。または、むしろ、それらが確実に機能するなら、最良の方法でしょう... 3分以内にスタックダンプでクラッシュするhistedit
を得ました。 Collapse
はそれほど良くありません。
私は2つの他のBKMを共有するかもしれないと思った:
hg rebase --collapse
この拡張機能はMercurialとともに配布されます。まだ問題はありません。 hg rebase
制限-基本的に、名前付きまたはデフォルトの同じブランチの祖先にリベースすることは好きではありませんが、(名前付き)ブランチ間でリベースする場合は許可します。
リポジトリを移動します(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
ツリーは、作業ディレクトリとそのファイルから独立しています。
独立していない場合...
私はMercurialを使ったことがありませんが、これはMartin Fowlerが彼のブログであまりにも前に話していたこととよく似ています。
Mercurialに2つの未公開のTHIS
コミットとTHAT
コミットがあり、THIS
ポイントで単一のコミットに参加するようにするとします。
... --> THIS --> ... --> THAT --> ... --> LAST
コミットが公開されていないことを確認します::
$ hg glog -r "draft() & ($THIS | $THAT)"
LAST
commitへの更新::
$ hg up
THIS
までのコミットをMQにインポートします。
$ hg qimport $THIS::.
すべてのパッチを適用解除し、最初のTHIS
::のみを適用します
$ hg qpop -a
$ hg qpush
$ hg qapplied
... THIS ...
THAT
::と結合します
$ hg qfold $THATNAME
[〜#〜] note [〜#〜]名前THATNAME
を見つけるには:
$ hg qseries
すべてのパッチを適用し、リポジトリ履歴に移動します::
$ hg qpush -a
$ hg qfinish -a
件名に関する私のブログ投稿は Mercurialで2つのコミットに参加する です。
HistEditはあなたが望むことをしますが、おそらくやり過ぎです。必要なのが、いくつかの変更セットを一緒に折り畳むことだけである場合、 Collapse Extension がジョブを実行します。
はい、 strip --keep
は作者の質問に対して機能します。ただし、たとえば、バージョンが1〜30で、バージョン12〜15のみを折りたたみたい場合など、他とは少し異なります。他のソリューションは機能しますが、機能しませんstrip --keep
。
なぜhg strip --keep
コマンド?
その後、すべての変更を1つのコミットとしてコミットできます。