Демистификация git cherry-pick: обзор команды с примерами
Git, широко распространённая система контроля версий, позволяет разработчикам эффективно управлять и отслеживать изменения в кодовой базе. Одной из мощных, но иногда недопонимаемых команд является git cherry-pick . В этой статье рассмотрим git cherry-pick , узнаем её назначение, использование и приведём примеры, раскрывающие суть этой команды.
Что такое git cherry-pick
cherry-pick — это команда Git, позволяет выбрать определённые коммиты из одной ветки и применить их к другой. Это позволяет выбирать отдельные наборы изменений без слияния целых веток. Это особенно полезно в тех случаях, когда необходимо включить определённые исправления, функции или улучшения из одной ветки в другую.
Синтаксис git cherry-pick
Базовый синтаксис команды git cherry-pick следующий:
git cherry-pick commit_hash>
Замените на хэш коммита, который вы хотите применить. Вы также можете выбрать диапазон коммитов, используя:
git cherry-pick start_commit_hash>^..end_commit_hash>
Здесь ^ используется для исключения стартового коммита.
Примеры git cherry-pick
Давайте рассмотрим несколько реальных примеров, иллюстрирующих возможности и гибкость команды git cherry-pick .
Пример 1: Выбор одного коммита
Предположим, у вас есть ветка feature с исправлением критической ошибки, которую вы хотите применить к ветке main . Вот как это можно сделать:
# Переключаемся на целевую ветвь (например, main)
git checkout main
# Выбор конкретного коммита из ветки feature
git cherry-pick commit_hash>
Пример 2: Выбор диапазона коммитов
Представьте, что у вас есть серия коммитов в ветке feature , и вы хотите перенести эти изменения в ветку release :
# Переключаемся на целевую ветку (например, release)
git checkout release
# Выборка диапазона коммитов из ветки feature
git cherry-pick start_commit_hash>^..end_commit_hash>
Пример 3: Разрешение конфликтов
В результате применения git cherry-pick могут возникнуть конфликты, особенно если применяемые изменения пересекаются с существующими модификациями. Ниже описано, как справиться с конфликтами:
# Выбирайте коммит, но останавливайтесь, если есть конфликты
git cherry-pick -n commit_hash>
# Разрешите конфликты вручную
# Продолжите процесс cherry-pick
git cherry-pick --continue
Пример 4: Отбор в новую ветвь
Если вы хотите создать новую ветку и выбрать в неё определённые коммиты, вы можете сделать следующее:
# Создание новой ветки
git checkout -b new_branch
# Выбор нужных коммитов
git cherry-pick commit_hash>
Заключение
git cherry-pick — это мощный инструмент для выборочного внесения изменений из одной ветки в другую. Поняв его синтаксис и изучив практические примеры, вы сможете уверенно использовать эту команду для более эффективного управления кодовой базой. Будь то исправление ошибок или выбор конкретных фич, git cherry-pick усиливает контроль над процессом версионирования, способствуя более гибкому и оптимизированному процессу разработки. Включите эту команду в свой Git инструментарий, и вы сможете делать выборку с точностью и уверенностью.
A3.8 Приложение C: Команды Git — Внесение исправлений
Некоторые команды в Git основываются на подходе к рассмотрению коммитов в терминах внесённых ими изменений, т. е. рассматривают историю коммитов как цепочку патчей. Ниже перечислены эти команды.
git cherry-pick
Команда git cherry-pick берёт изменения, вносимые одним коммитом, и пытается повторно применить их в виде нового коммита в текущей ветке. Эта возможность полезна в ситуации, когда нужно забрать парочку коммитов из другой ветки, а не сливать ветку целиком со всеми внесёнными в неё изменениями.
Этот процесс описан и показан в разделе Схема с перебазированием и отбором главы 5.
git rebase
git rebase — это «автоматизированный» cherry-pick . Он выполняет ту же работу, но для цепочки коммитов, тем самым как бы перенося ветку на новое место.
Мы в деталях разобрались с механизмом переноса веток в разделе Перебазирование главы 3, включая рассмотрение потенциальных проблем переноса опубликованных веток при совместной работе.
Мы использовали эту команду на практике для разбиения истории на два репозитория в разделе Замена главы 7, наряду с использованием флага —onto .
В разделе Rerere главы 7 мы рассмотрели случай возникновения конфликта во время переноса коммитов.
Также мы познакомились с интерактивным вариантом git rebase , включающемся с помощью опции -i , в разделе Изменение сообщений нескольких коммитов главы 7.
git revert
Команда git revert — полная противоположность git cherry-pick . Она создаёт новый коммит, который вносит изменения, противоположные указанному коммиту, по существу отменяя его.
Мы использовали её в разделе Отмена коммита главы 7 чтобы отменить коммит слияния (merge commit).
Что делает Git Cherry Pick и когда его следует использовать?
git cherry-pick – простой, но мощный инструмент, позволяющий выборочно переносить коммиты из одной ветки в другую. Вы можете использовать его, когда не хотите объединять всю ветку с мастером, но все же хотите включить изменения из функциональной ветки.
Что такое Git Cherry Pick и как он работает?
В Git коммиты — это единицы, которые отслеживают изменения с течением времени. Каждая фиксация может представлять собой исправление ошибки, новую функцию или часть более крупного решения. Вы можете думать о коммитах, хранящихся как связанный список, указывающий назад во времени; всякий раз, когда вы меняете HEAD ветки, Git восстанавливает файлы вашего локального каталога, принимая во внимание все коммиты, возвращающиеся к началу.
Это, конечно, упрощение, и технически Git не хранит коммиты в виде простых списков изменений, он использует BLOB-объекты на основе файлов, но принцип тот же.
Все становится сложнее, когда в дело вступают филиалы. Часто работа над фичей занимает много дней или недель. Вместо того, чтобы загромождать основной репозиторий, он помещается в отдельную ветку функций, а затем код проверяется и снова объединяется. Слияние — это, по сути, разветвление этой истории коммитов, так что вся ветка функций включается, когда Git делает свое дело.

