Git merge фиксирует из определенного выпуска

Сценарий: я разработал проект github и начал работать над ним (после добавления исходного проекта в качестве удаленного, называемого "upstream"). Во время работы над моим форком, несколько выпусков были сделаны для проекта upstream: v1.3-stable, v1.4-stable, v1.5-экспериментальный и т. Д. Теперь мне нужно объединить вышестоящие коммиты с моей веткой master., но ТОЛЬКО до определенного выпуска, например, выпуск v1.4-stable. Какой лучший рабочий процесс для этого сценария?

4 ответа

Решение

Предполагая, что v1.4-stable является тегом на удаленном компьютере, вы можете применить эти изменения к своему локальному репо, вызвав его из ветки, содержащей вашу работу:

git fetch
git rebase --onto $(git rev-list -n1 v1.4-stable)

Rev-list находит идентификатор последнего коммита из v1.4-stable, после чего эти коммиты воспроизводятся и ваша собственная работа аккуратно помещается сверху. Будут конфликты, если пульт ДУ значительно изменился с тех пор, как вы разветвились

Если v1.4-stable является веткой на удаленном компьютере, вы вместо этого захотите сделать

git pull --rebase origin v1.4-stable

Это предполагает, что v1.4-stable является тегом для коммита, указывающего релиз, в основной ветке. Оформить заказ мастера и вытащить последние изменения:

git checkout master
git pull --rebase

Затем перебросьте ветку разработки поверх этого коммита. Убедитесь, что ваше рабочее дерево чистое, а HEAD указывает на вашу ветку dev:

git rebase v.14-stable

Эта команда изменит базу вашей ветви, чтобы включить v.1.4-stable помеченный коммит и все другие выпуски, предшествующие ему.

Перед ребазеном:

o---o---v.1.2---v.1.3---v.1.4---v.1.5-exp  master
     \
      o---o---o  dev

После:

o---o---v.1.2---v.1.3---v.1.4---v.1.5-exp  master
                           \
                            o---o---o  dev

Сначала убедитесь, что вы работаете в специальной ветке для v1.5-experimental,

Во-вторых, сбросьте вашу основную ветку на upstream/v1.4 (убедитесь, что у вас нет работы в процессе: полный сброс уничтожит их)

git fetch upstream
git checkout master
git reset --hard upstream/v1.4
git push -f

Наконец, перебазируйте вашу ветку v1.5-exprimental поверх master (то есть поверх v1.4)

Во-первых, активируйте rerere (в случае, если позже вам придется сделать многократную перебазировку: там будет записано, как вы разрешали подобные конфликты в прошлом)

git config --global rerere.enabled true

Затем сделайте ребаз (повторите ваш коммит из вашей ветки поверх v1.4):

git checkout v1.5-experimental
git rebase master
git push -f

Конфликты, которые вам нужно будет разрешить, должны быть только конфликтами интересов (одновременные изменения выполняются как в исходной, так и в вашей экспериментальной ветке).

git pull --rebase origin v1.4-stable
Другие вопросы по тегам