Сегодня вечером я просматривал запросы на включение изменений (pull request) для всех своих открытых репозиториев. И среди них был один изначально отличный pull request, но он был испорчен автором из-за чьего-то плохого совета. Позже я спросил его: «Не мог бы ты переотправить pull request с изначальными коммитами?» Но на тот момент их уже было не вернуть.
Я решил, что выхода нет, и начал включать код в новую ветку. Я легко мог бы привести его в рабочее состояние, но тогда утратилось бы авторство того человека, которое я хотел оставить за ним. Тогда я подумал, почему бы мне немного не погуглить?
Прочитав несколько ответов на Stack Overflow и немного порывшись я нашёл решение: shgit cherry-pick
.
Как пользоваться shgit cherry-pick
Оказывается, с помощью «cherry-pick» вы на самом деле можете брать только нужные вам коммиты из pull request. Шаги:
1. Заберите ветку к себе на локальную машину. Используя GUI для git или командную строку, это неважно.
2. Вернитесь обратно к ветке, в которую будете вливать. Это делается подобной командой shgit checkout master
.
3. Возьмите в эту ветку нужные вам коммиты с помощью «cherry-pick». Зайдите либо в git log, либо в GitHub UI и выберите уникальные хэши для каждого нужного коммита. А затем выполните команду:
shgit cherry-pick это-очень-длинный-хэш
При этом в вашу текущую ветку будет включён только данный коммит.
4. Отправьте эту ветку как обычно: shgit push origin master
.
Пример
Итак, у меня был pull request с новым компонентом PHPlog
. Я перешёл к pull request в GitHub и забрал ветку (используя командную строку, но мог бы забрать и через GitHub UI).
Затем я выполнил в командной строке: shgit checkout master
. Зашёл в GitHub UI, нашёл нужный мне коммит и скопировал его хэш с помощью маленькой иконки «копировать» рядом с ним в списке коммитов. Далее я выполнил:
shgit cherry-pick это-динный-хэш-скопированный-из-github
После я выложил ветку на GitHub с помощью shgit push origin master
. Готово! И наконец закрыл pull request вручную, указав ссылку на коммит.
Комментарии (1)
А что если нужно наоборот слить из родителя не все новые коммиты а выборочно?