Тематичне рішення
Правильною командою для відповіді на розміщене запитання може бути будь-яке з наступних (припускаючи, що гілка topic
вже перевірена):
git rebase --onto B master
git rebase --onto master~1 master
git rebase --onto B A
git rebase --onto B C
git rebase --onto B
Якщо topic
це не встановлено, ви просто додаєте topic
до команди (крім останньої) так:
git rebase --onto B master topic
Як варіант, спочатку ознайомтеся з відділенням:
git checkout topic
Обновіть будь-які рядки комісій для цільового комітету
Основна форма команди, яка нам потрібна, прошита з документації, - це:
git rebase --onto <Target> [<Upstream> [<Branch>]]
<Branch>
необов’язково, і все, що він робить, - це перевірити вказану гілку перед виконанням решти команди. Якщо ви вже перевірили галузь, яку хочете відновити, тоді вам це не потрібно. Зауважте, що ви повинні вказати <Upstream>
, щоб вказати, <Branch>
чи git вважатиме, що ви вказуєте <Upstream>
.
<Target>
це зобов'язання, до якого ми будемо приєднувати наш ряд рядків. Надаючи назву філії, ви просто вказуєте команду голови цієї гілки. <Target>
може бути будь-яка комісія, яка не міститиметься в рядку переміщених комісій. Наприклад:
A --- B --- C --- D master
\
\-- X --- Y --- Z feature
Щоб перемістити всю гілку функції, ви не можете вибрати X
, Y
, Z
або feature
як <Target>
так як ті всі коммітов всередині групи переміщення.
<Upstream>
є особливим, оскільки може означати дві різні речі. Якщо це коміт, який є родоначальником перевіреної гілки, то він служить точкою зрізу. У цьому прикладі я представив, це було б нічого , що ні C
, D
або master
. Усі зобов’язання після закінчення, <Upstream>
поки керівник перевіреного відділення не буде переміщений.
Однак, якщо <Upstream>
це не пращур, то git створює резервну копію ланцюга від зазначеної фіксації до тих пір, якщо не знайде спільного предка з перевіреною гілкою (і скасовує, якщо її не може знайти). У нашому випадку, <Upstream>
з B
, C
, D
або master
буде весь результат фіксації , B
виступаючим в якості точки розрізу. <Upstream>
сама по собі є необов'язковою командою, і якщо вона не вказана, то git дивиться на батьківську адресу перевіреної гілки, що є еквівалентом введення master
.
Тепер, коли git вибрав комітети, які він скоротить і перемістить, він застосовує їх для того, щоб <Target>
пропустити всі, які вже застосовані до цілі.
Цікаві приклади та результати
Використовуючи цю вихідну точку:
A --- B --- C --- D --- E master
\
\-- X --- Y --- Z feature
git rebase --onto D A feature
Буде чи застосовуватися фіксацій B
, C
, X
, Y
, Z
зробити D
і в кінцевому підсумку пропуск B
і C
тому , що вони вже були застосовані.
git rebase --onto C X feature
Застосовуватиме зобов’язання Y
та Z
виконувати зобов'язання C
, ефективно видаляючи комісіюX
git checkout B
перед бігомgit rebase
?