Что такое cherry pick

GIT Cherry-pick

Что такое cherry pick. Смотреть фото Что такое cherry pick. Смотреть картинку Что такое cherry pick. Картинка про Что такое cherry pick. Фото Что такое cherry pick

Введение в GIT Cherry-pick

В этой статье мы подробно узнаем о GIT Cherry-pick. Есть много программистов, работающих над одной и той же разработкой программного обеспечения из разных уголков мира. Тогда как управлять кодами? Как они заставят других понять, какие изменения они внесли? Как зафиксировать коды и поддерживать разные версии? Как объединить коды?

Чтобы решить эти проблемы, GIT вошла в мир разработки. GIT является выдающейся системой управления исходным кодом (SCM) и распределенной системой контроля версий. GIT был создан Linux Torvald, человеком, который разработал ядро ​​Linux. Очевидно, что это инструмент с открытым исходным кодом, где каждый программист может внести свой вклад в создание программного обеспечения из любой точки мира.

GIT имеет много функций. Может иметь несколько ветвей. Разработчик может написать коды после создания своей собственной ветки в локальной системе и объединить ее с основной веткой или другими ветками удаленного GIT-репозитория.

Что такое GIT Cherry-pick?

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

Теперь член А пишет о телефонах Apple и вдруг понимает, что это может быть лучше. Таким образом, он сообщил об этом другим членам команды, которые работают над тем же проектом. Другой член Х сказал ему, что он пишет сценарий на телефонах Android, и попросил члена А посмотреть.

Затем член А изучил сценарий товарища по команде и обнаружил, что некоторые части совпадают с некоторыми действительно хорошими изменениями. Поэтому он выбрал эти изменения и вставил в свой сценарий. Это то же самое, что Cherry-Pick называет в GIT в области программного обеспечения.

Используйте команду ниже (в системе Unix), чтобы узнать различные опции для git-cherry-pick,

Команда:

Синтаксис для команды cherry-pick,

Синтаксис:

git cherry-pick (–edit) (-n) (-m parent-number) (-x)

Когда мы используем GIT Cherry-pick?

Как работает GIT Cherry-pick?

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

Cherry-pick приносит тот коммит, который был сделан только для исправления ошибки. Он не выбирает другие коммиты.

Что такое cherry pick. Смотреть фото Что такое cherry pick. Смотреть картинку Что такое cherry pick. Картинка про Что такое cherry pick. Фото Что такое cherry pick

Рисунок 2: Теперь коммит H выбирается в ветке разработки, и в результате коммит H ‘. Изменения Commit G не включены в ветку Development.

Что такое cherry pick. Смотреть фото Что такое cherry pick. Смотреть картинку Что такое cherry pick. Картинка про Что такое cherry pick. Фото Что такое cherry pick

Как использовать GIT Cherry-pick с примером?

Предположим, у нас есть две ветви (master и new_feature) (команда, используемая для просмотра ветви branch-git)

Что такое cherry pick. Смотреть фото Что такое cherry pick. Смотреть картинку Что такое cherry pick. Картинка про Что такое cherry pick. Фото Что такое cherry pick

Тем не менее, он должен быть только в основной ветке. Сначала скопируйте выделенный SHA в блокноте.

Что такое cherry pick. Смотреть фото Что такое cherry pick. Смотреть картинку Что такое cherry pick. Картинка про Что такое cherry pick. Фото Что такое cherry pick

Теперь мы будем использовать команду git-cherry-pick для перемещения этого коммита в основную ветку, однако перед этим нам нужно переключиться на основную ветку (команда, используемая для переключения проверки ветки-git )

Что такое cherry pick. Смотреть фото Что такое cherry pick. Смотреть картинку Что такое cherry pick. Картинка про Что такое cherry pick. Фото Что такое cherry pick

(команда использовала git cherry pick ) (тот же SHA должен быть вставлен, который был скопирован ранее в блокнот с помощью команды git cherry-pick)

