Запрос на перенос слияния в ветку, отличную от ветви по умолчанию, в Github

122

Запрос на перенос входит в мое репо, размещенное на Github. По умолчанию он объединен в masterветку.

Могу ли я изменить ветку, в которую будут объединены изменения?

eoinoc
источник

Ответы:

86

По состоянию на 15.08.2016 GitHub позволяет изменять целевую ветвь pull request через графический интерфейс. Щелкните Editрядом с заголовком, затем выберите ветку в раскрывающемся списке.

Скриншот

Теперь вы можете изменить базовую ветку открытого запроса на вытягивание. После создания запроса на вытягивание вы можете изменить базовую ветвь, чтобы изменения в запросе на извлечение сравнивались с другой ветвью. Изменив базовую ветку исходного запроса на перенос, а не открывая новую с правильной базовой веткой, вы сможете сохранить ценную работу и обсуждение.

maliayas
источник
1
Это должен быть правильный ответ на этот вопрос (т.е. после обновления до GitHub).
stuxnetting
Кажется, этой функции больше нет (по состоянию на 15.02.2018), не так ли? В недавнем запросе на перенос целевая ветка отображается тем же синим шрифтом на светло-синем фоне, что и исходный репозиторий / ветка, а не кнопка.
cgogolin
12
Ах! Оно делает! Сначала нужно щелкнуть «Редактировать» (что не очевидно из приведенного выше снимка экрана). Я не заметил этого. Сожалею.
cgogolin
@cgogolin Спасибо, что указали на это - я тоже был сбит с толку, пока не прочитал ваш комментарий и не нажал кнопку Edit.
mhucka
Github предупреждает, что «Когда вы меняете базовую ветку своего запроса на перенос, некоторые коммиты могут быть удалены с временной шкалы». и «Некоторые коммиты из старой базовой ветки могут быть удалены с временной шкалы». Есть идеи, что это значит?
Matthias Fripp
55

Отправитель может изменить это при отправке запроса на перенос, но как только он его отправит, вы не сможете его изменить.

С другой стороны, вы можете вручную объединить их ветвь и push, что я полурегулярно делаю для ошибочно настроенных запросов на вытягивание.

Вы можете найти hubдрагоценный камень полезным при работе с компонентами запроса на вытягивание.

Этот драгоценный камень завершает ручной процесс, а именно:

  1. Добавьте пульт для вилки в местную кассу.
  2. Принеси тот пульт.
  3. git checkout ${target_branch} && git merge ${remote}/${branch}
  4. git push origin ...
Дэниел Питтман
источник
1
Если я вручную объединю и отправлю, поймет ли Github, что запрос на вытягивание был успешно выполнен? Любые указатели на то, как выполнить слияние из удаленного отдельного репо (вилка)?
eoinoc 04
3
Я не уверен, но не напрямую - потому что изменение не вошло в целевую ветвь, поэтому запрос на вытягивание не завершен, как определено. Вам нужно вручную закрыть его. По поводу указателей см. Отредактированный комментарий.
Дэниел Питтман
Я бы рекомендовал использовать, git merge --no-ff ...как упоминает @GuillermoMansilla в своем ответе.
jjmontes
3
«Как только они его выпустят, вы не сможете его изменить» - с августа 2016 года это уже не так! См. Ответ @maliayas ниже: stackoverflow.com/a/38985999/12484
Джон Шнайдер
1
Я выполнил эту процедуру сегодня (3 марта 2017 г.). Я загрузил запрос на перенос в другую ветку и внес в него несколько дополнительных исправлений, а затем слил его в master. Как только коммиты из запроса на перенос попадают в мастер, GitHub автоматически закрывает запрос на перенос.
Иван Кривяков 05
14

Альтернативой использованию драгоценного камня концентратора, упомянутого в других ответах, является использование командной строки для локального слияния запросов на вытягивание , что позволяет вам:

$ git fetch origin
$ git checkout *target_branch*
$ git merge pr/XXX
$ git push origin *target_branch*

Приведенные выше команды работают напрямую, только если вы сначала добавляете в .git/configфайл следующую строку :

fetch = +refs/pull/*/head:refs/remotes/symbolic_name_origin_or_upstream/pr/*

Это позволяет вам загружать ВСЕ запросы на вытягивание. Поскольку это может быть нежелательно для огромных репозиториев, GitHub изменил инструкции для включения git fetch origin pull/ID/head:BRANCHNAMEсинтаксиса, который позволяет избежать модификации файла конфигурации и загружает только этот единственный запрос на перенос.

Гжегож Адам Ханкевич
источник
8

Хотя вы не можете изменить существующий запрос на перенос, поскольку он не ваш, вы можете легко создать новый, если связанный исходный репозиторий все еще существует - да, даже если он принадлежит кому-то еще.

Перейдите в репозиторий отправителя, затем создайте новый запрос на перенос в его / ее репозитории, используя те же коммиты, но убедитесь, что вы правильно установили правильную целевую ветку.

Затем вернитесь в свой репозиторий и примите новый запрос на перенос. Вуаля!

Декард
источник
Это работает, если они сменили репозиторий? Как гарантировать, что это «одно и то же»?
ragerdl
@ragerdl - Если вы разрабатываете с использованием модели «функция для каждой ветки», вы можете создать PR с веткой против восходящей ветки, и она должна содержать те же коммиты.
geerlingguy 01
2
Единственный способ сделать это прямо на GitHub, без доступа к локальному репо.
копищке
8

В решении Дэниела Питтмана нет ничего плохого, однако я бы рассматривал эти слияния как «без перемотки вперед», то есть изменение шага номер 3 для:

git checkout ${target_branch} && git merge --no-ff ${remote}/${branch}

Благодаря использованию --no-ffисторию будет легче читать. В нем будет четко указано, что были совершены $nкоммиты $branch, и это также упростит вашу жизнь, если вам нужно отменить что-то, сделанное в этой ветке.

Чтобы также ответить на вопрос eoinoc и дать дополнительный совет:

После выполнения слияния ваш git cli предложит вам написать сообщение, обычно появляется общее сообщение, говорящее что-то вроде

Слияние ветки удаленного отслеживания user / their-branch с вашей веткой

Обязательно отредактируйте это сообщение и включите ссылку на номер запроса на вытягивание. То есть: (Предполагая, что номер запроса на вытягивание равен 123)

Слияние ветки удаленного отслеживания user / their-branch с вашей веткой

refs # 123 решение чего угодно ...

Итак, в следующий раз, когда вы посетите страницу вопросов / запросов на github и проверите этот конкретный запрос на перенос, вы увидите свое сообщение со ссылкой для фиксации, где вы выполнили слияние.

Вот скриншот того, что я имею в виду.

введите описание изображения здесь

Гильермо Мансилья
источник
6

Для этого перейдите на домашнюю страницу вашего репозитория, щелкните ветки и измените ветку по умолчанию с master на что-то другое, в моем случае «dev».

После этого, всякий раз, когда кто-то создает запрос на mergeперенос, кнопка автоматически объединяет запрос в «dev», а не в мастер.

введите описание изображения здесь

abbood
источник
Спасибо за исправление опечатки @ Tin Man, я ценю это
abbood 02 авг.16,
4
Нет нужды благодарить нас за корректировку / редактирование. Это то, что мы делаем для сайта. Продолжайте писать хорошие ответы, и этого достаточно.
Железный Человек