60

たとえば、コードに多くの変更を加えましたが、それらの変更のいくつかをコミットするだけで済みます。Mercurialでそれを行う方法はありますか?darcsこのような機能があることを知っています。

ブランチ間でこれを実行できることはわかってhg transplantいますが、他のブランチから変更セットを追加するときではなく、現在のブランチでコードをコミットするためにこのようなものが必要です。

4

10 に答える 10

36

Windows 用のTortoiseHg 1.xを使用している場合、この機能は箱から出してすぐに美しく実装されます (拡張機能は必要ありません)。

  1. TortoiseHg コミット ツールを実行します。
  2. 変更のサブセットのみをコミットするファイルを選択します。
  3. プレビュー ペインで [Hunk Selection] タブをクリックします。
  4. ダブルクリックするかスペースバーを使用して、コミットに含める変更ハンクを切り替えます。

TortoiseHg 2.xでは、ハンク選択タブがなくなりました。その代わりに、シェルブ ツールがあります。古い塊の選択よりもいくつかの機能があります。これらの新機能には、複雑さが増すという代償が伴います。

ここに画像の説明を入力

この機能を使用する場合、Mercurial Shelve 拡張機能を明示的に有効にする必要はないことに注意してください。Steve Borho (主任 TortoiseHg 開発者) によると、別の TortoiseHg の質問への回答: 「シェルブ拡張機能のローカル コピーがあり、それを直接呼び出します。」


TortoiseHg 2.7+では、この機能が改善され、再導入されました。現在、コミット ツールに直接組み込まれています。

commit ツールでの変更選択の例

左側のファイル リストで、1 番上のファイルが含まれることを示すためにチェックされ、2 番目のファイルは含まれないためチェックが外され、3 番目のファイル Sample.txt が入力されていることに注意してください (Null チェックボックス インジケータ)。そのファイルから選択した変更のみがコミットに含まれるためです。

含まれる Sample.txt への変更は、画像の右下の変更選択部分でチェックされます。除外される変更はチェックされておらず、差分ビューはグレー表示されています。また、シェルフ ツールのアイコンが引き続き使用できることにも注目してください。

于 2010-10-05T13:35:48.523 に答える
34

チャドが言及した MQ は 1 つの方法です。より軽量なソリューションもあります。

  • darcs レコードとほぼ同じように機能するレコード拡張。Mercurial で配布されています。
  • 特定の変更を「棚上げ」し、変更のサブセット (棚上げされていないもの) のみをコミットできるようにするシェルブ拡張機能
于 2009-05-13T12:04:51.773 に答える
19

誰もこれを提案していないので、何かが欠けているように感じます。

通常の「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」を一意に共有します。

于 2011-12-26T21:08:18.620 に答える
16

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 qfoldbash を使用していて、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、メーリング リストに一貫したパッチを送信したりできます。

于 2009-05-13T20:35:02.813 に答える
7

Mercurial で配布されているレコード拡張機能を使用できます。

セクション~/.hgrcに追加して、最初にファイルで有効にする必要があります。[extensions]

[extensions]
record=

次に、のhg record代わりに入力するだけでhg commit、どのファイルにどの変更をコミットするかを選択できます。

変更を確認して選択するための優れたインターフェイスを提供するcrecord 拡張機能を使用することもできます。(ただし、Mercurial と一緒に配布されているわけではなく、時々コミットを台無しにするのを見たことがあるので、完全にバグがないわけではありません。)

于 2012-01-18T11:44:25.223 に答える
3

MercurialQueuesがMercurialのこの役割を果たしていると思います。そこにリンクされているかなり良いチュートリアルがあります。

于 2009-05-12T21:28:52.907 に答える
2

qct (Qt コミット ツール) を試してください。個々の変更を元に戻すための 3 方向マージ ツールを起動する「変更の選択」機能があります。コミットすると、「元に戻した」変更が元に戻ります。

于 2009-05-24T22:51:31.743 に答える
2

commit-patchを使用します。コミットする前に差分を編集できるスクリプトです。Emacs の diff-mode と vc-mode を使えば本当に便利です。

以前はcrecordを使用していましたが、Unicodeに関連するバグがあります(実際にはcrecordが依存しているレコード拡張にバグがあります)。

于 2010-10-07T21:42:34.690 に答える