Что такое cherry pick. Смотреть фото Что такое cherry pick. Смотреть картинку Что такое cherry pick. Картинка про Что такое cherry pick. Фото Что такое cherry pick

Теперь мы видим, что тот же коммит доступен в основной ветке (команда used-git log)

Более подробный пример команд git cherry-pick смотрите по ссылке ниже:

Важные вещи для запоминания

При использовании cherry-pick и работе в команде нужно помнить три вещи.

Это позволит избежать слияния конфликтов в будущем.

2. скопируйте заметки: иногда у некоторых из «вишневого кирки» есть заметки, и когда мы запускаем «вишневый кирк», они не копируются. Поэтому лучше его использовать.

3. Выберите несколько коммитов, когда они только линейные: мы хотим выбрать несколько коммитов типа G, H (рис. 1), если они линейные, тогда используйте только следующую команду:

Вывод

Предположим, что мы хотим выбрать конкретный коммит из другой ветви и применить к текущей ветви, вот рекомендуемые шаги,

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

2. Перейдите в ветку назначения.

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

Рекомендуемые статьи

Источник

Раскладываем Git по полочкам: терминология

Что это за зверь?

Git — распределённая система управления версиями. Git поддерживает быстрое разделение и слияние версий, включает инструменты для визуализации и навигации по нелинейной истории разработки.

Ничего не понятно, давай еще раз

Какие такие версии?

Версия — это состояние файла (или нескольких файлов) в какой-то конкретный момент времени. Например, пустой файл (1), тот же файл с каким-то текстом (2) и этот же файл, в котором была исправлена опечатка (3) — три разные версии одного файла, которые были получены последовательной модификацией (изменением) файла.

Системы чего.

Система управления версиями — программа, позволяющая сохранять состояние файлов (те самые версии), возвращаться к ранее сохраненному состоянию, сохранять последовательность изменений внесенных в файлы, отменять или заново применять эти изменения, отслеживать авторство изменений.

Что там с этими версиями делают?

Разделение версий — независимые изменения одного файла.

Что такое cherry pick. Смотреть фото Что такое cherry pick. Смотреть картинку Что такое cherry pick. Картинка про Что такое cherry pick. Фото Что такое cherry pickВерсионность на примере текстового файла

Например, у нас есть файл с каким-то текстом (версия этого файла). Файл отправляется на проверку, там обнаруживается и исправляется опечатка (получаем новую версию файла). Независимо от этого в старый (неисправленный) файл дописывается еще что-то (получаем еще одну версию этого файла). Т.е., на данный момент у нас есть два разных файла (две версии одного файла), которые были независимо друг от друга созданы на основе одной общей версии.

Слияние версий — объединение двух и более независимых версий. Для примера выше, слиянием будет объединение двух существующих версий нашего файла в одну — файл, в котором будет и новый текст, и исправленная опечатка.

А при чем тут история?

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

добавление изначального текста

добавление нового текста

объединение двух версий файла (при выполнении слияния)

Нелинейная история — история, в которой изменения вносятся не одно за другим последовательно, а может быть внесено несколько независимых изменений на основе одной версии файла (исправление опечатки и добавление нового текста). Т.е. мы создаем две параллельные истории изменений файла.

Немного терминологии

Репозиторий (repository) — совокупность файлов, состояние которых отслеживается, и история их изменений. По факту, репозиторий — это проект, над которым ведется работа, и все изменения в этом проекте. Для отслеживания состояния файла его необходимо добавить в репозиторий.

Коммит (commit) — сохраненное состояние (версия) файлов репозитория.

Ветка (branch) — последовательность коммитов (история изменения состояния репозитория). Каждый коммит в ветке имеет «родителя» (parent commit) — коммит, на основе которого был получен текущий. В репозитории может быть несколько веток (в случаях, когда к одной версии репозитория применяется несколько независимых изменений).

HEAD — указатель на текущий коммит (указатель на состояние, в котором репозиторий находится на данный момент).