Однако что, если вы хотите объединить некоторые вещи, но пока не хотите включать всю ветку? В этом случае вы не можете использовать git merge .
Вот где git cherry-pick становится полезным. Он делает то, что следует из названия — берет один коммит из функциональной ветки, выбирает его по отдельности и применяет к основной ветке или наоборот. Это копирует коммит, так что в целевой ветке появляется совершенно новый коммит.

Обратите внимание, что нет реальной «линии», соединяющей новый коммит в ветке master со старым коммитом. Новый выбранный коммит, созданный на мастере, вообще не ссылается на исходный коммит, коммит просто копируется. Git позаботится об этом, когда вы объедините ветки вместе, потому что коммиты рассматриваются как копии друг друга.
По сути, фиксация «переносится» в новую ветку, хотя вы должны помнить, что старая фиксация по-прежнему применяется к функциональной ветке. Однако вам не стоит отменять исходный коммит, так как это вызовет проблемы при последующем слиянии.
Почему Черри Пик?
Для этого есть несколько вариантов использования. Возможно, вы работаете над функцией, и она еще не готова к выпуску, но вы исправили ошибку в ветке функции, которую хотели бы включить в версию еженедельного выпуска. Вы можете использовать Cherry-Pick, чтобы скопировать исправление ошибки в Master, чтобы развернуть его раньше.
Или, возможно, у вас есть несколько веток для производства и разработки, и вы хотите скопировать срочное исправление ошибки из производства в разработку. Cherry Pick может сделать это тоже.
Или, возможно, вы даже случайно сделали коммит не в ту ветку. Вы можете использовать git cherry-pick , чтобы скопировать его в нужное, а затем git reset , чтобы отменить этот коммит (при условии, что он находится в HEAD ветки).
Использование Git Cherry Pick
Как только вы поймете, что делаете, git cherry-pick станет довольно простым в использовании.
Самый простой способ просмотреть историю коммитов Git в командной строке — это следующая команда, которая показывает все коммиты, но с историей ветвления и слияния, что очень важно для использования вишневого выбора:
git log --pretty=format:"%h %s" --graph

Затем вы можете просто скопировать хэш SHA1 коммита и запустить выбор вишни:
git cherry-pick 1da76d3
Обратите внимание, что вы также можете выбрать несколько коммитов одновременно, просто передав несколько хэшей.
У git cherry-pick есть несколько полезных опций:
- —no-commit применяет изменения только к вашему каталогу. Вам нужно будет подготовить и зафиксировать вручную.
- —edit позволит вам изменить сообщение фиксации.
- -x добавит сообщение «Вишенка выбрана из коммита:…»
Конечно, если вы используете клиент Git с графическим интерфейсом, такой как Fork или GitKraken, который мы настоятельно рекомендуем, вы можете просто щелкнуть правой кнопкой мыши коммит и выбрать его:

Все права защищены. © Linux-Console.net • 2019-2024
Копирование изменений путем их отбора
Git Cherry-pick копирует изменения из одной или нескольких фиксаций исходной ветви в целевую ветвь. В отличие от слияния или перебазовки, cherry-pick позволяет выбрать конкретные фиксации исходной ветви. Для каждой фиксации исходной ветви, которую вы выбираете, Git создает соответствующую фиксацию в целевой ветви.
Вы можете выбрать вишню для решения следующих распространенных задач:
- Развертывание определенной функции из одной ветви в другую.
- Копирование работы, зафиксированной в неправильной ветви.
- Примените исправление ошибок к нескольким ветвям.
Общие сведения о рабочем процессе Git см. в Azure Repos учебнике по Git.
Выбор фиксации в Черри
- Браузер
- Visual Studio 2022
- Visual Studio 2019 — меню Git
- Visual Studio 2019 — Обозреватель команды
- Командная строка Git
Azure Repos
Azure Repos предоставляет ограниченную поддержку выбора вишни и только для создания запроса на вытягивание для применения исправления в целевой ветви. Дополнительные сведения см. в статье Улучшение выбора вишни Azure DevOps.
Параметр Cherry-pick в меню запроса на вытягивание в Azure Repos выполняет следующие действия:
- Создает новую ветвь раздела из целевой ветви запроса на вытягивание.
- Cherry выбирает все изменения из исходной ветви запроса на вытягивание в новую ветвь раздела.
- Предлагает создать новый запрос на вытягивание, чтобы объединить новую ветвь раздела в другую целевую ветвь.
GitHub
Веб-интерфейс GitHub не поддерживает выбор вишни, но это делает GitHub Desktop . Пошаговые инструкции по выбору вишни в GitHub Desktop см. в статье Выбор фиксации в черри.
Visual Studio 2022 предоставляет возможности управления версиями Git с помощью меню Git, изменений Git и контекстных меню в Обозреватель решений. Visual Studio 2019 версии 16.8 также предлагает пользовательский интерфейс Git для команды Обозреватель. Дополнительные сведения см. на вкладке Visual Studio 2019 — team Обозреватель.
- Выберите Управление ветвями Git>, чтобы открыть окно Репозиторий Git.

