1

これは、リベースのアイデアを説明するA VisualGitReferenceからのキャプチャです。

http://a.imageshack.us/img339/4264/screenshot20100903at102.png

私の理解は次のとおりです。

  • gitは変更を追跡しているため、169a6と2c33aはコミットa47c3からの変更を(追跡し)ます。
  • リベースとは、da985に変更を適用することを意味します。その結果、f7e63にはb325cからe57cfへのすべての変更があります(追跡します)。

質問。

  • 私の理解は正しいですか?
  • もしそうなら、169a6と2c33aの変更がコミットda985で(安全に)適用できることをどのように確認できますか?
  • そうでない場合は、リベースが何をするのか説明できますか?
4

1 に答える 1

5

あなたがあなたの理解を表現した方法は私を少し混乱させました。私はあなたがそれを正しく持っているかもしれないと思います、しかしあなたがそうでない場合に備えて、これが私が一般的にそれを考える方法です。リベースすると、gitはこれらの2つのコミットを取得し、それらを新しいベースに適用しようとします。e57cfは、169a6のdiffを適用した結果です。つまり、単純な理想的なケースではgit diff a46c3 169a6git diff da985 e57cf同じ出力を生成するはずです。同様に、f7e63には2c33aと同じ変更が含まれている必要があります。それが助けになるなら、あなたは「リベース」を「移植」の同義語と考えることができます。

現在、変更は必ずしもきれいに適用できるとは限りません。rebaseパッチが適用されないコミットに遭遇すると、マージの場合と同じように競合が発生し、それらを解決してから実行して移動するように求められますgit rebase --continue

うまくいけば、これが本当にマージ操作であることが理にかなっています。ここにはいくつかの実装の詳細がありますが、結果として、gitは可能な限りマージ機能を利用します。最終的には169a6を移植してe57cfにしますが、コミットe57cfの内容は、169a6とda985をマージすることで作成できます。つまり、共通の祖先a47c3があるため、3方向のマージが可能です。これにより、リベースは、競合が発生すると予想される場合に、競合を回避できます。

実装の詳細、興味がある場合:デフォルトでは、rebaseはgit-format-patchdiffを作成するために使用git-amし、--3wayオプションを使用してそれらを適用し、「パッチが想定されるblobのIDを記録する場合は、3方向マージにフォールバックします。適用するために、それらのブロブをローカルで利用できます。」内部でマージ戦略を使用するようにrebaseに指示することもできます。その場合、マージ戦略を直接呼び出します(デフォルトでは再帰的)。いずれにせよ、単にパッチをダンプして単純に適用するよりも洗練されています。

(その最後の段落は、半分はメモリから、半分はgit-rebaseのソースをスキミングすることからのものであり、深夜です。より知識のある人が起こった場合は、誤りや脱落を修正してください。)

于 2010-09-04T04:13:51.150 に答える