Що означає збирання вишні з Git?


2336

Нещодавно мене попросили cherry-pickзробити комісію.

Отже, що означає вишня вибору в git? Як ви це робите?


13
Замість злиття з вишневим набором повторне введення з гілки на цільову гілку (наприклад: майстер) легше.
Левент Дівіліоглу

Відповіді:


2855

Вибір вишні в Git означає вибрати зобов’язання з однієї гілки та застосувати її до іншої.

Це на відміну від інших способів, таких як mergeта, rebaseякі зазвичай застосовують багато комісій до іншої гілки.

  1. Переконайтеся, що ви перебуваєте на гілці, до якої ви хочете застосувати зобов'язання.

    git checkout master
    
  2. Виконайте наступне:

    git cherry-pick <commit-hash>
    

Примітка:

  1. Якщо ви збираєте вишню з громадського відділення, вам варто подумати про використання

    git cherry-pick -x <commit-hash>
    

    Це створить стандартизоване повідомлення про фіксацію. Таким чином, ви (та ваші колеги) все ще можете відслідковувати походження зобов’язань і, можливо, уникнути конфліктів злиття в майбутньому.

  2. Якщо у вас є прикріплені нотатки до комітету, вони не дотримуються вишні. Щоб їх також передати, Ви повинні використовувати:

    git notes copy <from> <to>
    

Додаткові посилання:


246
Якщо ви збираєте вишню з громадського відділення, вам варто скористатися git cherry-pick -x <commit-hash>. Це створить стандартизоване повідомлення про фіксацію. Таким чином, ви (та ваші колеги) все ще можете відслідковувати походження зобов’язань і, можливо, уникнути конфліктів злиття в майбутньому.
MBober

2
Чи дійсно необхідний збір вишні? Чи не змішане скидання або м'яке скидання не виконають подібну роботу?
Nav

10
Зауважте, якщо у вас є нотатки, які додаються до комітету, вони не дотримуються вишні. Ви повинні використовувати їх, git notes copy <from> <to>щоб також їх переробити.
Zitrax

5
git push - це останній крок, щоб змінити майстер
почувати себе добре і програмувати

58
FYI: Комміт семантичний містить всі файли робочого дерева цього моменту (і здійснювати хеш з попереднього коммітов), так що ви не подаєте в цілому зробити інше зобов'язання, але зміни фіксації зробили на попередній фіксації "cherry-pick commit applies the changes introduced by the named commit on the current branch"Більшості ppl, як правило, сприймає фіксацію як зміни (як svn був iirc), але це не так, кожне командування відноситься до повного робочого дерева. Хоча це не має значення в цьому випадку, це може допомогти зрозуміти, чому git працює так, як це робиться.
Еміль Врійдагс

314

Ця цитата взята з; Контроль версій з Git (Дійсно чудова книга, я рекомендую придбати її, якщо вас цікавить git)

Редагувати: Оскільки ця відповідь все ще справляє враження, я хотів би додати дуже приємний у навчальному відео уроці про неї:

Youtube: Знайомство з Git cherry-pick

Використання git cherry-pick Команда git cherry-pick виконує зміни, внесені іменованим комітетом у поточну гілку. Він введе новий чіткий комітет. Строго кажучи, використання git cherry-pick не змінює існуючу історію в сховищі; натомість це додає до історії. Як і в інших операціях Git, які вносять зміни в процесі застосування розрізника, вам може знадобитися вирішити конфлікти, щоб повною мірою застосувати зміни даної комісії . Команда git cherry-pick зазвичай використовується для введення конкретних комірок з однієї гілки в сховищі до іншої гілки. Загальноприйнятим є використання для передачі або повернення порту від гілки технічного обслуговування до гілки розвитку.

$ git checkout rel_2.3
$ git cherry-pick dev~2 # commit F, above

перед: раніше

після: після


12
коли вибірні вишні приймаються на якусь гілку (b1) і пізніше передаються майстру. І якщо гілка b1 (з якої були обрані оригінали) також намагається доставити майстру. Як щодо конфліктів? Це опікується чи як це працює?
парашутизм

3
@parasrish Так, вони вже подбали про ваші попередні злиття. Отже, ви зробили зміни a, b, c, d з (b1) гілки. Вишня вибирала лише "с". Тоді в майбутньому, як тільки ви злитеся з (b1) в master, оскільки зміни "c" однакові, вони злиються лише a, b, d і залишаться "c" змінами. Але якщо ви відкажете злиття, то ви повернетесь до змін із "c" в ньому. Вам потрібно буде їх відкатати окремо.
Теоман шипахі

