тл; д-р
Правильний синтаксис перебазуватися 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 - до 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>.
Ще один сценарій, коли це стане в нагоді, - це коли ви хочете швидко видалити деякі комісії з поточної гілки без необхідності робити інтерактивну базу даних :
Before After
A---B---C---E---F (HEAD) A---B---F (HEAD)
У цьому прикладі для того, щоб видалити Cта Eз послідовності, яку ви б сказали git rebase --onto B E, або перезавантажити HEADповерх того, Bде був старий батьків E.
The Surgeon: git rebase - до 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, що означає:
Rebase діапазон коммітов , чий батько Dдо Hзверху F.
Потім стає синтаксисом git rebase --ontoз діапазоном комітівgit rebase --onto <newparent> <oldparent> <until> . Хитрість тут пам'ятати , що фіксація посилається <until>буде включений в діапазон і стане новим HEADпісля перебазуватися завершення.