тл; д-р
Правильний синтаксис перебазуватися 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
після перебазуватися завершення.