Что означает "выбор вишни" с помощью Git?

Недавно мне было предложено cherry-pick коммит.

Так что же означает выбор вишни в git? Как ты делаешь это?

Ответ 1

Выбор вишни в Git означает выбрать коммит из одной ветки и применить его к другой.

Это контрастирует с другими способами, такими как merge и rebase которые обычно применяют множество коммитов к другой ветки.

  1. Убедитесь, что вы находитесь в той ветке, к которой хотите применить коммит.

    git checkout master
    
  2. Выполните следующее:

    git cherry-pick <commit-hash>
    

NB:

  1. Если вы выбираете вишню из публичной ветки, вы должны рассмотреть возможность использования

    git cherry-pick -x <commit-hash>
    

    Это создаст стандартизированное сообщение о коммите. Таким образом, вы (и ваши коллеги) по-прежнему можете отслеживать происхождение фиксации и в будущем избежать конфликтов слияния.

  2. Если у вас есть примечания, прикрепленные к коммиту, они не следуют за вишней. Чтобы их перенести, вы должны использовать:

    git notes copy <from> <to>
    

Дополнительные ссылки:

Ответ 2

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

Изменение: так как этот ответ все еще производит впечатление, я хотел бы добавить очень хороший в видео урок об этом:

Youtube: Введение в Git cherry-pick

Использование git cherry-pick Команда git cherry-pick commit применяет изменения, внесенные именованным коммитом в текущую ветку. Это введет новый, отличный коммит. Строго говоря, использование git cherry-pick не меняет существующую историю в репозитории; вместо этого это добавляет к истории. Как и в случае других операций Git, которые вносят изменения через процесс применения diff, вам может потребоваться разрешить конфликты, чтобы полностью применить изменения из данного коммита. Команда git cherry-pick обычно используется для введения определенных коммитов из одной ветки в хранилище в другую ветку. Обычно используется forward- или резервирование коммитов из ветки обслуживания в ветку разработки.

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

до: before

после: after

Ответ 3

Выбор черри в Git предназначен для применения некоторой фиксации из одной ветки в другую ветвь. Это можно сделать, если вы, например. совершил ошибку и совершил переход в неправильную ветку, но не хочет объединять всю ветвь. Вы можете просто напр. верните фиксацию и вишню в другую ветку.

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

Для полной процедуры см.: http://technosophos.com/2009/12/04/git-cherry-picking-move-small-code-patches-across-branches.html

Ответ 4

Краткий пример ситуации, когда вам нужно вишня выбрать

Рассмотрим следующий сценарий. У вас есть две ветки.

a) release1 - эта ветка отправляется вашему клиенту, но есть еще ошибки, которые нужно исправить.

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

СЕЙЧАС: Вы исправляете что-то в release1. Конечно, вам нужно это исправить также в мастере. И это типичный случай для сбора вишни. Таким образом, выбор вишни в этом сценарии означает, что вы берете коммит из ветки release1 и включаете его в основную ветку.

Ответ 5

cherry-pick - это функция Git. Если кто-то хочет совершить определенные коммиты в одной ветки на целевую ветку, то используется вишня-выбор.
git-cherry-pick шаги, как показано ниже.

  1. checkout (перейти к) целевой ветки.
  2. git cherry-pick <commit id>
    

    Здесь commit id - идентификатор активности другой ветки.Eg.

    git cherry-pick 9772dd546a3609b06f84b680340fb84c5463264f
    
  3. нажимать на целевую ветку

Перейдите на страницу https://git-scm.com/docs/git-cherry-pick

Ответ 7

Вы можете думать, что вишня выбирается как похожая на фальсификацию, или, скорее, она управляется как перебаза. Под этим я подразумеваю, что он принимает существующую фиксацию и регенерирует ее, как отправную точку, руководителя ветки, в которой вы сейчас находитесь.

rebase принимает фиксацию, у которой был родитель X, и регенерирует фиксацию, как если бы на самом деле был родитель Y, и это именно то, что делает cherry-pick.

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

Таким образом, как вы это делаете, он отличается, но под капотом они очень похожи на операции - регенерация коммитов.

Ответ 8

Это вроде Скопировать (откуда-то) и Вставить (где-то), но для конкретных коммитов.

Например, если вы хотите сделать горячее исправление, вы можете использовать функцию cherry-pick.

Сделайте свою cherry-pick в ветке разработки и merge ее с веткой релиза. Точно так же сделайте cherry-pick из ветки релиза, чтобы овладеть. Вуаля

Ответ 9

Когда вы работаете с командой разработчиков над проектом, управление изменениями между несколькими ветками git может стать сложной задачей. Иногда вы не хотите объединять целую ветку в другую, и вам нужно только выбрать один или два конкретных коммита. Этот процесс называется "сбор вишни".

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

Ответ 10

Если вы хотите объединить без идентификаторов коммитов, вы можете использовать эту команду

git cherry-pick master~2 master~0

Приведенная выше команда объединит последние три коммита мастера с 1 по 3

Если вы хотите сделать это для одного коммита, просто удалите последний вариант

git cherry-pick master~2

Таким образом, вы объедините 3-й коммит с конца мастера.

Ответ 11

Я подготовил пошаговые иллюстрации того, что делает cherry-pick - и анимацию этих иллюстраций (ближе к концу).

  1. До сбора вишни
    (мы собираемся сделать вишню коммита L из ветки feature): enter image description here

  1. Запуск команды git cherry-pick feature~2
    (feature~2 - это 2 nd коммита до
    feature, то есть коммит L): enter image description here

  1. После выполнения команды (git cherry-pick feature~2): enter image description here

То же анимация: enter image description here


Примечание:

Фиксация L' с точки зрения пользователя (commit = snapshot) является точной копией фиксации L.
Технически (внутренне) это новая, другая фиксация (например, L содержит указатель на K, а L' содержит указатель на E).