Тематичне рішення
Правильною командою для відповіді на розміщене запитання може бути будь-яке з наступних (припускаючи, що гілка 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?