Страницы

Поиск по вопросам

воскресенье, 29 декабря 2019 г.

Как принять pull request частично?

#git #github


Есть два форка, свой и чужой. Во втором в начале несколько нужных мне коммитов, а
далее ненужные. Как смержить к себе только первые n коммитов из другого форка?
    


Ответы

Ответ 1



Для начала, следует получить PR к себе в локальный репозиторий. Если этого не произошло автоматически, это можно сделать по рецепту в справке Гитхаба: git fetch origin pull/{ID}/head Также можно получить чужую ветку локально полностью, для работы с ней: git fetch origin pull/{ID}/head:{local-branch} Потом можно делать как вам сказал ixSci: git merge {commit-SHA} git push Не забудьте также закрыть PR в веб-интерфейсе, чтобы больше не висел.

Ответ 2



Всё просто, находите commit SHA, который Вас интересует, и, находясь в нужной Вам ветке, делает: git merge Это команда вольёт все изменения, которые произошли с тех пор, как Ваша и чужая ветка разошлись, вплоть до нужной фиксации(commit), SHA-идентификатор которой Вы указали.

Ответ 3



Если коммитов мало, то проще всего скачать их в локальный репозиторий для свободы действий: git remote add форк URL_форка git fetch форк ...а далее могу предложить два варианта: Простой Найти нужные SHA-хэши нужных коммитов в журнале ветки: git log форк/ветка cherry-pick по хэшам/SHA в порядке их применения: git checkout локальная_ветка git cherry-pick a1a1a1 b2b2b2 c3c3c3 # ^^^^^^ ^^^^^^ ^^^^^^ префиксы хэшей коммитов Ошибиться тут особо негде, но если вы нервничаете, можете предварительно сделать так: git checkout -b ненужная_ветка локальная_ветка ...и cherry-pick'айте в неё. Когда в ней будет то, что вам (на вид) надо, смерджите её в основную, затребовав "перемотку" (лишняя страховка от нежелательных эффектов): git checkout локальная_ветка git merge --ff-only ненужная_ветка Сложный (но может быть удобнее) Interactive rebase (rebase -i), хорош когда значительная часть их истории общая, и различия легко разгрести: # сделать на ветке с нужными изменениями новую ветку git checkout -b новые_изменения форк/ветка # вычислить отсутствующие коммиты и перенести ветку на верхушку локальная_ветка git rebase -i локальная_ветка новые_изменения Это выведет текстовый редактор со списком коммитов, которые есть в новые_изменения, но в локальная_ветка отсутствуют. Каждая строчка это один коммит: операция (там написано что делает каждая из них, по умолчанию pick то же что и cherry-pick), хэш и описание. После того, как вы закроете редактор, означенный участок ветки новые_изменения будет переписан согласно тому, что вы напишете в редакторе. Убрав соответствующую строчку, вы уберёте коммит (из новые_изменения, но не из исходной форк/ветка). А другие операции вас на данный момент не интересуют. Переписывание истории это опасное дело, поэтому делается в новой ненужной ветке, которую можно грохнуть, если что-то пойдёт не так. И по окончании процедуры у вас должна получиться ветка, которая ответвляется от верхушки вашей локальная_ветка и поверх неё содержит только нужные вам изменения из форка. Можно делать мердж с --ff-only (см. выше). Вообще говоря, делают они примерно одно и то же. Interactive rebase избавляет только от ручного копания в логе.

Ответ 4



Нашёл следующее решение. Подготовил ветку import от общего между форками коммита. и записал изменения на сервер: git branch import 0cc8d855adb457d1860d6e25cb93b6cc75d5a09d git push --all На сайте создал pull request с интересующим форком в новую ветку и принял его. Скачал изменения новой ветки, нашёл интересующие коммиты: git checkout import git pull origin import git log Выполнил слияние до нужного коммита. Тут возможны коллизии, но у меня всё прошло гладко. git checkout master git merge a9219aa49e31bd38a6e00b0c0b17428f3fe67229 Записал изменения на сервер. git push Частичный pull request в чужой форк, можно делать также через создание дополнительной ветки в своём форке.

Комментариев нет:

Отправить комментарий