З часу, коли git cherry-pick
навчився застосовувати декілька комітетів, розмежування справді стало суперечливим, але це можна назвати конвергентною еволюцією ;-)
Справжня відмінність полягає в оригінальному намірі створити обидва інструменти:
git rebase
Його завдання полягає в тому, щоб переадресувати низку змін, які розробник має у своєму приватному сховищі, створеному проти версії X якоїсь гілки вище за течією, до версії Y цієї ж гілки (Y> X). Це ефективно змінює базу цієї серії зобов'язань, отже, "звільнення".
(Це також дозволяє розробнику пересадити серію комісій на будь-яку довільну комісію, але це менш очевидно.)
git cherry-pick
- це переведення цікавого завдання з однієї лінії розвитку в іншу. Класичний приклад - це підтримка виправлень безпеки, зроблених на нестабільній гілці розвитку, до стабільної (обслуговуючої) гілки, де merge
немає сенсу, оскільки це може принести чимало небажаних змін.
З моменту своєї першої появи git cherry-pick
він зміг вибрати декілька комітетів одночасно.
Отже, можливо, найяскравіша різниця між цими двома командами полягає в тому, як вони поводяться з гілкою, над якою вони працюють: git cherry-pick
зазвичай приносить команду з іншого місця та застосовує її поверх вашої поточної гілки, записуючи нову фіксацію, при цьому git rebase
бере вашу поточну гілку та переписує серія власних підказок вчиняється так чи інакше. Так, це сильно натягнутий опис того, що git rebase
можна зробити, але навмисно намагатися зробити загальну ідею зануреною.
Оновлення для подальшого пояснення прикладу використання git rebase
обговорюваного.
Враховуючи цю ситуацію,
Книга зазначає:
Однак є й інший спосіб: ви можете взяти виправлення зміни, яка була введена в C3, і повторно застосувати її поверх C4. У Git це називається перезаписом. За допомогою команди rebase ви можете прийняти всі зміни, які були зроблені на одній гілці, і застосувати їх до іншої.
У цьому прикладі ви виконаєте наступне:
$ git checkout experiment
$ git rebase master
First, rewinding head to replay your work on top of it...
Applying: added staged command
"Улов" тут полягає в тому, що в цьому прикладі гілка "експерименту" (предмет для повторного звільнення) спочатку була відхилена від "ведучої" гілки, і, отже, вона ділиться здійснює C0 через C2 з нею - ефективно, "експеримент" є " master "до C2, включаючи C2 плюс виконувати C3 поверх нього. (Це найпростіший можливий випадок; звичайно, "експеримент" може містити кілька десятків комітів поверх своєї первісної бази.)
Тепер git rebase
сказано перезавантажити "експеримент" на поточну підказку "майстра", і git rebase
йде так:
- Запускається,
git merge-base
щоб побачити, яке останнє зобов’язання ділиться як "експериментом", так і "майстром" (який сенс відхилення, іншими словами). Це С2.
- Економить усі зобов’язання, зроблені з моменту відхилення; у нашому прикладі іграшок це просто C3.
- Перемотайте HEAD (що вказує на наконечник "експерименту" перед запуском операції), щоб вказати на підказку "master" - ми переходимо на нього.
- Намагається застосувати кожну із збережених комісій (як би з
git apply
) у порядку. У нашому прикладі іграшок це лише одна фіксація, C3. Скажімо, його додаток призведе до створення C3 '.
- Якщо все пішло добре, посилання "експеримент" оновлюється, щоб вказувати на фіксацію, отриману в результаті застосування останнього збереженого комітету (C3 'в нашому випадку).
Тепер повернемось до вашого питання. Як бачите, тут технічно git rebase
справді пересаджується серія комітетів від "експерименту" до кінця "майстра", тож ви з правом можете сказати, чи справді є "інша галузь" у процесі. Але суть у тому, що наконечник від "експерименту" в кінцевому підсумку став новим наконечником в "експерименті", він просто змінив свою базу:
Знову ж таки, технічно ви можете сказати, що git rebase
тут включені певні комітети від "майстра", і це абсолютно правильно.