Мастер (master, main) — основная ветка репозитория, создается автоматически при создании репозитория.

Мердж (слияние, merge) — объединение двух или более веток. В процессе мерджа изменения с указанной ветки переносятся (копируются) в текущую.

Целевая ветка мерджа — ветка, изменения с которой объединяются с текущей веткой.

База слияния (merge base) — последний общий коммит двух веток.

Мердж коммит (merge commit) — коммит, который создается автоматически по завершению процесса слияния веток. Мердж коммит содержит в себе все изменения целевой ветки мерджа, которые отсутствуют в текущей (все коммиты целевой ветки, которые начиная с базы слияния, но не включая её).

Слияние перемоткой (fast-forward merge) — слияние веток, при котором в текущей ветке отсутствуют новые коммиты (последний коммит текущей ветки является базой слияния). При таком мердже текущая ветка просто переходит в состояние целевой ветки (указатель HEAD переносится на последний коммит целевой ветки). Мердж коммит при этом не создается.

Слияние без перемотки (non fast-forward merge) — слияние, при котором новые коммиты (относительно базы слияния) присутствуют как в текущей, так и в целевой ветках.

В пустом репозитории, в основной ветке, создаем пустой файл, добавляем в репозиторий (теперь git будет отслеживать состояние файла) и коммитим (коммит А).

Добавляем в файл текст, коммитим еще раз (коммит B).

Создаем новую ветку (как бы копируя состояние репозитория), вносим изменения в файл и снова коммитим (коммит С).

Возвращаемся на предыдущую ветку (теперь репозиторий находится в состоянии, которое сохранилось при коммите B, без изменений, которые вносились в новой ветке).

Вносим новые изменения, создаем новый коммит (D).

Что такое cherry pick. Смотреть фото Что такое cherry pick. Смотреть картинку Что такое cherry pick. Картинка про Что такое cherry pick. Фото Что такое cherry pickИстория изменений при создании новой ветки

После этого новая ветка останется в состоянии С (со своими собственными изменениями), а в основной ветке будут изменения из обеих веток (изменения, внесенные коммитами С и D). Эта ветка перейдет в состояние Е.
Возможна и обратная ситуация, когда изменения из основной ветки вливаются в новую (мердж производится из новой ветки).

При этом мы можем вернуться в новую ветку и продолжить работу в ней (внести новые изменения и создать коммит F).

Что такое cherry pick. Смотреть фото Что такое cherry pick. Смотреть картинку Что такое cherry pick. Картинка про Что такое cherry pick. Фото Что такое cherry pickИстория изменений после слияния и нового коммита

Мердж конфликт (merge conflict) — ситуация, когда при слиянии веток в один или несколько файлов вносились независимые изменения. В некоторых случаях (например, если изменялись разные, не пересекающиеся части одного файла) git способен самостоятельно решить, как выполнять слияние таких файлов. Если автоматически это сделать не удалось — возникает конфликт. В таком случае необходимо самостоятельно указать, как выполнять слияние конфликтующих версий (решить конфликт, resolve merge conflict). Изменения, внесенные в процессе решения конфликта автоматически попадают в мердж коммит.

Чекаут (checkout) — переход на другое (существующее) состояние репозитория (на другой коммит или ветку). При этом все файлы в репозитории возвращаются в состояние, в котором они находились на момент указанного коммита. Если перед переходом в репозиторий были внесены изменения, которые были добавлены в репозиторий, но не попали в коммит — они будут перенесены «поверх» состояния после перехода. Как и при мердже, git попробует применить эти изменения к новому состоянию автоматически, при неудаче — возникает конфликт и изменения необходимо применить вручную.

Дифф (diff) — разница двух состояний (коммитов, веток, подготовленных или модифицированных файлов).

Трехсторонний дифф (three-way diff) — дифф, возникающий при мердже и решении конфликтов. Является разницей трех состояний: состояния репозитория в текущей ветке, состояния в целевой ветке слияния и общего состояния между этими ветками (состояния в базе слияния).

