Как в 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 как перенести коммит в другую ветку
Запись: and-semakin/mytetra_data/master/base/15491005016nhunwrv5c/text.html на raw.githubusercontent.com
Если вдруг закоммитил в master , а нужно было закоммитить в отдельную ветку, то:
1. создаем новую ветку в текущем состоянии, в неё попадёт ошибочный коммит:
git branch feature
2. откатываем ветку master на один коммит назад:
git reset —hard HEAD~1
Если ветка feature уже существует, то:
1. нужно сначала намерджить в неё master :
git checkout feature
git merge master
2. а затем откатить master :
git checkout master
git reset —hard HEAD~1 # or commit SHA1
- Изменить удаленный репозиторий для подмодуля Git
- Скачать данные (git pull) с перезаписью локального репозитория в Git
- Meld — diff/merge GUI tool
- tig — псевдографический Git-клиент
- Исправить состояние «оторванной башни» (detached head) в Git
- Склонировать репозиторий с подмодулями (рекурсивно) в Git
- Сменить отслеживаемый источник для ветки в Git
- Изменить URL удаленного репозитория в Git
- Отладка .gitignore в Git
- Добавить пустую папку в репозиторий Git, игнорировать содержимое
- Скачать данные с перебазированием (pull with rebase) в Git
- Добавить алиасы команд в Git
- Скачать удаленную ветку в Git
- Сравнить две ветки в Git
- Отменить последний коммит в Git
- Удалить ветку в Git
- Спрятать (stash) изменения в рабочей директории в Git
- Отменить (обратить) коммиты в Git
- Переименовать ветку в Git
- Добавить пустой коммит в Git
- Скачать только одну ветку в Git
- Сплющить несколько коммитов в один при слиянии веток в Git
- Просмотреть изменения, касающиеся определенной строки/строк в Git
- Перенести последний коммит(ы) в другую ветку в Git
- Поставить метку (тег) в Git
- Переместить метку (тег) на другой коммит в Git
- Создать пустую ветку в Git
- Настроить Git для работы с форком в GitHub
- Закоммитить все изменения шелл-скриптом без учета кода выхода в Git
- Скопировать файл с сохранением истории в Git
- Хуки Git для установки зависимостей при смене ветки
- Игнорировать файл локально в Git (без изменения .gitignore)
- Использовать несколько GitHub аккаунтов на одной машине
- Изменить автора предыдущего коммита в Git
- Изменить автора на один коммит в Git
- Сплющить (squash) коммиты в текущей ветке в Git
- Узнать на какой коммит указывает тэг в Git
- Показать список тэгов в Git
- Удалить тэг на удаленном сервере в Git
- Проверить, что ветки могут быть слиты без конфликтов в Git
- Ошибка «Could not read from remote repository» в git
- Получить только название текущей ветки в Git
- Получить имя ветки, к которой принадлежит коммит в Git
- Сменить SSH-ключи для определенного репозитория
- Восстановить утраченный коммит в Git
git как перенести коммит из одной ветки в другую?
Как в git перенести коммит из одной ветки в другую?
Нужно перенести только изменения, которые затрагивает конкретный коммит, а не все изменения ветки.
Такая необходимость возникла, когда я отпочковался не от ветки master, а от другой ветки (по ошибке). Затем сделал пару коммитов. Как можно перенести эти пару коммитов в новую ветку, чтобы создать новый ПР относительно мастер? Чтобы 2 независимых ПР получилось?
короткая ссылка на этот вопрос: close
спросил 8 лет назад
1 ответ
git cherry-pick — применение к дереву проекта изменений, внесенных определённым коммитом.
git cherry-pick — найдёт коммит по его хэшу и вольёт его в текущую ветку. Применятся изменения только конкретного коммита, причём изменения сразу же будут проиндексированы и будет создан новый коммит в активной ветке с таким же именем, как коммит и назывался. При наличии конфиликтных изменений, нужно будет решить конфликты, как и при «рядном» merge.
Если вам нужно перенести изменения в ветку из определённого коммита другой ветки так, чтобы коммит автоматически не создавался, то нужно использовать параметр -n (—no-commit). Пример:
git cherry-pick -n d3edb354cd3c080b28d13dcb92448de81e543297
Все поддериживаемые параметры cherry-pick:
Перенести коммит из одной ветки в другую?

После этого я добавил файлы которые затрагивали коммит который мне нужно перенести в новый коммит. Получаю вот такую вот штуку:
Помогите разобраться что не так.
Заранее всем спасибо)
P.S. Вообще как видно по скрину у меня куча модифицированных файлов, которым не место на данной ветке. Возможно проблема в этом
- Вопрос задан более трёх лет назад
- 188 просмотров
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
Это не команда, а текст ошибки.
После этого я добавил файлы которые затрагивали коммит который мне нужно перенести в новый коммит.
Это вообще непонятно. Зачем добавил? Куда добавил?
Ошибка на скриншоте говорит, что прошлый черипик не закончен и даже предлагает варианты решения