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

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

  • автор:

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

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

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

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

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

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

git log

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

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

git checkout

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

git checkout -b

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

git cherry-pick

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

git cherry-pick master

Если же нужно перенести не один, а несколько подряд идущих коммитов от до , то это делается похожим образом.

git cherry-pick ..

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

git cherry-pick -n d112ecf96

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

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

git checkout master

Смещаем указать master на коммит

git как перенести коммит из одной ветки в другую?

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

Нужно перенести только изменения, которые затрагивает конкретный коммит, а не все изменения ветки.

Такая необходимость возникла, когда я отпочковался не от ветки master, а от другой ветки (по ошибке). Затем сделал пару коммитов. Как можно перенести эти пару коммитов в новую ветку, чтобы создать новый ПР относительно мастер? Чтобы 2 независимых ПР получилось?

короткая ссылка на этот вопрос: close
спросил 8 лет назад

1 ответ

git cherry-pick — применение к дереву проекта изменений, внесенных определённым коммитом.

git cherry-pick — найдёт коммит по его хэшу и вольёт его в текущую ветку. Применятся изменения только конкретного коммита, причём изменения сразу же будут проиндексированы и будет создан новый коммит в активной ветке с таким же именем, как коммит и назывался. При наличии конфиликтных изменений, нужно будет решить конфликты, как и при «рядном» merge.

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

git cherry-pick -n d3edb354cd3c080b28d13dcb92448de81e543297

Все поддериживаемые параметры cherry-pick:

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

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

Отслеживать
задан 29 ноя 2011 в 18:24
8,657 18 18 золотых знаков 73 73 серебряных знака 181 181 бронзовый знак

3 ответа 3

Сортировка: Сброс на вариант по умолчанию

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

git cherry-pick test 

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

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

git cherry-pick 8fe1498 mega_fix~3 v1.0.1 

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

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

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

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

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

5fea13027a872731650539.jpeg

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

Помогите разобраться что не так.
Заранее всем спасибо)
P.S. Вообще как видно по скрину у меня куча модифицированных файлов, которым не место на данной ветке. Возможно проблема в этом

  • Вопрос задан более двух лет назад
  • 175 просмотров

1 комментарий

Простой 1 комментарий

Для этого я использую команду:

error: your local changes would be overwritten by cherry-pick. hint: commit your changes or stash them to proceed. fatal: cherry-pick failed

Это не команда, а текст ошибки.

После этого я добавил файлы которые затрагивали коммит который мне нужно перенести в новый коммит.

Это вообще непонятно. Зачем добавил? Куда добавил?

Ошибка на скриншоте говорит, что прошлый черипик не закончен и даже предлагает варианты решения

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

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