Черри-пик (cherry-pick) — процесс добавления в текущую ветку одного (или нескольких) коммитов из другой ветки, без необходимости выполнять слияние веток.

Реверт (revert) — отмена внесенных изменений (коммита или группы коммитов). В процессе реверта создается дополнительный коммит, который так же можно отменить при необходимости (вернув репозиторий в изначальное состояние). Реверт мердж коммита позволяет отменить выполненное ранее слияние веток.

Ребейз (rebase) — перенос изменений текущей ветки «поверх» другой ветки. При этом все коммиты текущей ветки, которых нет в целевой, удаляются из текущей и заново создаются в целевой ветке (последовательно применяются к состоянию в целевой ветке). Поскольку ребейз пересоздает коммиты заново и меняет существующую историю, его использование не рекомендуется при командной разработке. Ребейз в ветке, над которой работает несколько человек, может привести к потере чужих изменений и/или невозможности корректно выполнить слияние.

В данном случае коммит Е содержит изменения, которые вносились с момента последнего слияния или создания ветки (с момента коммита В). Т.е. коммит Е содержит в себе изменения из D. При выполнении ребейза git понимает, что эти изменения (E) уже присутствуют в целевой ветке (и окажутся в текущей после ребейза), потому нет необходимости копировать коммит Е, дублируя этим D.

Командная разработка

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

Есть два варианта синхронизации изменений:

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

Что такое cherry pick. Смотреть фото Что такое cherry pick. Смотреть картинку Что такое cherry pick. Картинка про Что такое cherry pick. Фото Что такое cherry pick

    пуш (push) — обратный пуллу процесс. При пуше изменения из локального репозитория переносятся в удаленный. Пуш обновляет состояние текущей ветки в удаленном репозитории и не является мерджем (не создает дополнительные коммиты и не может привести к конфликтам). Если в ветке удаленного репозитория присутствуют коммиты, которых нет в локальном репозитории, сигнализируется ошибка о несовпадении истории изменений (non fast-forward merge), пуш выполнить не получится. В таком случае необходимо сначала синхронизировать состояние локального репозитория (получить недостающие коммиты с помощью пулла), и только после этого повторить процесс пуша.

Что такое cherry pick. Смотреть фото Что такое cherry pick. Смотреть картинку Что такое cherry pick. Картинка про Что такое cherry pick. Фото Что такое cherry pick

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

основные понятия и термины

простые примеры терминов

применение git’a при командной разработке

некоторые проблемы, которые могут возникать при использовании git’a

Источник

Git, я хочу все отменить! Команды исправления допущенных ошибок

Что такое cherry pick. Смотреть фото Что такое cherry pick. Смотреть картинку Что такое cherry pick. Картинка про Что такое cherry pick. Фото Что такое cherry pick

Git — удобная, но довольно сложная система. Сложность, прежде всего, в том, что по невнимательности можно допустить ошибку, которую затем сложно или вообще невозможно исправить. Документация Git предоставляет описание множества команд, которые дают возможность исправить ошибку.

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

Черт, я сделал что-то не то. Дайте мне волшебную машину времени!

Что такое cherry pick. Смотреть фото Что такое cherry pick. Смотреть картинку Что такое cherry pick. Картинка про Что такое cherry pick. Фото Что такое cherry pick

Эта команда позволяет восстановить случайно удаленные данные, откатив слияние, после которого случилась неприятность. refLog используется ну очень часто — давайте скажем спасибо тому, что предложил добавить эту команду.

Я сделал коммит, но сразу же заметил ошибку, ее нужно исправить!

NB! Никогда не изменяйте коммиты в публичной ветке. Применяйте команду лишь для коммитов в локальной ветке, иначе у вас будут проблемы.

Хочу изменить сообщение последнего коммита!

Это просто… глупые требования к оформлению сообщений.

Я случайно закоммитил в мастер, хотя это должен был в новую ветку!

