tl; dr
あなたのケースB
でのA
使用git rebase --onto
に基づいてリベースする正しい構文は次のとおりです:
git checkout B
git rebase --onto A B^
または、またはで参照されている親であるコミットから開始することに基づいてリベースB
しA
B
ます。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
正確にリベースする必要があるとしましょう。作業ブランチに取り込むことにのみ関心がありますが、同時に、互換性のない変更が含まれているため、保持したくありません。F
E
F
D
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
上にリベースします。B
E
外科医: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
をの上にリベースします。我々は言ってそれを行うことができ、その手段は:F
HEAD
git rebase --onto F D H
親であるコミットの範囲リベースD
までH
の上をF
。
構文git rebase --onto
とコミットの範囲は、次になりgit rebase --onto <newparent> <oldparent> <until>
。トリックはここで参照されるコミットすることを思い出している<until>
されて含ま範囲で、新たなになりますHEAD
リベースが完了した後。