あなたがあなたの理解を表現した方法は私を少し混乱させました。私はあなたがそれを正しく持っているかもしれないと思います、しかしあなたがそうでない場合に備えて、これが私が一般的にそれを考える方法です。リベースすると、gitはこれらの2つのコミットを取得し、それらを新しいベースに適用しようとします。e57cfは、169a6のdiffを適用した結果です。つまり、単純な理想的なケースではgit diff a46c3 169a6
、git diff da985 e57cf
同じ出力を生成するはずです。同様に、f7e63には2c33aと同じ変更が含まれている必要があります。それが助けになるなら、あなたは「リベース」を「移植」の同義語と考えることができます。
現在、変更は必ずしもきれいに適用できるとは限りません。rebase
パッチが適用されないコミットに遭遇すると、マージの場合と同じように競合が発生し、それらを解決してから実行して移動するように求められますgit rebase --continue
。
うまくいけば、これが本当にマージ操作であることが理にかなっています。ここにはいくつかの実装の詳細がありますが、結果として、gitは可能な限りマージ機能を利用します。最終的には169a6を移植してe57cfにしますが、コミットe57cfの内容は、169a6とda985をマージすることで作成できます。つまり、共通の祖先a47c3があるため、3方向のマージが可能です。これにより、リベースは、競合が発生すると予想される場合に、競合を回避できます。
実装の詳細、興味がある場合:デフォルトでは、rebaseはgit-format-patch
diffを作成するために使用git-am
し、--3way
オプションを使用してそれらを適用し、「パッチが想定されるblobのIDを記録する場合は、3方向マージにフォールバックします。適用するために、それらのブロブをローカルで利用できます。」内部でマージ戦略を使用するようにrebaseに指示することもできます。その場合、マージ戦略を直接呼び出します(デフォルトでは再帰的)。いずれにせよ、単にパッチをダンプして単純に適用するよりも洗練されています。
(その最後の段落は、半分はメモリから、半分はgit-rebaseのソースをスキミングすることからのものであり、深夜です。より知識のある人が起こった場合は、誤りや脱落を修正してください。)