Как объединить головные коммиты из другой ветки? - PullRequest
7 голосов
/ 31 августа 2009

Обычно я работаю над веткой master, делаю коммиты и нажимаю на нее.

Тогда мне также нужно отправить эти коммиты в другую ветку.

Так обычно я буду делать:

$ git checkout another-branch
$ git cherry-pick commit1
$ git cherry-pick commit2
...
$ git cherry-pick commitn
$ git push

Какая-то глупость, в любом случае, я могу объединить некоторые коммиты из главы мастер-ветки, поэтому мне не нужно потрудитесь выбрать вишню один за другим.

Ответы [ 3 ]

10 голосов
/ 31 августа 2009

Похоже, что вы можете захотеть сделать эти коммиты на ветке, отличной от 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
1 голос
/ 10 октября 2012

git cherry-pick commit1..commitn

0 голосов
/ 31 августа 2009

Если вы просто хотите обновить свою ветку с помощью master, выполните:

git checkout branch;  git merge master
git rebase origin

Если вы не хотите извлекать все из мастера, вы можете выборочно различать редакции (бу) или использовать ветви для отдельных функций - тогда вы можете просто объединить ветвь функций и в мастер, и в другую ветвь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...