12
Слід підкреслити: У наведеному прикладі до Z застосовується лише різниця (F - E). Це вузький випадок. Вишневий вибір може бути використаний для застосування різниць декількох комітетів, скажімо, всіх відмінностей між двома суміжними комітами. Наприклад, слідуючи зверху, (F - E), (E - D), (D - C) і (C - B). Це еквівалентно застосуванню різниці (F - B).
Томас Бітонті

2
Також, що станеться, якщо вибраний Коміс (F у прикладі) має більше одного безпосереднього попередника?
Томас Бітонті

2
@ j2emanue іншими словами, вишневий вибір буде приймати зміни лише в останньому. Якщо ви здійснюєте 3 різні рази, і якщо ви вибираєте останній, він не вноситиме змін до першого та другого зобов’язань. Команда "Об'єднання" прийме всі ваші зміни та стосуватиметься вашої цільової (головної) гілки.
Теоман шипахі

157

Збір вишні в Git розроблений для того, щоб застосувати деяку комісію з однієї гілки в іншу. Це можна зробити, якщо ви, наприклад. допустив помилку і допустив перехід до неправильної гілки, але не хоче зливати всю гілку. Ви можете, наприклад, поверніть комітку і виберіть його на іншій гілці.

Щоб використовувати його, вам просто потрібно git cherry-pick hash, де hashзнаходиться хеш фіксації з іншої гілки.

Повну процедуру дивіться на веб-сайті: http://technosophos.com/2009/12/04/git-cherry-picking-move-small-code-patches-across-branches.html


96

Короткий приклад ситуації, коли вам потрібна вишня

Розглянемо наступний сценарій. У вас є дві гілки.

a) release1 - Ця філія збирається до вашого клієнта, але все ще є деякі помилки, які потрібно виправити.

б) master - класична гілка master, де ви можете, наприклад, додати функціональність для release2.

ЗАРАЗ : Ви виправляєте щось у випуску1 . Звичайно, вам потрібно це виправлення також у майстра . І це типовий випадок для збору вишні. Тож вибір вишні у цьому сценарії означає, що ви берете на себе зобов’язання з випуску1 і включаєте його у головну гілку.


3
Можливо, вам просто знадобиться інший шлях. Ви виправили помилку в майстрі, і вам слід вишнево вибрати це для випуску1. Також вони можуть бути сховищами, а не гілками
canbax

1
Чому не використовуйте для цього злиття?
FreeLightman

Я б: створити відгалуження випуску, виправити його у гілці, об'єднати гілку у випуску, об'єднати випуск у master.
Джаспер-М

57

вишневий пік - це функція Git. Якщо хтось хоче виконати певні зобов’язання в одній гілці до цільової гілки, тоді використовується вишня.
кроки вибору вишні, як показано нижче.

  1. замовлення (перехід на) цільову гілку.
  2. git cherry-pick <commit id>
    

    Тут ID ідентифікатора - ідентифікатор діяльності іншої гілки.Напр.

    git cherry-pick 9772dd546a3609b06f84b680340fb84c5463264f
    
  3. натиснути на цільову гілку

Відвідайте https://git-scm.com/docs/git-cherry-pick


43

Я підготував покрокові ілюстрації того, що робить вишня - і анімацію цих ілюстрацій (ближче до кінця).

  1. Перед тим, як збирати вишню
    (ми збираємось зробити вишневий комітет Lз гілки feature): введіть тут опис зображення

  1. Запуск команди git cherry-pick feature~2
    (чи feature~2є другий фіксатор раніше
    feature, тобто фіксація L): введіть тут опис зображення

  1. Після виконання команди ( git cherry-pick feature~2): введіть тут опис зображення

Це ж анімоване: введіть тут опис зображення


Примітка:

Здійснення фіксації L'- це з точки зору користувача (commit = знімок) точна копія L.

