Пропустимо --onto
на мить. upstream
і branch
є досить базовими, насправді начебто мімічними checkout
і branch
- другий аргумент необов’язковий:
git branch <newbranch>
git branch <newbranch> <base>
git checkout -b <newbranch>
git checkout -b <newbranch> <base>
git rebase <upstream>
git rebase <upstream> <branch>
( За винятком, імена цих аргументів в rebase
«вгору» і «гілки» не надто описовий IMO я зазвичай думаю про них , як peachoftree ,. <start>
І <end>
, що , як я буду використовувати їх: git rebase <start> <end>
)
Коли другу гілку опущено, результат майже такий же, як спочатку перевірити цю гілку, а потім зробити це так, як ніби ви її не вказали. Виняток - це те, branch
що не змінює поточну галузь:
git checkout <base> && git branch <newbranch> && git checkout <previous_branch>
git checkout <base> && git checkout -b <newbranch>
git checkout <end> && git rebase <start>
Що стосується розуміння того, що rebase
робить, коли викликається, я спершу почав думати про це як про особливий тип злиття. Це насправді не так, але це допомогло, коли вперше почали розуміти базу даних. Позичити приклад гороху:
A--B--F--G master
\
C--D--E feature
А git merge master
результати в цьому:
A--B--F-----G master
\ \
C--D--E--H feature
Хоча git rebase master
(поки на гілці feature
!) Це призводить до цього:
A--B--F--G master
\
C'--D'--E' feature
В обох випадках feature
тепер міститься код і з master
і feature
. Якщо ви не ввімкнено feature
, другий аргумент можна використовувати для переключення на нього як ярлик: git rebase master feature
зробить те саме, що і вище.
Тепер для спец --onto
. Важлива частина, яку слід пам’ятати при цьому, - це те, що він за замовчуванням, <start>
якщо не вказано. Отже вище, якби я --onto
конкретно вказав , це призведе до того ж:
git rebase --onto master master
git rebase --onto master master feature
(Я не використовую --onto
без вказівки <end>
просто тому, що простіше розумово розібратися, навіть подумав, що ці двоє однакові, якщо вже ввімкнено feature
.)
Щоб зрозуміти, чому --onto
корисно, ось інший приклад. Скажімо, я ввімкнув feature
і помітив помилку, яку я потім почав виправляти - але відключився feature
замість master
помилки:
A--B--F--G master
\
C--D--E feature
\
H--I bugfix
Мені хочеться "перемістити" ці зобов'язання, bugfix
щоб вони більше не залежали feature
. Як це є, будь-який тип злиття або відновлення, показаний вище у цій відповіді, буде приймати три feature
коміти разом з двома bugfix
комітами.
Наприклад, git rebase master bugfix
неправильно. Діапазон, <start>
який <end>
трапляється, включає всі feature
комісії з , які відтворюються поверх master
:
A--B--F--G master
\ \
\ C'--D'--E'--H'--I' bugfix
\
C--D--E feature
Те , що ми на самому ділі хочемо діапазон коммітов від feature
до bugfix
переграється на вершині master
. Саме для цього --onto
потрібно вказати іншу ціль "повтор", ніж гілка "пуск":
git rebase --onto master feature bugfix
A--B--F--G master
\ \
\ H'--I' bugfix
\
C--D--E feature