たとえば、コードに多くの変更を加えましたが、それらの変更のいくつかをコミットするだけで済みます。Mercurialでそれを行う方法はありますか?darcs
このような機能があることを知っています。
ブランチ間でこれを実行できることはわかってhg transplant
いますが、他のブランチから変更セットを追加するときではなく、現在のブランチでコードをコミットするためにこのようなものが必要です。
たとえば、コードに多くの変更を加えましたが、それらの変更のいくつかをコミットするだけで済みます。Mercurialでそれを行う方法はありますか?darcs
このような機能があることを知っています。
ブランチ間でこれを実行できることはわかってhg transplant
いますが、他のブランチから変更セットを追加するときではなく、現在のブランチでコードをコミットするためにこのようなものが必要です。
Windows 用のTortoiseHg 1.xを使用している場合、この機能は箱から出してすぐに美しく実装されます (拡張機能は必要ありません)。
TortoiseHg 2.xでは、ハンク選択タブがなくなりました。その代わりに、シェルブ ツールがあります。古い塊の選択よりもいくつかの機能があります。これらの新機能には、複雑さが増すという代償が伴います。
この機能を使用する場合、Mercurial Shelve 拡張機能を明示的に有効にする必要はないことに注意してください。Steve Borho (主任 TortoiseHg 開発者) によると、別の TortoiseHg の質問への回答: 「シェルブ拡張機能のローカル コピーがあり、それを直接呼び出します。」
TortoiseHg 2.7+では、この機能が改善され、再導入されました。現在、コミット ツールに直接組み込まれています。
左側のファイル リストで、1 番上のファイルが含まれることを示すためにチェックされ、2 番目のファイルは含まれないためチェックが外され、3 番目のファイル Sample.txt が入力されていることに注意してください (Null チェックボックス インジケータ)。そのファイルから選択した変更のみがコミットに含まれるためです。
含まれる Sample.txt への変更は、画像の右下の変更選択部分でチェックされます。除外される変更はチェックされておらず、差分ビューはグレー表示されています。また、シェルフ ツールのアイコンが引き続き使用できることにも注目してください。
誰もこれを提案していないので、何かが欠けているように感じます。
通常の「hg commit」コマンドを使用して、何をコミットするかを選択的に選択できます (ローカル作業ディレクトリで保留中のすべての変更をコミットする必要はありません)。
次のような一連の変更がある場合:
M ext-web/docroot/WEB-INF/liferay-display.xml
M ext-web/docroot/WEB-INF/liferay-portlet-ext.xml
M ext-web/docroot/WEB-INF/portlet-ext.xml
これらの変更のうち 2 つだけをコミットできます...
hg commit -m "partial commit of working dir changes" ext-web/docroot/WEB-INF/liferay-display.xml ext-web/docroot/WEB-INF/liferay-portlet-ext.xml
手動でファイルを入力して選択的にコミットする必要があるため(亀のようなGUIチェックボックスプロセスと比較して)、コマンドラインからはあまり便利ではありませんが、拡張機能を必要としないほど簡単です. また、ファイルのグロビングはおそらく入力を減らすのに役立ちます (上記のように、コミットされた両方のファイルは、パス名で「liferay」を一意に共有します。
Mercurial Queues のチュートリアルは、このユース ケースには適していません。私が見たすべての例は、まだコミットを行っておらず、単一のパッチを更新していることを前提としています。ほとんどの場合、これは当てはまりません。2 つまたは 3 つのコミットを一緒につぶすか、他の方法で変更したい場合があります。
あなたがこの種の歴史を持っているとしましょう:
---O---O---A---B---C
最初の例は、コミット A、B、および C をスカッシュすることです。最初の init mq:
$ hg qinit
ここで、コミット A、B、および C をパッチ キューに「インポート」する必要があります。それらが最後の 3 つのコミットであると仮定しましょう。「-N」リビジョン構文を使用して、次のようにインポートできます。
$ hg qimport -r -3:-1
つまり、3 つのパッチから最後のコミットまでをパッチとしてインポートします。これらのパッチのステータスは、 で確認できますhg qseries
。次のように表示されます。
$ hg qseries
101.diff
102.diff
103.diff
ここで、番号 101、102、および 103 は、コミット A、B、および C のローカル リビジョン番号に対応します。これで、これらのパッチが適用されます。これは、それらが説明する変更が既に作業コピーにあることを意味します。を使用して、作業コピーの変更を取り除き、コミットの履歴からそれらを削除して、パッチ形式でのみ保存することができますhg qpop
。変更 C と B をスタックからポップするように言うかhg qpop; hg qpop
、「ポップ先」にパッチを指定することができます。この場合、次のようになります。
$ hg qpop 101.diff
now at: 101.diff
パッチ キューにコミット B と C のパッチがありますが、適用されていません (それらの変更は「失われました」 - パッチ キュー領域にのみ存在します)。これで、これらのパッチを最後のパッチに折りたたむことができます。つまり、A+B+C の変更の合計に相当する新しいコミットを作成します。
$ hg qfold -e 102.diff 103.diff
これによりエディタが表示され、コミット メッセージを変更できます。デフォルトでは、メッセージは、アスタリスクで区切られた、変更 A、B、および C のコミット メッセージの連結になります。ここでの良い点は、hg qfold
bash を使用していて、hg-completion スクリプトをソースにしている場合に、パッチをタブで補完することです。これにより、履歴は次のようになります。ここで、A+B+C は、関心のある 3 つのパッチの組み合わせである単一のコミットです。
---O---O---A+B+C
もう 1 つの使用例は、以前と同じ種類の履歴があるが、パッチ B をドロップして A+C をマージしたい場合です。これは実際には上記とかなり似ています。qfold ステップに到達したら、最後の 2 つのコミットではなく、最後のコミットを折りたたむだけです。
$ hg qfold -e 103.diff
これにより、B の変更がパッチ キューに残されますが、作業コピーには適用されず、そのコミットは履歴にありません。これは、次を実行して確認できます。
$ hg qunapplied
102.diff
履歴は次のようになります。A+C は、変更 A と C を組み合わせた単一のコミットです。
---O---O---A+C
最後の使用例は、コミット C のみを適用する必要がある場合です。これを行うには、上記のように qimport を実行し、不要なすべてのパッチを削除します。
$ hg qpop -a
-a フラグは、すべてのパッチをポップすることを意味します。これで、必要なものだけを適用できます。
$ hg qpush 103.diff
これにより、次の履歴が残ります。
---O---O---C
これがすべて完了したら、キューのいじりを終了する必要があります。これは次の方法で実行できます。
$ hg qfinish -a
それで、私たちはそこにいます。hg push
必要なものだけを実行してコミットしたりhg email
、メーリング リストに一貫したパッチを送信したりできます。
Mercurial で配布されているレコード拡張機能を使用できます。
セクション~/.hgrc
に追加して、最初にファイルで有効にする必要があります。[extensions]
[extensions]
record=
次に、のhg record
代わりに入力するだけでhg commit
、どのファイルにどの変更をコミットするかを選択できます。
変更を確認して選択するための優れたインターフェイスを提供するcrecord 拡張機能を使用することもできます。(ただし、Mercurial と一緒に配布されているわけではなく、時々コミットを台無しにするのを見たことがあるので、完全にバグがないわけではありません。)
MercurialQueuesがMercurialのこの役割を果たしていると思います。そこにリンクされているかなり良いチュートリアルがあります。
qct (Qt コミット ツール) を試してください。個々の変更を元に戻すための 3 方向マージ ツールを起動する「変更の選択」機能があります。コミットすると、「元に戻した」変更が元に戻ります。
commit-patchを使用します。コミットする前に差分を編集できるスクリプトです。Emacs の diff-mode と vc-mode を使えば本当に便利です。
以前はcrecordを使用していましたが、Unicodeに関連するバグがあります(実際にはcrecordが依存しているレコード拡張にバグがあります)。