Если вы уже закоммитили в публичную ветку, команды не сработают. В этом случае поможет git reset HEAD@ <укажите количество коммитов, на которое нужно вернуться>вместо HEAD

Ну вот, я ошибочно закоммитил не в ту ветку

Есть еще один способ, который использует большое количество разработчиков — это cherry-pick.

Мне нужно запустить diff, но ничего не получается

Если вы уверены в том, что изменения были внесены, но diff пустой, вполне может быть, что вы индексировали изменения через add. Поэтому стоит использовать специальный флаг.

В общем, это не баг, а фича, но она чертовски неочевидная ¯\_(ツ)_/¯

Мне срочно нужно отменить коммит, который сделан 5 коммитов назад

К счастью, не нужно отказываться назад на 5 коммитов, занимаясь копипастом старых и новых файлов. Отменить все это можно при помощи revert.

Кроме того, откатить можно не только коммит, но и целый файл. Правда, это уже будут другие команды…

Отменить изменения в файле

А вот и они, эти другие команды.

Когда я впервые нашел эту возможность, это было КРУТО, КРУТО, К-Р-У-Т-О. Но если задуматься — почему именно checkout — лучший вариант для отмены изменений в файле? :shakes-fist-at-linus-torvalds:

Спасибо Eric V. За этот способ. И все жалобы по поводу использования sudo адресуйте ему.

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

Внимание! Эта статья не является исчерпывающим руководством. И да, есть и другие способы сделать то же самое, причем еще лучше. Но я пришел именно к этим вариантам методом проб и ошибок. Потом у меня появилась сумасшедшая идея поделиться находками. Берите это или уходите!

Что такое cherry pick. Смотреть фото Что такое cherry pick. Смотреть картинку Что такое cherry pick. Картинка про Что такое cherry pick. Фото Что такое cherry pick

Даниил Пилипенко, директор центра подбора IT-специалистов SymbioWay и евангелист бэкенд-направления онлайн-университета Skillbox, дополнил перевод мнением о Git и его актуальности для разработчиков.

Git появился в 2005-ом году, и он далеко не сразу занял рынок. Помню, когда мы ещё в 2008-ом году в команде разработчиков внедряли SVN. И даже в 2012-ом одна близкая ко мне компания усиленно внедряла Mercurial. С годами для многих стало очевидным, что Git — это лучшая система контроля версий, и её теперь используют практически все разработчики.

Если вы начинающий разработчик и собираетесь устраиваться на работу, обязательно изучите Git! Вы должны знать, что такое система контроля версий и зачем она нужна, что такое коммит, ветка, как клонировать репозиторий и отправлять сделанные изменения на сервер, как получать новые изменения с сервера, как делать merge, какие бывают виды “reset”. Поначалу эта тема вам может показаться непонятной и сложной, но вам нужно лишь привыкнуть пользоваться Git, и отвыкнуть вы уже не сможете.

Источник

Ежедневный Git

Уже были статьи про основы гита (0, 1, 2), были и статьи про внутреннее устройство репозитория. Сегодня поговорим, как простому смертному работать с гитом на автопилоте и не морочить себе голову.

Во-первых, шорткаты (в порядке убывания популярности):

Во-вторых, отображение текущей ветки в командной строке:

Типичный поток работы в одной ветке

Локальные ветки

Принцип: одна фича — одна ветка. Один багфикс (если предполагается длиннее двух коммитов) — одна ветка. Один эксперимент — одна ветка. Одна фича внутри эксперимента — ветка от ветки. Ну, вы уловили идею.

Зачем оно нужно? Представьте, что вы начали день с фичи А, а к вам подошли и сказали, что нужно зафиксить Б. А через пять минут выяснилось, что для того, чтобы по-человечески зафиксить Б, нужно прикрутить и проверить Ц. Если каждую из этих задач держать в отдельных ветках, то голова не пойдет кругом, и работа не встанет поперек горла.

