tl; dr
あなたのケースBでのA使用git rebase --ontoに基づいてリベースする正しい構文は次のとおりです:
git checkout B
git rebase --onto A B^
または、またはで参照されている親であるコミットから開始することに基づいてリベースBしABます。B^B~1
との違いに興味があるならgit rebase <branch>、git rebase --onto <branch>読んでください。
クイック:git rebase
git rebase <branch>あなたが現在で参照される、チェックアウトしたブランチリベースうとしているHEAD上に、最新のは、それが到達可能であるコミットから<branch>しかしではないからHEAD。
これは、リベースの最も一般的なケースであり、間違いなく、前もって計画を立てる必要が少ないケースです。
Before After
A---B---C---F---G (branch) A---B---C---F---G (branch)
\ \
D---E (HEAD) D---E (HEAD)
この例では、FおよびGからは到達可能ですbranchがからは到達できないコミットですHEAD。言っgit rebase branchかかりますD最初の分岐点の後にコミットされており、その、それをリベース(すなわち、その親を変更から到達可能なコミット)最新の上branchではなく、からHEADです、G。
正確:git rebase --ontoに2つの引数
git rebase --onto特定のコミットからリベースすることができます。これにより、リベースする対象と場所を正確に制御できます。これは、正確である必要があるシナリオ用です。
たとえば、から始めてHEAD正確にリベースする必要があるとしましょう。作業ブランチに取り込むことにのみ関心がありますが、同時に、互換性のない変更が含まれているため、保持したくありません。FEFD
Before After
A---B---C---F---G (branch) A---B---C---F---G (branch)
\ \
D---E---H---I (HEAD) E---H---I (HEAD)
この場合、私達は言うでしょうgit rebase --onto F D。これの意味は:
HEAD親がのD上にいる到達可能なコミットをリベースしFます。
つまり、の親をEからDに変更しFます。次に、の構文はgit rebase --ontoですgit rebase --onto <newparent> <oldparent>。
これが役立つもう1つのシナリオは、インタラクティブなリベースを行わずに、現在のブランチからいくつかのコミットをすばやく削除する場合です。
Before After
A---B---C---E---F (HEAD) A---B---F (HEAD)
この例では、シーケンスから削除しCたりE、シーケンスから削除したりするには、と言うgit rebase --onto B Eか、古い親があった場所のHEAD上にリベースします。BE
外科医:git rebase --ontoと3つの引数
git rebase --onto精度の面でさらに一歩先を行くことができます。実際、任意の範囲のコミットを別のコミットの上にリベースすることができます。
次に例を示します。
Before After
A---B---C---F---G (branch) A---B---C---F---G (branch)
\ \
D---E---H---I (HEAD) E---H (HEAD)
この場合、現在のポイントを無視して、正確な範囲E---Hをの上にリベースします。我々は言ってそれを行うことができ、その手段は:FHEADgit rebase --onto F D H
親であるコミットの範囲リベースDまでHの上をF。
構文git rebase --ontoとコミットの範囲は、次になりgit rebase --onto <newparent> <oldparent> <until>。トリックはここで参照されるコミットすることを思い出している<until>されて含ま範囲で、新たなになりますHEADリベースが完了した後。