Ответ 1
Короткий ответ
Вы можете применить уже существующую фиксацию к другому ветки, используя команду cherry-pick
, а затем нажмите обе ветки с помощью git push origin branchA branchB
.
Почему нажатие фиксации в двух ветвях может быть полезно
Предположим, что у вас есть репозиторий с этой структурой:
A--B--C--D ← master ← HEAD
\--E ← v1-release
После того, как был выпущен проект (завершен A
, B
, C
) и была создана ветвь v1-release
(так что v1 может поддерживаться с исправлениями, а следующая версия может быть разработана в master
), Commit E
использовался для указания информации о версии (добавлены примечания к выпуску и т.д.). Commit D
представил новую функцию, которая запланирована для следующей версии и не должна появляться в v1-release
.
Теперь, если ошибка обнаружена в v1-release
, она должна быть исправлена в обеих ветвях, чтобы пользователи могли продолжать использовать v1, и она не отображается в следующей версии.
После исправления ошибки в master
репозиторий должен выглядеть следующим образом:
A--B--C--D--F ← master ← HEAD
\--E ← v1-release
Теперь commit F
с исправлением ошибки следует применить к ветки v1-release
.
Как это сделать
Конец не может быть точно скопирован (поскольку commit является статусом сохранения каталога), но вы можете применить изменения, сделанные в фиксации к другому фиксации.
cherry-pick
команда выполняет именно это. Он применяет изменения, сделанные указанной фиксацией к текущей ветке, создавая новую фиксацию:
git checkout v1-release
git cherry-pick F
После этого репозиторий должен выглядеть следующим образом:
A--B--C--D--F ← master
\--E--G ← v1-release ← HEAD
Commit G
вводит те же изменения, что и F
.
Возможно, вам придется разрешать конфликты (точно так же, как после слияния).
Сообщение об ошибке
Предыдущий вишневый выбор теперь пуст...
означает, что изменения, сделанные с помощью вишневого фиксации, уже присутствуют в текущей ветке. Вероятно, вы забыли проверить правильную ветку.
В случае ошибок или конфликтов вишня-выбор может быть прервана с помощью git cherry-pick --abort
.
Наконец, вы можете вернуться в ветвь master
и нажать обе ветки в удаленный репозиторий:
git checkout master
git push origin master v1-release
Окончательная структура репозитория:
A--B--C--D--F ← master ← HEAD
\--E--G ← v1-release