Не забывайте, что вы всегда можете подлить какую-нибудь ветку в текущую с помощью git merge other-branch.

Жизненные ситуации с ветками

2) Публикация ветки для совместной работы: gush origin my-branch:refs/heads/my-branch
Удаление ветки: gush origin :refs/heads/my-branch (внимание на пробел перед двоеточием)

3) Вы сидите в одной ветке и сделали что-то, что хотели бы закоммитить в другую ветку. Если вы еще не закоммитили, то делаем git reset HEAD для уже добавленных файлов (через ga/git-add), потом git-stash, выходим в нужную ветку, делаем git-stash apply и далее действуем так, как будто мы прямо тут все и меняли.

4) Вы сделали коммит в некоторую экспериментальную ветку, который имеет смысл залить в мастер, но git merge my-branch не подходит, потому что после этого коммита были еще несколько экспериментальных коммитов.

На этот случай есть git-cherry-pick. Вначале, посмотрите git-log и скопируйте номер нужного коммита. Далее, вы должны закоммитить все изменения в той ветке, в которую будете кидать выдернутый коммит. Затем, делаете git-cherry-pick и разруливаете конфликты, если возникли.
У меня такая ситуация была именно с добавлением коммита в мастер, поэтому после этих хирургических манипуляций мне нужно было подлить мастер в локальную ветку. Поскольку cherry-pick всего лишь применяет дифф (номер коммита становится другим), то ветка не знает, что внесенное изменение у нее уже есть, и не может нормально его смерджить. Поэтому, при мердже мастера в ветку вы гарантированно получите глупые конфликты а-ля «строчка АБВ конфликтует с АБВ».
Если кто-нибудь знает, как избежать конфликтов в такой ситуации (и сэкономить 5 минут времени), поделитесь опытом.

Скучные нравоучения напоследок

В следующий раз нужно написать пару слов о комфортной работе с git-submodule и git-svn.

Источник

Git. Урок 5.
Слияние изменений и продвинутая
работа с ветками.
Команды: merge, cherry-pick, rebase.

Что такое cherry pick. Смотреть фото Что такое cherry pick. Смотреть картинку Что такое cherry pick. Картинка про Что такое cherry pick. Фото Что такое cherry pick

Что такое cherry pick. Смотреть фото Что такое cherry pick. Смотреть картинку Что такое cherry pick. Картинка про Что такое cherry pick. Фото Что такое cherry pick

1. Что такое слияние и зачем оно нужно.

2. Слияние в Git. Команда git merge.
2.1 Явное слияние
2.2 Неявное слияние (fast-forward)
2.3 В чем разница между fast-forward и явным слиянием?

3. Разрешение конфликтов слияния.
3.1. Ручное разрешение конфликта
3.2. Выбор одного из двух файлов
3.3. Тонкости разрешения merge-конфликтов.
3.4. Инструменты для разрешения merge-конфликтов.

4. Еще один способ объединения изменений из разных веток. Команда git rebase.

5. Интерактивный git rebase. Редактирование коммитов любой давности.

6. Берем вишенку с торта. Команда git cherry-pick.

То есть общий ход нашей работы выглядит следующим образом:
1. Решили добавить новую функцию – создали отдельную ветку. Дальше работаем в новой ветке.
2. Написали функцию, протестировали ее работу, внесли все необходимые исправления, еще раз протестировали и убедились, что функция работает исправно и не привнесла ошибок в остальной код.
3. Теперь нужно как-то перенести изменения с тестовой ветки на основную – в продакшн. Тут нам на помощь и приходит слияние: мы просто сливаем (т.е. переносим) изменения с нашей тестовой ветки в основную.

Итак, дадим определения:

Команда git merge

—abort
Ключ, использующийся только при разрешении конфликтов. Позволяет прервать слияние и вернуть все к моменту начала операции.

—continue
Ключ, использующийся только при разрешении конфликтов. Позволяет продолжить слияние после разрешения всех конфликтов.