Технічно (внутрішньо) це нова, інша фіксація (тому що, наприклад, Lмістить вказівник на K(як її батьків), а L'містить вказівник на E).


Це означає, що L 'буде N -> M -> L для головного відділення? або це викличе виключно L на
головній

1
@PriyankThakkar, так, виключно L , нічого іншого (як видно з малюнків / анімації).
MarianD

22

Ви можете подумати, якщо вишневий набір схожий на ребазування, а точніше, він керується як ребаз. Маючи на увазі, я маю на увазі, що він приймає існуючий комітет і відновлює його, приймаючи за вихідний пункт керівника філії, на якій ви зараз перебуваєте.

A rebaseприймає команду, яка мала батьківський X, і регенерує команду так, ніби вона насправді мала батьківський Y, і саме це cherry-pickробить a .

Вишневий вибір - це більше про те, як ви вибираєте товари. З допомогою pull(rebase) git неявно відновлює ваші локальні комітети на основі того, що було потягнуто до вашої гілки, але cherry-pickви чітко вибираєте деякі фіксації (і) та неявно відновлюєте їх (їх) поверх вашої поточної гілки.

Тож те, як ви це робите, відрізняється, але під кришкою вони дуже схожі операції - регенерація комітів.


1
Я вважаю це дуже корисним оглядом речей. Це означає, чому cherry-pickповодиться так, як це робиться, коли цільова гілка згодом об'єднується назад у вихідну гілку. Дякую вам сер.
Алуан Хаддад

3
Я хотів би використовувати вишню вибору замість git merge після того, як функція виконана. кожен завжди робить git merge feature_branch, коли завершує функцію. чому б не скористатися командою вишні? Чи маєте ви якісь думки? Чому турбуєтесь, коли
чиниться,

11

Це на зразок Copy (звідкись) і Paste (кудись), але для конкретних комісій.

Якщо ви хочете, наприклад, зробити виправлення, тоді ви можете скористатися cherry-pickфункцією.

Виконайте це cherry-pickу галузі розвитку, і mergeце зобов’язане випустити галузь. Точно так само зробіть cherry-pickз гілки випуску майстер. Вуаля


11

Коли ви працюєте з командою розробників над проектом, управління змінами між низкою гілок git може стати складним завданням. Іноді не хочеться об'єднати цілу гілку в іншу, а потрібно вибрати лише один або два конкретні коміти. Цей процес називається «збирання вишні».

Знайшов чудову статтю про збирання вишні, ознайомтесь із детальними деталями: https://www.previousnext.com.au/blog/intro-cherry-picking-git


7

Якщо ви хочете об'єднатися без ідентифікаторів комісій, ви можете скористатися цією командою

git cherry-pick master~2 master~0

Вищенаведена команда об'єднає три останні коміти від 1 до 3

Якщо ви хочете зробити це за один прихил, просто видаліть останню опцію

git cherry-pick master~2

Таким чином ви з’єднаєте третій комікс з кінця майстра.


Це заплутано. Я думаю, що ти тут на гілки, крім майстра, правда? І коли ви згадали про два коміти, ви посилаєтесь на <from> і <to> на зобов'язання, щоб визначити діапазон, який ви хочете вибрати. Правильно? Це дуже допоможе, якби описаний сценарій. Хороший додаток, хоча. Дякую.
Саурабх Патіл

6

Він застосує певну комісію до вашої поточної галузі.

Це означає :

  • всі файли, додані цим зобов’язанням, будуть додані
  • всі файли, видалені цим зобов’язанням, будуть видалені
  • всі файли, змінені цим зобов’язанням, будуть об'єднані. Це означає, що весь файл з комісії, а не лише зміни цього комітету!

Наприклад: Розглянемо вчинення A

added newFileA
modified main:
+ import './newFileA'

вчинити Б

added newFileB
modified main:
+ import './newFileB'

Якщо ви виберіть команду B на іншій гілці, ви закінчите:

/newFileB
/main :
   import './newFileA'
   import './newFileB'

оскільки команда B містить newFileB та main , але не newFileA , що призводить до помилок, тому використовуйте з обережністю.


0

Витяг з офіційних документів:

З огляду на один або декілька існуючих зобов’язань, застосуйте зміну, яку кожен вводить, записуючи нову комісію для кожного. Для цього потрібно, щоб ваше робоче дерево було чистим (жодних модифікацій, пов'язаних із заголовком HEAD).

Коли не очевидно, як застосувати зміни, відбувається таке:

  1. Поточна гілка та вказівник HEAD залишаються на останньому успішному виконанні.

  2. Посилання CHERRY_PICK_HEAD встановлюється в точці коміту, який вніс зміни, які важко застосувати.

  3. Шляхи, в яких чітко застосована зміна, оновлюються як у файлі індексу, так і у вашому робочому дереві.

  4. Для конфліктуючих шляхів файл індексу записує до трьох версій, як описано в розділі "TRUE MERGE" git-merge. Файли робочого дерева включатимуть опис конфлікту, закресленого звичайними маркерами конфліктів <<<<<<< та >>>>>>>.

Інші модифікації не вносяться.

Детальніше ...

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.