Rebase は(バンドル)拡張機能であり、 Graft はコア機能( Transplant (バンドル)拡張機能に置き換わるもの)であることは知っています。
graft
は次のように文書化されています。
変更を他のブランチから現在のブランチにコピーします
このコマンドはMercurialのマージロジックを使用して、履歴グラフのブランチをマージせずに、他のブランチから個々の変更をコピーします。これは、「バックポート」または「チェリーピッキング」として知られています。
rebase
は次のように文書化されています。
Rebaseを使用すると、Mercurialの履歴内でコミットを移動できます(一連の内部マージを使用)。これには多くの用途があります:
- ブランチ間でチェンジセットを移動する
- 履歴の「線形化」
- 変更セットの並べ替え
- 複数の変更を1つの変更セットにまとめる
どちらもブランチ間で変更セットを移動またはコピーするためにマージを使用しているようです。
移植コピー。リベースの動き。だが rebase --keep
コピー。
頻繁にチェンジセットをコピーするという目標をどちらの方法でも達成できるようです。どちらを使用するかは重要ですか?いつ他を好むべきですか?
例えば。移植は、別のnamedブランチにコピーする場合にのみ使用する必要がありますか?または、変更セットが1つだけの場合にのみ?
編集:リベースは潜在的に安全でないgraftのスーパーセットですが、ローカル履歴を編集するための開発中はdraft
チェンジセットでのみ使用できますが、graftはpublic
バックポートのメンテナンス中の変更セット?
hg graft
は、質問で指摘したように、「チェリーピッキング」を許可します。たとえば、hg graft -D "2085::2093 and not 2091"
を実行して、別のリビジョンからsome変更のみをコピーできます。比較すると、hg rebase
(--keep
の有無にかかわらず)は、指定された変更セットと、その子孫の変更のallを取得します。
また、rebase
を使用すると、チェンジセットを折りたたむことができます(--collapse
を使用)。私が知る限り、graft
はそうではありません。
私が気づいたもう1つの違い:hg graft --edit 123
を使用すると、リビジョン123を作業ディレクトリに移植し、コミットメッセージを編集できます。同等のhg rebase
が見つかりません。ただし、hg histedit
では、リベース中にコミットメッセージを編集することもできます。
おそらく私が考えていない他の違いがあります。 SOコミュニティ:コメントで自由に指摘してください。この回答をより完全なものにするために喜んで修正します。
詳細については、 graft
ドキュメント および Rebase拡張ドキュメント を参照してください。