2. 1. Явное слияние

Допустим, у нас есть граф вида:

Что такое cherry pick. Смотреть фото Что такое cherry pick. Смотреть картинку Что такое cherry pick. Картинка про Что такое cherry pick. Фото Что такое cherry pick

Флаг —no-ff в данной ситуации необходим, поскольку мы хотим выполнить именно явное слияние. Подробнее о смысле этого флага мы поговорим чуть позже.

Что такое cherry pick. Смотреть фото Что такое cherry pick. Смотреть картинку Что такое cherry pick. Картинка про Что такое cherry pick. Фото Что такое cherry pick

2.2. Неявное слияние

Давайте рассмотрим пример. Допустим, у нас есть все тот же граф репозитория:

Что такое cherry pick. Смотреть фото Что такое cherry pick. Смотреть картинку Что такое cherry pick. Картинка про Что такое cherry pick. Фото Что такое cherry pick

Что такое cherry pick. Смотреть фото Что такое cherry pick. Смотреть картинку Что такое cherry pick. Картинка про Что такое cherry pick. Фото Что такое cherry pick

Что такое cherry pick. Смотреть фото Что такое cherry pick. Смотреть картинку Что такое cherry pick. Картинка про Что такое cherry pick. Фото Что такое cherry pick

Очень часто во время слияния веток оказывается, что ваши изменения удаляют или переписывают информацию в уже существующих файлах. Такая ситуация называется файловым конфликтом. Git останавливает выполнение слияния, пока вы не разрешите конфликт.

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

Давайте сразу начнем с примера и по ходу будем учиться разрешению конфликтов. Так будет нагляднее. Итак, допустим есть следующий репозиторий:

Что такое cherry pick. Смотреть фото Что такое cherry pick. Смотреть картинку Что такое cherry pick. Картинка про Что такое cherry pick. Фото Что такое cherry pick

3.1. Ручное разрешение конфликта

Что такое cherry pick. Смотреть фото Что такое cherry pick. Смотреть картинку Что такое cherry pick. Картинка про Что такое cherry pick. Фото Что такое cherry pick

3.2. Выбор одного из двух файлов

Дальше все стандартно: откроется редактор сообщения коммита. В сообщении следует указать, какие ветки вы сливали, и вкратце перечислить внесенные изменения.

3.3. Тонкости разрешения merge-конфликтов.

Теперь мы имеем представление, как разрешать конфликты слияния, и пришло время углубиться в эту тему. Поговорим о тонкостях, которые помогут вам понять, как правильно разрешить конфликт. Подчеркиваем: «правильно», поскольку разрешить конфликт не составляет труда, но если сделать это неверно, можно потерять код, написанный другими разработчиками.

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

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

Эти состояния можно изобразить на диаграмме следующим образом.

Что такое cherry pick. Смотреть фото Что такое cherry pick. Смотреть картинку Что такое cherry pick. Картинка про Что такое cherry pick. Фото Что такое cherry pick

Чтобы понять, что изображено на диаграмме, полезно будет вспомнить, что такое дельта.
Дельта – это разность каких-то двух состояний. То есть по сути это информация о том, какие изменения вы внесли в файлы с момента определенного коммита. Как мы помним из второго урока данного курса, коммиты хранят именно дельты, а не полностью файлы. Благодаря этому репозиторий Git занимает очень мало места.

На диаграмме выше Дельта-1 – это разность текущего состояния ветки main и базы слияния. Аналогично Дельта-2 – это разность текущего состояния ветки develop и базы слияния.

Результат слияния нам как раз и нужно получить. Git пытается получить его автоматически, совмещая Дельту-1 и Дельту-2, но если эти дельты задевают одни и те же части одного и того же файла, возникает конфликт. При возникновении конфликта Git просит нас сравнить Дельту-1 и Дельту-2, чтобы составить из них третье состояние – результат слияния.

3.4. Инструменты для разрешения merge-конфликтов.

