Похоже, что вы можете захотеть сделать эти коммиты на ветке, отличной от master, а затем объединить эту ветку с master и вашей второй веткой:
git checkout working-branch
<do some work>
git commit
git checkout master
git merge working-branch
git checkout second-branch
git merge working-branch
Это намного, намного лучше, чем выбор вишни, потому что он не включает дублирование коммитов в истории, избавляет от любых проблем с выбором вишни дважды, что вы в настоящее время должны избегать вручную ... просто способ, которым git предназначен для работы. Я не знаю, какова ваша вторая ветвь, но то, что я описываю, - это, по сути, общий рабочий процесс периодического слияния веток обслуживания и тем обратно в master, а также в любые другие соответствующие ветки модифицированных релизов или обслуживания.
Я настоятельно рекомендую вам принять рабочий процесс, в котором это делается путем слияния, как я описал выше, но чтобы ответить на вопрос, который вы задали, если вам абсолютно необходимо работать над master и cherry-pick, вы можете написать себе немного сценарий, что-то вроде:
#!/bin/bash
# take two arguments:
# 1. other branch to put commits on
# 2. number of commits to cherry-pick from master
if ! git checkout $1; then
exit
fi
git rev-list --reverse -n $2 master |
while read commit; do
if ! git cherry-pick $commit; then
exit
fi
done
Очевидно, что есть способы сделать скрипт более надежным, например, добавлена возможность возобновления после черриков, чьи патчи не применяются должным образом, но это только начало.
Конечно, вы можете возиться с тем, как вы используете git-rev-list для выбора коммитов. Вы можете даже передать все, кроме первого аргумента, в git-rev-list, чтобы вы могли делать cherries-pick <branch> -n 5 master
или cherries-pick <branch> release_tag..master
или что угодно. Загляните на его справочную страницу !
Вы также можете использовать git-rebase
, как было предложено в другом месте, но поскольку вы на самом деле не хотите перемещать мастера, вы в конечном итоге сделаете что-то вроде этого:
git branch master-copy master
git rebase --onto <branch> master~5 master
git checkout <branch>
git merge master-copy
git branch -d master-copy