- В окне Репозиторий Git щелкните правой кнопкой мыши целевую ветвь и выберите Извлечь.

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

- На вкладке Журнал щелкните правой кнопкой мыши фиксацию, которую вы хотите выбрать, и выберите Cherry-Pick. Visual Studio не поддерживает выбор нескольких фиксаций за раз, поэтому необходимо повторить этот шаг для каждой фиксации, которую вы хотите выбрать.
Visual Studio создает новую фиксацию целевой ветви, которая содержит изменения из выбранной фиксации вишни. Если операция выбора вишни не завершится успешно, Visual Studio уведомит вас.
Visual Studio 2019 предоставляет возможности управления версиями Git с помощью меню Git, изменений Git и контекстных меню в Обозреватель решений.
- Выберите Управление ветвями Git>, чтобы открыть окно Репозиторий Git.

- В окне Репозиторий Git щелкните правой кнопкой мыши целевую ветвь и выберите Извлечь.

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

- На вкладке Журнал щелкните правой кнопкой мыши фиксацию, которую вы хотите выбрать, и выберите Cherry-Pick. Visual Studio не поддерживает выбор нескольких фиксаций за раз, поэтому необходимо повторить этот шаг для каждой фиксации, которую вы хотите выбрать.
Visual Studio создает новую фиксацию целевой ветви, которая содержит изменения из выбранной фиксации вишни. Если операция выбора вишни не завершится успешно, Visual Studio уведомит вас.
Visual Studio 2019 версии 16.8 и более поздних версий предоставляет возможности управления версиями Git, сохраняя при этом пользовательский интерфейс Team Обозреватель Git. Чтобы использовать командную Обозреватель, снимите флажок Сервис>Параметры>Предварительные версии функций>Новый пользовательский интерфейс Git в строке меню. Функции Git можно использовать из любого интерфейса взаимозаменяемо.
- В командной Обозреватель нажмите кнопку Домой и выберите Ветви.

- В представлении Ветви щелкните правой кнопкой мыши целевую ветвь и выберите Пункт Извлечь.

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

- На вкладке Журнал щелкните правой кнопкой мыши фиксацию, которую вы хотите выбрать, и выберите Cherry-Pick. Visual Studio не поддерживает выбор нескольких фиксаций за раз, поэтому необходимо повторить этот шаг для каждой фиксации, которую вы хотите выбрать.
Visual Studio создает новую фиксацию целевой ветви, которая содержит изменения из выбранной фиксации вишни. Если операция выбора вишни не завершится успешно, Visual Studio уведомит вас.
- Используйте команду , git log чтобы получить список фиксаций исходной ветви. Флаг —oneline сокращает сведения о фиксации.
git log --oneline
Git сначала перечисляет самые последние фиксации. Каждый ИД фиксации является частичным хэшом SHA-1, который уникальным образом идентифицирует фиксацию. Например:
e745d06 (HEAD -> add-network-controller) Add a test initialization class a89f48e (origin/add-network-controller) Add fiber optic transceiver test 31da50b Add network switch test e74baa2 (origin/main, origin/HEAD, test-fiber-optic-transmitter, main) Add readme content 0c14391 Add readme file 32e3946 Add project files.git checkout
git cherry-pick
Чтобы выбрать несколько фиксаций, разделите идентификаторы фиксаций пробелами. Фиксации будут применяться в порядке их ввода:
git cherry-pick
Чтобы выбрать инклюзивный диапазон фиксаций, используйте ^.. нотацию диапазона точек:git cherry-pick ^..
При выборе нескольких фиксаций команда cherry-pick по умолчанию создает соответствующую последовательность фиксаций новой целевой ветви. Чтобы сообщить Git о том, что нужно выполнить этап и не фиксировать изменения целевой ветви, используйте -n флаг :
git cherry-pick -n
Git уведомит вас о наличии конфликтов слияния во время операции выбора вишни. Вы можете разрешить конфликты , а затем запустить git cherry-pick —continue или выполнить команду git cherry-pick —abort , чтобы отменить операцию выбора вишни.