Использование графических утилит особенно удобно при сравнении больших файлов: почти во всех есть подсветка внесенных изменений, что поможет вам не запутаться в файле. Тем не менее при сравнении маленьких файлов часто можно обойтись одной консолью. Кстати, большинство IDE имеет встроенную утилиту для разрешения конфликтов, что сделает вашу работу с кодом еще более удобной.

Если говорить кратко, git rebase переносит коммиты текущей ветки на вершину переданной. Но перед тем, как перейти непосредственно к команде, давайте разберем принцип ее действия на примере. Пусть у нас есть репозиторий со следующим графом.

Что такое cherry pick. Смотреть фото Что такое cherry pick. Смотреть картинку Что такое cherry pick. Картинка про Что такое cherry pick. Фото Что такое cherry pick

Что такое cherry pick. Смотреть фото Что такое cherry pick. Смотреть картинку Что такое cherry pick. Картинка про Что такое cherry pick. Фото Что такое cherry pick

Команда git rebase

-i
—interative

Эти ключи позволяют нам делать rebase в интерактивном режиме. Мы будем активно пользоваться ими при редактировании старых коммитов.

—abort
Ключ, использующийся только при разрешении конфликтов. Позволяет прервать ребейз и вернуть все к моменту до начала операции.

—continue
Ключ, использующийся только при разрешении конфликтов. Позволяет продолжить ребейз после разрешения всех конфликтов.

—skip
Ключ, использующийся только при разрешении конфликтов. Позволяет пропустить текущий коммит.

Что такое cherry pick. Смотреть фото Что такое cherry pick. Смотреть картинку Что такое cherry pick. Картинка про Что такое cherry pick. Фото Что такое cherry pick

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

Что такое cherry pick. Смотреть фото Что такое cherry pick. Смотреть картинку Что такое cherry pick. Картинка про Что такое cherry pick. Фото Что такое cherry pick

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

На самом деле git rebase можно выполнять для одной и той же ветки. В обычном режиме это нам ничего не даст, но вот в интерактивном режиме мы сможем поменять сообщения, содержимое и вообще манипулировать коммитами, как нам только вздумается, вплоть до удаления. Давайте на примере разберем, как происходит изменение коммитов. Итак, допустим у нас есть репозиторий, граф которого выглядит так:

Что такое cherry pick. Смотреть фото Что такое cherry pick. Смотреть картинку Что такое cherry pick. Картинка про Что такое cherry pick. Фото Что такое cherry pick

Команда git cherry-pick

-e
—edit

С этим ключом вы сможете отредактировать сообщение коммита.

-n
—no-commit

С этим ключом команда не создаст коммит на вашей ветке, а только скопирует все изменения в вашу рабочую копию. То есть с этим ключом данная команда идентичная git checkout *

—abort
Ключ, использующийся только при разрешении конфликтов. Позволяет прервать операцию и вернуть все к моменту до начала операции.

—continue
Ключ, использующийся только при разрешении конфликтов. Позволяет продолжить операцию после разрешения всех конфликтов.

Берет переданный коммит и создает в текущей ветке его точную копию.

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

1. Случай первый. Работа в команде.
Этот случай был описан во введении к данной части. Часто в команде несколько разработчиков работают над одним и тем же участком кода, но каждый – в своей ветке. Соответственно могут возникать ситуации, когда одному из разработчиков для реализации своей части задачи потребуется часть кода, написанная другим разработчиком. Merge в данном случае делать нерационально, поскольку ни одна из веток не пришла к своему логическому завершению, а вот cherry-pick – то, что надо.

2. Случай второй. Быстрые исправления багов.
Если в коде был обнаружен баг, очень важно как можно быстрее донести исправления до конечного пользователя. В таком случае, разработчик, обнаруживший ошибку, срочно создает коммит, в котором исправляет ее. Этот коммит может быть перенесен в основную ветку с помощью cherry-pick, чтобы не задерживать исправление бага слияниями в различные пре-релизные ветки.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *