Имеется ситуация: есть ветка (пусть она называется первой), в которой сделан какой-то коммит. Требуется скопировать изменения, которые делает этот коммит, в другую (вторую) ветку. В первой ветке изменения должны так же остаться.
Для решения этой задачи можно использовать механизм cherry-pick. Действия следующие.
1. Узнать в первой ветке хеш коммита, который надо скопировать.
2. Переключиться на целевую (т. е. вторую) ветку, в которую будут добавляться изменения из существующего коммита.
3. Дать команду:
git cherry-pick <хеш_исходного_коммита>
а лучше:
git cherry-pick -x <хеш_исходного_коммита>
Что делает опция -x ? Дело в том, что cherry-pick не "применяет" коммит к новой ветке. Cherry-pick берет изменения, которые делал указанный коммит, и делает те же изменения в целевой ветке. При этом получается новый коммит. И информации о том, как получились эти изменения, нигде не остается: они могли возникнуть как угодно. Их мог сделать разработчик, вручную меняя код, и они могли быть сделаны через cherry-pick.
Поэтому, чтобы хоть как-то ориентироваться в истории, нужна опция -x . Она автоматически добавит в сообщение нового коммита строку типа:
(cherry picked from commit abc123456789)
Что делать если при cherry-pick возникли конфликты изменений? Надо разрешить их вручную, затем добавить исправления в индекс:
git add .
После чего надо продолжить копирование:
git cherry-pick --continue
В результате изменения, сделанные коммитом в одной ветке, будут скопированы в другую.