Что означает "выбор вишни" с помощью Git?
Недавно мне было предложено cherry-pick
коммит.
Так что же означает выбор вишни в git? Как ты делаешь это?
Ответы
Ответ 1
Выбор вишни в Git означает выбрать коммит из одной ветки и применить его к другой.
Это контрастирует с другими способами, такими как merge
и rebase
которые обычно применяют множество коммитов к другой ветки.
-
Убедитесь, что вы находитесь в той ветке, к которой хотите применить коммит.
git checkout master
-
Выполните следующее:
git cherry-pick <commit-hash>
NB:
-
Если вы выбираете вишню из публичной ветки, вы должны рассмотреть возможность использования
git cherry-pick -x <commit-hash>
Это создаст стандартизированное сообщение о коммите. Таким образом, вы (и ваши коллеги) по-прежнему можете отслеживать происхождение фиксации и в будущем избежать конфликтов слияния.
-
Если у вас есть примечания, прикрепленные к коммиту, они не следуют за вишней. Чтобы их перенести, вы должны использовать:
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
до:
после:
Ответ 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 шаги, как показано ниже.
- checkout (перейти к) целевой ветки.
-
git cherry-pick <commit id>
Здесь commit id - идентификатор активности другой ветки.Eg.
git cherry-pick 9772dd546a3609b06f84b680340fb84c5463264f
- нажимать на целевую ветку
Перейдите на страницу https://git-scm.com/docs/git-cherry-pick
Ответ 6
Вот графический способ, надеюсь, он может помочь людям понять, что лучше вишня:
Git графическое объяснение вишневого рисунка
Ответ 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 - и анимацию этих иллюстраций (ближе к концу).
- До сбора вишни
(мы собираемся сделать вишню коммита L
из ветки feature
):
- Запуск команды
git cherry-pick feature~2
(feature~2
- это 2 nd коммита до
feature
, то есть коммит L
):
- После выполнения команды (
git cherry-pick feature~2
):
То же анимация:
Примечание:
Фиксация L'
с точки зрения пользователя (commit = snapshot) является точной копией фиксации L
.
Технически (внутренне) это новая, другая фиксация (например, L
содержит указатель на K
, а L'
содержит указатель на E
).