web-dev-qa-db-ja.com

Mercurialでは、hgグラフトとhgリベースの違いは何ですか

Rebase は(バンドル)拡張機能であり、 Graft はコア機能( Transplant (バンドル)拡張機能に置き換わるもの)であることは知っています。

graftは次のように文書化されています。

変更を他のブランチから現在のブランチにコピーします

このコマンドはMercurialのマージロジックを使用して、履歴グラフのブランチをマージせずに、他のブランチから個々の変更をコピーします。これは、「バックポート」または「チェリーピッキング」として知られています。

rebaseは次のように文書化されています。

Rebaseを使用すると、Mercurialの履歴内でコミットを移動できます(一連の内部マージを使用)。これには多くの用途があります:

  • ブランチ間でチェンジセットを移動する
  • 履歴の「線形化」
  • 変更セットの並べ替え
  • 複数の変更を1つの変更セットにまとめる

どちらもブランチ間で変更セットを移動またはコピーするためにマージを使用しているようです。

移植コピー。リベースの動き。だが rebase --keepコピー。

頻繁にチェンジセットをコピーするという目標をどちらの方法でも達成できるようです。どちらを使用するかは重要ですか?いつ他を好むべきですか?

例えば。移植は、別のnamedブランチにコピーする場合にのみ使用する必要がありますか?または、変更セットが1つだけの場合にのみ?


編集:リベースは潜在的に安全でないgraftのスーパーセットですが、ローカル履歴を編集するための開発中はdraftチェンジセットでのみ使用できますが、graftはpublicバックポートのメンテナンス中の変更セット?

29
Peter

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拡張ドキュメント を参照してください。

34
Ed Cottrell