2017-12-11 4 views
2

これは同じではありませんか?フィーチャーとマスターブランチを持っていて、フィーチャーブランチをマスターの上に移動したいのであれば、そのフィーチャーブランチからマスターへのすべてのコミットをピッキングするのと同じでしょうか?masterの上にあるrebaseの全ブランチは、rebasedブランチからのすべてのコミットを選んでいるのと同じですか?

私は考えていますが、いくつかの理由から、いくつかのコンフリクトがあっても、マスターにリベースするのは失敗し、チェリーを選ぶごとにコミットがうまくいきます。

+0

[参考](https://stackoverflow.com/q/11835948/720999)。 – kostix

+0

あなたがチェリーピッキングとなるコミットのリストを確認しましたか?リベースするときに移植するリストと同じですか? 'git log --reverse feature^$(git merge-base feature master)'を実行して後者を取得します。 – kostix

答えて

2

コード賢明桜狩り支店(またはベースあなたが上にリベースしている)上のはい右の順場合桜のピック。

違い:

  1. あなたは木の上の2つの場所に2つの類似のコピー(多分同じコミットを)持っていると思います
  2. 場所で再ベースにあなたが望んでいた元支店を残すことでしょう(メッセージを含まない)。
  3. チェリーピッキングでは、任意の順序で行くことができます!あなたはトラブルになる可能ブランチアウトに頭からあなた桜ピック​​(リベースは自由のための適切な順序を適用する)場合
  4. は、スカッシュが

をコミットすることはできません私はあなたに桜を推測しているANに選びました奇妙な順序。例:Cの

A->B->C 
    \ 
    D->E 

再基づかEはCDから選ぶ桜のようなものです、そしてE.ポストあなたのツリーとそのコミットが再基点に矛盾がある、と秩序あなた桜が選んだ - に問題を参照してください。

2

大抵、はい、しかし正確にはそうではありません。

まず、git rebaseが実装される3つの方法があります。対話型のものと-mのものは、文字通りgit cherry-pickを実行します。非インタラクティブ非マージ1は内部でデフォルトでgit format-patch | git amを使用します。これにより、git cherry-pickとは異なる結果が生じることがあります。

第2に、すべてのコミットが選択されるわけではありません。特に、git rebaseは、一般に次のものを排除します。

  • マージするコミット。
  • "空"のコミット(差分なしのコミット)。そして
  • は、Git決定がであり、すでに cherry-pickedであるとします。

はそれだけで気にしないように、文字通り(結局それらをコピーしないが、代わりにマージを再実行)-pを使用している場合を除き、コピーすることはできませんマージします。 Empty-diffコミットはgit format-patchを介してコピーすることはできません。そして、一般的に正しいとは言えませんので、デフォルトでは破棄します。 -k(空のままにする)を追加すると、非インタラクティブ・リベースを使用してもgit cherry-pickとなります。 copy empty-diffはコミットします。

最後に、オプションによっては、「フォークポイント」コードを使用して、コピー先のコミットの一部を破棄することができます。 --no-fork-pointを使用すると、このオプションは無効になり、デフォルトではの一部のリベースでは無効になりますが、デフォルトでは無効になります。詳細はthe git rebase documentationに記載されています。

git rebase -mまたはgit rebase -iを実行していない限り、表示される違いは、おそらくgit format-patch | git amが原因です。 git amがであるときに、git apply -3が実行されたときに異なる方法で適用される特定のコミットを識別できる場合には便利です(コミットが発生することはまれです(人工的な例を構築する時間がない、 の例がおそらくより価値があります)。


この決定を行うために、Gitはあなたが手動で実行することができgit patch-idを、使用しています。 git cherryまたはgit rev-listを使ってGitに自動的に実行させることができます。

git rev-list --cherry-pick --right-only --no-merges upstream...HEAD 

(対称差セレクタを呼び出し、3個のドットを、注意してください):リベースコードは(時には--reverse --topo-orderを使用して、git format-patchに、これらの引数、またはその同等物を通過させることによって)git rev-listを使用します。

+0

私の答えよりも良い方法、オペアンプは受け入れる必要があります。 – kabanus

関連する問題