Git как перенести коммит в другую ветку
Перейти к содержимому

Git как перенести коммит в другую ветку

Как в Git перенести commit из одной ветки в другую?

Нередко возникает ситуация, когда срочно требуется выполнить небольшую задачу. Разработчик быстро пробегается глазами по ТЗ и старается максимально оперативно вникнуть в суть задачи. При этом можно попросту забыть создать новую ветку, и понять об ошибке уже после финального каммита.

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

Синтаксис команды git cherry-pick

Рассмотрим ситуацию на примере. Мы находились в master и сделали в него случайно коммит. Тогда чтобы вынести его в отдельную ветку и отправить на merge request нам потребуется выполнить следующие команды:

1. Смотрим историю изменений и запоминаем хэш коммита <hash-commit-0> , соответствующего правильному состоянию ветки master , то есть когда ещё в неё не было добавлено лишних коммитов по ошибке.

2. Также следует запомнить хэш коммита <hash-commit-1> , который был лишним в ветке master . Иногда бывает, что лишними оказываются сразу несколько коммитов, тогда если они расположены последовательно друг за другом следует запомнить самый давний <hash-commit-begin> и самый последний <hash-commit-end> .

3. Перейдём на найденный коммит <hash-commit-0> . Другими словами переходим на то состояние ветки master , от которого нам нужно создать новую ветку.

4. Создадим новую ветку, в которую планируется вынести неверно расположенный коммит, и перейдем на неё.

5. Переносим коммит в новую ветку.

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

Если же нужно перенести не один, а несколько подряд идущих коммитов от <hash-commit-begin> до <hash-commit-end> , то это делается похожим образом.

Если же вы хотите, чтобы при переносе изменений коммит не создавался, то используйте параметр -n (—no-commit):

Как и при операции git rebase в процессе переноса коммита могут возникнуть конфликты. Как и при обычном git merge их следует разрешить, добавить изменения в индекс с помощью git add , а затем продолжить запустив git cherry-pick —continue .

6. Теперь когда коммиты перенесены в ветку <name-branch> , следует удалить их из ветки master . Поэтому переключаемся на ветку master

Перенести коммит из одной ветки в другую

Каким образом в Git перенести отдельный коммит из одной ветки А в ветку Б? При этом коммит содержит файлы, которые были изменены в ветке Б.

В Git есть специальная команда cherry-pick , которая позволяет вставлять в текущую ветку изменения из любого коммита. Работает она так:

Пример выше применяет последний коммит из ветки test в текущую ветку.

При желании, можно перенести более одного коммита за один раз. Например:

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

  • Используя SHA хэш коммита (или его сокращенный вариант).
  • Используя имя ветки (можно использовать синтаксис ^<N> и

Более подробная информация о том, как сослаться на коммит есть в документации к Git.

Стоит отметить, что в отличии от слияния ( merge ) при cherry-pick переносятся только изменения, а не сам коммит полностью. При этом, в целевой ветке создается новый коммит (коммиты) содержащий необходимые изменения.

Git Cherry Pick

git cherry-pick — это полезная команда, с помощью которой можно выборочно применить коммиты Git к текущей рабочей ветке HEAD. С ее помощью можно выбрать коммит из одной ветки и применить его к другой. Команда git cherry-pick — это удобный способ отменить изменения. Например, если коммит попал в ветку по ошибке, вы можете переключиться на нужную ветку и выполнить перенос.

Когда следует использовать команду git cherry-pick

Пользоваться командой git cherry-pick удобно, однако это не всегда оптимально. Она может привести к дублированию коммитов, поэтому нередко разработчики предпочитают обычное слияние. Таким образом, можно сказать, что команда git cherry-pick — средство эффективное, но узконаправленное.

Работа в команде

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

Исправление багов

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

Отмена изменений и восстановление потерянных коммитов

Иногда функциональная ветка ( feature ) может устареть, что помешает слиянию с веткой main , а запрос pull — удалиться без слияния изменений. Эти коммиты не исчезают без следа. Их можно найти в Git с помощью команд, например git log и git reflog , чтобы затем выборочно применить.

Как использовать команду git cherry-pick

Чтобы показать использование команды git cherry-pick , представим репозиторий со следующими ветками:

Выполнить команду git cherry-pick довольно просто:

В этом примере commit Sha является ссылкой на коммит. Такую ссылку можно найти с помощью команды git log . Предположим, что сейчас нам нужен коммит f в ветке main . Сначала нужно убедиться, что мы работаем над веткой main .

Затем совершим выборочное применение с помощью следующей команды:

После выполнения команды история Git примет следующий вид:

Коммит f был перенесен в основную ветку.

Примеры использования команды git cherry-pick

Команде git cherry-pick можно назначить ряд опций.

Если назначить команде опцию -edit , перед выборочным применением Git предложит указать сообщение коммита.

При использовании опции —no-commit выборочное применение не создаст новый коммит, а переместит содержимое целевого коммита в рабочий каталог текущей ветки.

При выборочном применении опция —signoff добавляет строку с подписью в конце сообщения коммита.

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

Команде git cherry-pick также можно назначить опции для разрешения конфликтов слияния, такие как —abort, —continue и —quit . Подробную информацию об этих опциях можно найти на страницах команд git merge и git rebase.

Резюме

Выборочное применение коммитов может стать оптимальным инструментом в некоторых ситуациях. Однако злоупотреблять командой git cherry-pick не стоит — иногда лучше подойдут команды git merge и git rebase. Чтобы находить коммиты для выборочного применения, используйте команду git log.

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

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