Ответы:
Выбор вишни в Git означает выбрать коммит из одной ветви и применить его к другой.
Это контрастирует с другими способами, такими как merge
и rebase
которые обычно применяют много коммитов к другой ветви.
Убедитесь, что вы находитесь в той ветке, к которой хотите применить коммит.
git checkout master
Выполните следующее:
git cherry-pick <commit-hash>
NB:
Если вы выбираете вишню из публичной ветки, вы должны рассмотреть возможность использования
git cherry-pick -x <commit-hash>
Это создаст стандартизированное сообщение о коммите. Таким образом, вы (и ваши коллеги) по-прежнему можете отслеживать происхождение фиксации и избежать конфликтов слияния в будущем.
Если у вас есть примечания, прикрепленные к коммиту, они не следуют за вишней. Чтобы их перенести, вы должны использовать:
git notes copy <from> <to>
Дополнительные ссылки:
git cherry-pick -x <commit-hash>
. Это создаст стандартизированное сообщение о коммите. Таким образом, вы (и ваши коллеги) по-прежнему можете отслеживать происхождение фиксации и избежать конфликтов слияния в будущем.
git notes copy <from> <to>
чтобы привести их также.
"cherry-pick commit applies the changes introduced by the named commit on the current branch"
Большинства PPL склонны думать о коммите как об изменениях (как svn был iirc), но это не так, каждый коммит ссылается на полное рабочее дерево. Хотя в этом случае это не имеет значения, оно может помочь понять, почему git работает так, как работает.
Эта цитата взята из; Контроль версий с помощью Git (Действительно отличная книга, я рекомендую вам купить ее, если вы заинтересованы в git)
Изменить: Поскольку этот ответ все еще производит впечатление, я хотел бы добавить очень хороший в действии видеоурок об этом:
Youtube: Введение в Git cherry-pick
Использование git cherry-pick Команда git cherry-pick commit применяет изменения, внесенные именованным коммитом в текущую ветку. Это введет новый, отличный коммит. Строго говоря, использование git cherry-pick не меняет существующую историю в репозитории; вместо этого это добавляет к истории. Как и в случае с другими операциями Git, которые вносят изменения через процесс применения diff, вам может потребоваться разрешить конфликты, чтобы полностью применить изменения из данного коммита . Команда git cherry-pick обычно используется для введения определенных коммитов из одной ветки в хранилище в другую ветку. Обычно используется пересылка или резервирование коммитов из ветви обслуживания в ветку разработки.
$ git checkout rel_2.3
$ git cherry-pick dev~2 # commit F, above
перед:
после:
Сбор вишни в Git предназначен для применения некоторого коммита из одной ветви в другую. Это может быть сделано, если вы, например. допустил ошибку и совершил изменение в неправильную ветку, но не хочет объединять всю ветку. Вы можете просто например. Верните коммит и выберите его в другой ветке.
Чтобы его использовать, вам просто нужно git cherry-pick hash
, где hash
находится хеш коммита из другой ветки.
Для полной процедуры см .: http://technosophos.com/2009/12/04/git-cherry-picking-move-small-code-patches-across-branches.html
Краткий пример ситуации, когда вам нужно вишня выбрать
Рассмотрим следующий сценарий. У вас есть две ветви.
а) релиз1 - эта ветка отправляется вашему клиенту, но все еще есть ошибки, которые нужно исправить.
б) master - классическая мастер-ветка, где вы можете, например, добавить функциональность для release2.
СЕЙЧАС : Вы исправляете что-то в release1 . Конечно, вам нужно это исправить также в мастере . И это типичный случай для сбора вишни. Таким образом, выбор вишни в этом сценарии означает, что вы берете коммит из ветки release1 и включаете его в основную ветку.
cherry-pick - это особенность Git. Если кто-то хочет зафиксировать определенные коммиты в одной ветви для целевой ветви, то используется cherry-pick.
мерзавец вишни подобрать шаги, как показано ниже.
git cherry-pick <commit id>
Здесь commit id - это идентификатор активности другой ветви. Например.
git cherry-pick 9772dd546a3609b06f84b680340fb84c5463264f
Я подготовил пошаговые иллюстрации того, что делает cherry-pick - и анимацию этих иллюстраций (ближе к концу).
Замечания:
Фиксация L'
- это с точки зрения пользователя (commit = snapshot) точная копия коммита L
.
Технически (внутренне), это новый, другой коммит (потому что, например, L
содержит указатель на K
(как его родитель), в то время как L'
содержит указатель на E
).
Вы можете подумать, что вишневый пик подобен перебазированию, или, скорее, он управляется как перебаз. Под этим я подразумеваю, что он берет существующий коммит и регенерирует его, принимая в качестве отправной точки голову ветки, в которой вы находитесь.
A rebase
принимает коммит, у которого есть родительский X, и регенерирует коммит, как если бы у него был родительский Y, и это именно то, чтоcherry-pick
делает .
Cherry pick - больше о том, как вы выбираете коммиты. С помощью pull
(rebase) git неявно регенерирует ваши локальные коммиты поверх того, что тянется к вашей ветке, но сcherry-pick
вами явно выбирают некоторые и неявно регенерируют их (их) поверх вашей текущей ветки.
Таким образом, то, как вы делаете это, отличается, но под капотом они очень похожи операции - регенерация коммитов.
cherry-pick
ведет себя так, как это происходит, когда целевая ветвь позже сливается обратно с исходной ветвью. Спасибо, сэр.
Это как Копировать (откуда-то) и Вставить (куда-то), но для конкретных коммитов.
Например, если вы хотите сделать оперативное исправление, вы можете использовать эту cherry-pick
функцию.
Делайте cherry-pick
это в ветке разработки, а затем merge
фиксируйте ветку релиза. Аналогично, сделайте переход cherry-pick
от ветки релиза к мастеру. Вуаля
Когда вы работаете с командой разработчиков над проектом, управление изменениями между несколькими ветками git может стать сложной задачей. Иногда вы не хотите объединять целую ветку в другую, и вам нужно только выбрать один или два конкретных коммита. Этот процесс называется «сбор вишни».
Нашел отличную статью о сборке вишни, за подробностями обращайтесь к ней : https://www.previousnext.com.au/blog/intro-cherry-picking-git
Если вы хотите объединить без коммитов, вы можете использовать эту команду
git cherry-pick master~2 master~0
Приведенная выше команда объединит последние три коммита мастера с 1 по 3
Если вы хотите сделать это для одного коммита, просто удалите последний вариант
git cherry-pick master~2
Таким образом, вы объедините 3-й коммит с конца мастера.
Он будет применять определенный коммит к вашей текущей ветке.
Это означает :
Пример: рассмотрим коммит А
added newFileA
modified main:
+ import './newFileA'
совершить B
added newFileB
modified main:
+ import './newFileB'
Если вы выберете коммит B на другой ветке, вы получите:
/newFileB
/main :
import './newFileA'
import './newFileB'
Так как commit B содержит newFileB и main , но не newFileA , что приводит к ошибке, поэтому используйте с осторожностью.
Выдержка из официальных документов:
Учитывая один или несколько существующих коммитов, примените изменения, которые вносит каждый из них, записав новый коммит для каждого. Это требует, чтобы ваше рабочее дерево было чистым (без изменений из коммита HEAD).
Когда не очевидно, как применить изменение, происходит следующее:
Текущая ветка и указатель HEAD остаются на последнем успешно выполненном коммите.
Ссылка CHERRY_PICK_HEAD указывает на коммит, который внес изменение, которое трудно применить.
Пути, в которых корректно применены изменения, обновляются как в файле индекса, так и в вашем рабочем дереве.
Для конфликтующих путей индексный файл записывает до трех версий, как описано в разделе «TRUE MERGE» в git-merge. Файлы рабочего дерева будут содержать описание конфликта, заключенного в скобки с помощью обычных маркеров конфликта <<<<<<< и >>>>>>>.
Никаких других изменений не сделано.