web-dev-qa-db-ja.com

コミットのためのMercurialチェリーピッキングの変更

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

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

57
mansu

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

  • レコード拡張 darcsレコードとほぼ同じように機能します。 Mercurialとともに配布されます。
  • シェルフ拡張 これは、特定の変更を「シェルフ」して、変更のサブセット(シェルブされていないもの)のみをコミットできるようにします。
34

TortoiseHg 1.xfor Windowsを使用している場合、 この機能は美しく実装されています すぐに使用できます(拡張機能は不要です) )。

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

TortoiseHg 2.xの場合、[ハンクの選択]タブはなくなりました。その代わりに、 Shelve tool があります。古いハンクの選択よりもいくつかの機能があります。これらの新機能は、いくらか複雑さが加わることを犠牲にしています。

enter image description here

この機能を使用する場合、Mercurial Shelve拡張機能を明示的に有効にする必要はありません。 Steve Borho(TortoiseHgの開発主任)によると、別のTortoiseHg質問への 回答 "シェルフ拡張のローカルコピーがあり、直接呼び出す。 "


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

example of change selection in the commit tool

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

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

36
mwolfe02

Mercurial Queuesチュートリアルは、このユースケースではひどいものです。私が見たすべての例では、まだコミットを行っておらず、1つのパッチを更新していると想定しています。ほとんどの場合、これは当てはまりません。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を使用すると、変更を作業コピーから削除し、コミットの履歴から削除して、パッチ形式でのみ保存できます。 hg qpop; hg qpopと言うと、変更CとBをスタックからポップするか、「ポップ先」にパッチを指定できます。この場合は、次のようになります。

$ hg qpop 101.diff
now at: 101.diff

これで、パッチBとCのパッチがパッチキューにありますが、それらは適用されません(変更は「失われました」-パッチキュー領域にのみ存在します)。これで、これらのパッチを最後のパッチに折りたたむことができます。つまり、変更A + B + Cの合計に相当する新しいコミットを作成します。

$ hg qfold -e 102.diff 103.diff

エディタが表示されるので、コミットメッセージを変更できます。デフォルトでは、メッセージは変更A、B、Cのコミットメッセージをアスタリスクで区切ったものになります。ここでの良い点は、bashを使用していて、hg-completionスクリプトを入手している場合、hg qfoldがパッチをタブ補完することです。これにより、次のような履歴が残ります。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メーリングリストに一貫したパッチを適用できます。

16
richq

まだ誰も提案していないので、何かが足りないようです。

通常の "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チェックボックスプロセスに対して)を手動で入力する必要があるため、コマンドラインからはあまり便利ではありませんが、拡張機能を必要としないので簡単です。また、ファイルグロビングはおそらくタイピングを減らすのに役立ちます(上記のように、両方のコミットされたファイルはパス名で「ライフレイ」を一意に共有します。

16
Gary Affonso

Mercurialとともに配布される record extension を使用できます。

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

[extensions]
record=

次に、hg recordではなくhg commitと入力するだけで、コミットするファイルに対する変更を選択できます。

crecord extension を使用して、変更を確認および選択するための優れたインターフェースを提供することもできます。 (ただし、Mercurialと一緒に配布されていません。また、ときどきコミットが失敗するため、完全にバグがないわけではありません。)

7
ronnix

時間が経ちました。今の最良のオプションはhg commit --interactive

7
ElyashivLavi

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

3
Chad Birch

commit-patch を使用します。コミットする前に差分を編集できるスクリプトです。 Emacsのdiff-modeとvc-modeは本当に素晴らしいです。

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

2
jpkotta

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

2
Nicolas Alvarez